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);
        }
原文地址:https://www.cnblogs.com/gbhh/p/13768059.html