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);
            }
    
  • 相关阅读:
    UVA.12096 The SetStack Computer ( 好题 栈 STL混合应用)
    HDOJ(HDU).1412 {A} + {B} (STL SET)
    UVA.10474 Where is the Marble ( 排序 二分查找 )
    HDOJ(HDU).1754 I Hate It (ST 单点替换 区间最大值)
    HDOJ(HDU).1166 敌兵布阵 (ST 单点更新 区间求和)
    17 西安
    17 沈阳
    13 南京
    10/11 作战会议
    2019牛客国庆集训派对day5
  • 原文地址:https://www.cnblogs.com/gbhh/p/13768059.html
Copyright © 2011-2022 走看看