• Java中的TCP通信程序


    Java中的TCP通信程序

    TCP可以实现两台计算机之间的数据交互通信的两端,要严格区分客户端与服务端
    两端通信时的步骤:
    1.服务端程序,需要事先启动,等待客户端连接
    2.客户端主动连接服务器端,才能成功通信,服务器端不可以主动链接客户端

    在java中两个类用于实现TCP通信程序:

    1. 客户端: java.net.Socket 类表示。创建 Socket 对象,向服务端发出连接请求,服务端响应请求,两者建 立连接开始通信。
    2. 服务端: java.net.ServerSocket 类表示。创建 ServerSocket 对象,相当于开启一个服务,并等待客户端 的连接。

    Socket类

    socket类:该类实现客户端套接字,套接字是指两台设备之间的端点

    构造方法:
    public Socket(String host,int port):创建套接字对象并将其连接到指定对象的主机上,如果指定的host为NULL,则相当于指定的地址为回送地址
    回送地址
    回送地址(127.x.x.x) 是本机回送地址(Loopback Address),主要用于网络软件测试以及本 地机进程间通信,无论什么程序,一旦使用回送地址发送数据,立即返回,不进行任何网络传输。
    构造举例

    Socket client=new Socket(“127.0.0.1”,666)
    

    成员方法:
    public InputStream getInputStream() : 返回此套接字的输入流。 如果此Scoket具有相关联的通道,则生成的InputStream 的所有操作也关联该通道。 关闭生成的InputStream也将关闭相关的Socket。

    public OutputStream getOutputStream() : 返回此套接字的输出流。 如果此Scoket具有相关联的通道,则生成的OutputStream 的所有操作也关联该通道。 关闭生成的OutputStream也将关闭相关的Socket

    public void close() :关闭此套接字。 一旦一个socket被关闭,它不可再使用。 关闭此socket也将关闭相关的InputStream和OutputStream 。
    public void shutdownOutput() : 禁用此套接字的输出流。 任何先前写出的数据将被发送,随后终止输出流。

    ServerSocket类

    public ServerSocket(int port) :使用该构造方法在创建ServerSocket对象时,就可以将其绑定到一个指 定的端口号上,参数port就是端口号
    构造举例代码如下:

    ServerSocket server=new ServerSocket(666)
    

    成员方法 public Socket accept() :侦听并接受连接,返回一个新的Socket对象,用于和客户端实现通信。
    两个需要明确的事情
    1多个服务器端与客户进行交互,服务器必须明确是和哪个客户端进行交互,这个accept()方法用与获取请求的客户端对象
    2.多个客户端同时与服务器进行交互就需要使用多个io流对象
    服务器是没有io流的,服务器可以获取到请求的客户端对象的scoket,使用每一个客户端Socket中提供的io流对象进行交互。
    服务器端使用客户端的字节输入流读取客户端发送的数据,
    服务器端使用客户端的字节输出流给客户端回写数据
    即服务器端使用客户端流与客户端交互
    好比生活中的我请客你买单
    在这里插入图片描述

    简单的TCP网络程序图解

    1. 【服务端】启动,创建ServerSocket对象,等待连接。 Socket client = new Socket("127.0.0.1", 6666); ServerSocket server = new ServerSocket(6666);
    2. 【客户端】启动,创建Socket对象,请求连接。
    3. 【服务端】接收连接,调用accept方法,并返回一个Socket对象
    4. 【客户端】Socket对象,获取OutputStream,向服务端写出数据
    5. 【服务端】Scoket对象,获取InputStream,读取客户端发送的数据。
    6. 【服务端】Socket对象,获取OutputStream,向客户端回写数据。
    7. 【客户端】Scoket对象,获取InputStream,解析回写数据
    8. 【客户端】释放资源,断开连接。

    在这里插入图片描述

    该方法 会一直阻塞直到建立连接。

    下面写一段简单的客户端与服务器端交互的代码
    服务器端代码

    package Socket;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    public class Server {
        public static void main(String[] args) throws IOException {
            System.out.println("服务器启动等待连接:");
            //创建服务器端对象
            ServerSocket serverSocket = new ServerSocket(8888);
            //使用accept方法接受socket对象
            Socket accept = serverSocket.accept();
            //通过socket获取输入流
            InputStream inputStream = accept.getInputStream();
            //会不会阻塞
            System.out.println("XXXXXXXXXXXXXXXXX");
            byte[] bytes = new byte[1024];
            int read = inputStream.read(bytes);
            //通过字节数组生成字符串
            String s = new String(bytes,0,read);
            //输出
            System.out.println(s);
            //向客户端返回信息
            OutputStream outputStream = accept.getOutputStream();
            //返回内容
            outputStream.write("内容已经收到".getBytes());
            //关闭资源
            inputStream.close();
            serverSocket.close();
        }
    }
    

    客户端代码

    package Socket;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    public class Client {
        public static void main(String[] args) throws IOException {
            //创建Socket对象
            Socket socket = new Socket("127.0.0.1", 8888);
            //获取输出流
            OutputStream outputStream = socket.getOutputStream();
            //给服务端发送消息
            outputStream.write("你好".getBytes());
            //创建输入流对象
            InputStream inputStream = socket.getInputStream();
            //创建读取的数组
            byte[] bytes = new byte[1024];
            //获取字节数组的长度
            int read = inputStream.read(bytes);
            //输出结果
            System.out.println(new String(bytes,0,read));
            //关闭流
            outputStream.close();
            //关闭Socket对象
            socket.close();
        }
    }
    

    结果
    服务器端
    在这里插入图片描述

    客户端
    在这里插入图片描述

    以上就是Java中的TCP通信程序的一些基本操作,喜欢我的可以点赞收藏一波,我会不定期跟新文章,喜欢我的可以关注呀
    在这里插入图片描述

  • 相关阅读:
    001:大盗阿福
    1183 编辑距离(51NOD)(dp)
    1134 最长递增子序列(容易TLE)
    1181 质数中的质数(质数筛法)(51NOD基础)
    列表行拖拽效果
    10个提升iOS开发效率的必用工具
    无需转化直接使用ESD映像文件安装系统简明教程
    Objective-C中变量采用@property的各个属性值的含义
    struts接收参数方式
    c# 执行js的方法
  • 原文地址:https://www.cnblogs.com/pjhaymy/p/13354588.html
Copyright © 2020-2023  润新知