zoukankan      html  css  js  c++  java
  • TCP编程

    概述

    TCP(Transmission Control Protocol)传输控制协议

    是一种面向连接的、可靠的、基于字节流的传输层通信协议。

    模型图片

    img

    img

    使用方法

    客户端

    1. 建立socket连接,需要 ip、端口
    2. 获取输出流 getOutputStream
    3. 发送消息 write
    4. 关闭 流和连接

    服务端

    1. 设置服务端口
    2. 监听socket连接 accept
    3. 获取输入流 getInputStream
    4. 接受消息 ByteArrayOutputStream
    5. 关闭 流和连接

    传输图片或文件

    • 客户端获取文件 FileInputStream
    • 写到缓冲区
    • 服务端接受文件

    常用api

    优化

    。。。

    实例

    客户端

    /**
     * @function 客户端发消息,服务端接收
     */
    public class TcpCilent {
        public static void main(String[] args) throws Exception {
            //需要通信的ip,端口
            InetAddress ip = InetAddress.getByName("localhost");
            int port = 9090;
            //建立socket连接
            Socket socket = new Socket(ip, port);
            //获取输出流
            OutputStream os = socket.getOutputStream();
            os.write("你好 钢镚核恒!".getBytes());
            //通知服务端,我已经发送完毕
            socket.shutdownOutput();
            //接收服务端最后的消息,验证是否接收完全
            InputStream is = socket.getInputStream();
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len;
            while ((len = is.read(buffer)) != -1){
                baos.write(buffer,0,len);
            }
            System.out.println(baos.toString());
            //关闭 流、断开连接等
            os.close();
            socket.close();
        }
    }
    

    服务端

    public class TcpServer {
        public static void main(String[] args) throws IOException {
            //设置服务端口
            ServerSocket serverSocket = new ServerSocket(9090);
            //等待socket连接
            Socket accept = serverSocket.accept();
            //获取输入流
            InputStream is = accept.getInputStream();
            //管道流 专门用于字节数组输入输出的实现类
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            //缓冲区
            byte[] buffer = new byte[1024];
            //数据长度,没有数据时len == -1
            int len;
            while ((len = is.read(buffer)) != -1){
                baos.write(buffer,0,len);
            }
            //防止乱码
            System.out.println(baos.toString());
            //通知客户,我已经接受完毕
            OutputStream os = accept.getOutputStream();
            os.write("接收完毕!".getBytes());
            //关闭 流、断开连接等
            baos.close();
            is.close();
            accept.close();
            serverSocket.close();
        }
    }
    

    传输图片

    文件输入到缓冲区
            FileInputStream fis = new FileInputStream(new File("socket/gangan.jpg"));
            byte[] buffer = new byte[1024];
            int len;
            while ((len = fis.read(buffer)) != -1){
                os.write(buffer,0,len);
            }
    
     文件输出到本地
            FileOutputStream fos = new FileOutputStream(new File("socket/dudu.jpg"));
            byte[] buffer = new byte[1024];
            int len;
            while ((len = is.read(buffer)) != -1){
                fos.write(buffer,0,len);
            }
    
  • 相关阅读:
    餐厅顾客排队,真的是好事吗?
    餐饮生意好不好,选址就占了80%
    资本寒冬是假象,合伙人之争才是关键
    网上开淘宝店,农民就业创富的新门路
    开一家鞋店,就这么简单
    揭秘强开微粒贷骗局 看完你就明白了
    #special-id 匹配ID为special-id的元素
    CSS 选择器 匹配页面所有元素
    详述MySQL事务及ACID特性的实现原理
    $(document).ready()
  • 原文地址:https://www.cnblogs.com/gbhh/p/13768059.html
Copyright © 2011-2022 走看看