TCP通信程序

本文介绍了TCP通信的基本原理,包括其面向连接、可靠性的特点。详细讲解了Java中Socket和ServerSocket类的使用,展示了客户端和服务器端的简单通信示例。此外,还提供了一个上传视频到服务器的完整案例,演示了文件通过TCP进行传输的过程。
摘要由CSDN通过智能技术生成

TCP通信原理

  • 概述
    传输控制协议TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它在通信两端各建立一个Socket对象,从而在通信两端形成网络虚拟链路,两端的程序通过虚拟链路通信。

  • java提供的基于TCP协议的 Socket 类
    客户端:Socket
    服务器:ServerSocket

Socket 与 ServerSocket

  • Socket

    构造方法描述
    Socket​(String host, int port)创建流套接字并将其连接到指定主机上的指定端口号
    Socket​(InetAddress address, int port)创建流套接字并将其连接到指定IP地址处的指定端口号
    常用方法描述
    OutputStream getOutputStream()返回此套接字的输出流
    InputStream getInputStream()返回此套接字的输入流
    void close()关闭此套接字
  • ServerSocket

    构造方法描述
    ServerSocket​(int port)创建绑定到指定端口的服务器套接字
    常用方法描述
    Socket accept()侦听对此套接字的连接并获取它

客户端 与 服务器

  • 客户端

    public class TcpSocket {
        public static void main(String[] args) throws IOException {
            //创建客户端收发器,并将其连接到指定主机上的指定端口
            Socket socket = new Socket("192.168.200.10",12300);
            //获得输出流,写数据
            OutputStream os = socket.getOutputStream();
            os.write("Hello TCP".getBytes());
            //关闭收发器
            socket.close();
        }
    }
    
  • 服务器

    public class TcpServerSocket {
        public static void main(String[] args)throws IOException {
            //创建服务器收发器,并绑定到指定端口
            ServerSocket ss = new ServerSocket(12300);
            //侦听对此套接字的连接并接受它
            Socket s = ss.accept();
            //获得输入流,读书节
            InputStream is = s.getInputStream();
            byte[] bs = new byte[1024];
            is.read(bs);
            //打印数据
            System.out.println(new String(bs));
            //释放资源
            ss.close();
        }
    }
    ---*---
    输出结果:
    Hello TCP
    

    注意:

    1. 需要先启动服务器端,只能由客户端连接服务器端。客户端和服务器会建立一个逻辑连接,这个连接包含一个字节IO对象,客户端和服务器使用IO对象进行通信。(一次数据交互需要4个IO流对象)
    2. 当服务器端使用 accept() 方法侦听连接过来的客户端对象(Socket)并获取该Socket。服务器使用获取到的 Socket 对象使用客户端的流和客户端通信。
  • 案例:上传视频到服务器

    //服务器
    public class TcpServerSocket {
        public static void main(String[] args)throws IOException {
            ServerSocket ss = new ServerSocket(12340);
            while (true) {
                Socket s = ss.accept();
                //开启线程处理客户端上传
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        int conut = 0;
                        File f = new File("E:\\临时\\ls\\测试[" + conut + "].mp4");
                        while (f.exists()) {
                            conut++;
                            f = new File("E:\\临时\\ls\\测试[" + conut + "].mp4");
                        }
                        try (
                            //接收文件客户端文件
                            BufferedInputStream bis =
                                    new BufferedInputStream(s.getInputStream());
                            //写入本地磁盘的流
                            BufferedOutputStream bos =
                                    new BufferedOutputStream(new FileOutputStream(f));
                            BufferedWriter bw =
                                    new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
                            ){
                            //读写
                            byte[] bs = new byte[1024];
                            int len;
                            while ((len = bis.read(bs)) != -1) {
                                bos.write(bs,0,len);
                            }
                            //给出反馈
                            bw.write("上传成功!");
                        }catch (IOException e){
                            e.printStackTrace();
                        }
                    }//run结束
                }).start();
            }//while结束
        }
    }
    
    //客户端
    public class TcpSocket {
        public static void main(String[] args) throws IOException {
    
            Socket s = new Socket("127.0.0.1", 12340);
            //读本地文件的流
            File f = new File("H:\\h正好的文件夹\\抖音广告\\完成导出\\夜曲-抖音推广-.mp4");
            BufferedInputStream bis =
                    new BufferedInputStream(new FileInputStream(f));
            //发送到服务器的流
            BufferedOutputStream bos =
                    new BufferedOutputStream(s.getOutputStream());
            //读写
            byte[] bs = new byte[1024];
            int len;
            while ((len = bis.read(bs)) != -1) {
                bos.write(bs,0,len);
            }
            //发送完毕
            s.shutdownOutput();
            //接收反馈
            byte[] bs1 = new byte[1024];
            BufferedReader br =
                    new BufferedReader(new InputStreamReader(s.getInputStream()));
            String s1 = br.readLine();
            System.out.println(s1);
            //关闭资源
            bis.close();
            s.close();
        }
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值