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);
            }
    
  • 相关阅读:
    LINQ分组排序后获取每组第一条记录
    String 中的Trim
    C# Switch优雅写法
    C# 输入指定日期获取当前年的第一天 、当前年的最后天、某月的第一天 、某月的最后一天
    快捷方式 ABP——切换MySQL数据库
    新建立git分支,之后将分支合并到master上
    C# Contains()、 == 和Equals() 比较
    使用TimeSpan 日期与时间拼接
    ActiveReports报表行号
    iOS基础(八)——最新更新方法,每天只提示一次
  • 原文地址:https://www.cnblogs.com/gbhh/p/13768059.html
Copyright © 2011-2022 走看看