• 暑期JAVA学习(40.2)TCP通信——快速入门


    一、编写客户端代码

    (1)TCP协议

    ●TCP是一种面向连接,安全、可靠的传输数据的协议

    ●传输前,采用“三次握手”方式,点对点通信,是可靠的

    ●在连接中可进行大数据量的传输

    (2)TCP通信模式演示

    在这里插入图片描述
    ●注意:在java中只要是使用java.net.Socket类实现通信,底层即是使用了TCP协议

    (3)Socket构造器

    构造器说明
    public Socket(String host , int port)​创建发送端的Socket对象与服务端连接,参数为服务端程序的ip和端口

    (4)Socket类成员方法

    方法说明
    OutputStream getOutputStream()获得字节输出流对象
    InputStream getInputStream()获得字节输入流对象

    (5)客户端发送消息步骤

    ●需求:客户端实现步骤
    ①创建客户端的Socket对象,请求与服务端的连接。
    ②使用socket对象调用getOutputStream()方法得到字节输出流。
    ③使用字节输出流完成数据的发送。
    ④释放资源:关闭socket管道。

    (6)总结

    ①TCP通信的客户端的代表类是谁?
    ●Socket类
    ●public Socket(String host , int port)

    ②TCP通信如何使用Socket管道发送、接收数据?
    ●OutputStream getOutputStream():获得字节输出流对象(发)
    ●InputStream getInputStream():获得字节输入流对象(收)

    二、编写服务端代码、原理分析

    (1)ServerSocket(服务端)构造器

    构造器说明
    public ServerSocket(int port)注册服务端端口

    (2)ServerSocket类成员方法

    方法说明
    public Socket accept()等待接收客户端的Socket通信连接,连接成功返回Socket对象与客户端建立端到端通信

    (3)服务端实现接收消息步骤

    ●需求:服务端实现步骤
    ①创建ServerSocket对象,注册服务端端口。
    ②调用ServerSocket对象的accept()方法,等待客户端的连接,并得到Socket管道对象。
    ③通过Socket对象调用getInputStream()方法得到字节输入流、完成数据的接收。
    ④释放资源:关闭socket管道

    (4)总结

    ①TCP通信服务端用的代表类?
    ●ServerSocket类,注册端口。
    ●调用accept()方法阻塞等待接收客户端连接。得到Socket对象。

    ②TCP通信的基本原理?
    ●客户端怎么发,服务端就应该怎么收。
    ●客户端如果没有消息,服务端会进入阻塞等待。
    ●Socket一方关闭或者出现异常、对方Socket也会失效或者出错。

    三、案例展示

    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    /**
     目标:完成Socket网络编程入门案例的客户端开发,实现1发1收。
     */
    public class ClientDemo01 {
        public static void main(String[] args) {
            try {
                System.out.println("===客户端启动===");
                // 1、创建Socket通信管道请求有服务端的连接
                // public Socket(String host, int port)
                // 参数一:服务端的IP地址
                // 参数二:服务端的端口
                Socket socket = new Socket(InetAddress.getLocalHost(),9999);
    
                // 2、从socket通信管道中得到一个字节输出流 负责发送数据
                OutputStream os = socket.getOutputStream();
    
                // 3、把低级的字节流包装成打印流
                PrintStream ps = new PrintStream(os);
    
                // 4、发送消息
                ps.println("我是TCP的客户端,我已经与你对接,并发出信息:在吗?");
                ps.flush();
    
                // 关闭资源。注意哦,不用时才关,不要随便关
                // socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    /**
     目标:开发Socket网络编程入门代码的服务端,实现接收消息
     */
    public class ServerDemo02 {
        public static void main(String[] args) {
            try {
                //先启动服务端
                System.out.println("===服务端启动成功===");
                // 1、注册端口
                ServerSocket serverSocket = new ServerSocket(9999);
                // 2、必须调用accept方法:等待接收客户端的Socket连接请求,建立Socket通信管道
                Socket socket = serverSocket.accept();
                // 3、从socket通信管道中得到一个字节输入流
                InputStream is = socket.getInputStream();
                // 4、把字节输入流包装成缓冲字符输入流进行消息的接收
                BufferedReader br = new BufferedReader(new InputStreamReader(is));
                // 5、按照行读取消息
                String msg;
                if ((msg = br.readLine()) != null) {
                    System.out.println(socket.getRemoteSocketAddress() + "说了: " + msg);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
  • 相关阅读:
    The SDK location is inside Studio install location 解决
    北斗导航 | 基于奇偶矢量法的RAIM之SSE探索(附奇偶矢量法源代码)
    每日一题 —— LC. 1752 检查数组是否经排序和轮转得到
    快解析内网穿透助力外贸管理行业应对多种挑战
    DevC++的调试方法
    仿照java的jdk动态代理实现go语言动态代理
    【java毕业设计源码】基于ssm/springboot的果蔬农产品微信小程序商城
    Shiro授权&&Shiro的注解式开发
    vue3项目学习二:搭建项目架构
    里氏代换原则
  • 原文地址:https://blog.csdn.net/xjl243636988/article/details/126151135