博客
关于我
JAVA-Socket通信笔记
阅读量:793 次
发布时间:2023-01-27

本文共 5156 字,大约阅读时间需要 17 分钟。

TCP协议的Java支持是一个非常重要的主题,特别是在实现基于TCP/IP协议的网络通信时。默认TCP协议提供了流套接字,而UDP协议提供了数据报套接字。流套接字基于TCP协议,其特点是面向连接,能够确保数据包的可靠传输,适合需要稳定通信的场景。TCP协议的强度显著低于UDP,因此在需要可靠性和有序通信的业务场景下更为理想。

在Java中,TCP通信主要通过ServerSocketSocket类来实现。ServerSocket用于初始化服务器端的套接字,监听特定的端口是否有客户端连接。服务器程序可以重复调用accept()方法来获取客户端连接,并创建相应的Socket实例。与此同时,服务器套接字也会为每次连接启动一个新的线程,负责与客户端进行通信。这些线程共享服务器的输入输出流,在数据传输完成后,通过close()方法关闭相应的连接。

在客户端程序中,类似地,通过创建Socket实例并连接到服务器端的指定端口来建立连接。客户端和服务器端的Socket实例通过输入输出流进行数据交换。为了方便处理,可以使用BufferedReader包装输入流,使用PrintStream包装输出流,从而实现便捷的数据读写操作。这一点在项目开发中尤为重要,因为它能够简化IO操作的实现和扩展。

以下是服务端代码的核心逻辑:

public class Server {    private static ArrayList
list = new ArrayList<>(); private static final int PORT = 6789; private static ServerSocket serverSocket; private static Socket socket; static void send(String string) { for (Thread_Client thread_Client : list) { thread_Client.send(string); } } public static void main(String[] args) { System.out.println("服务端开始运行..."); try { serverSocket = new ServerSocket(PORT); while (true) { socket = serverSocket.accept(); Thread_Client thread_Client = new Thread_Client(socket); thread_Client.start(); System.out.println("已连接!"); list.add(thread_Client); } } catch (Exception e) { System.out.println("服务端异常1"); } finally { try { socket.close(); serverSocket.close(); } catch (IOException e2) { System.out.println("服务端异常2"); } } }}

线程客户端的实现重点在于读取和发送数据流:

public class Thread_Client extends Thread {    private BufferedReader inputStreamReader;    private PrintStreamออก OutputStream;    private Socket socket;    public Thread_Client(Socket socket) {        this.socket = socket;    }    public void run() {        try {            Get_Set(socket);        } catch (Exception e) {            System.out.println("异常1");        }    }    public void send(String string) {        if (string != null) {            ông.printStackTrace();            printStream.println(string);            printStream.flush();        }    }    private void Get_Set(Socket socket) {        try {            inputStreamReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));            printStream = new PrintStream(socket.getOutputStream());            Boolean.flag = true;            while (flag) {                String string = inputStreamReader.readLine();                if ("".equals(string) || string == null) {                    flag = false;                    return;                } else if ("end".equals(string)) {                    flag = false;                    return;                } else {                    System.out.println("read:" + string);                    Server.send(string);                }            }        } catch (Exception e) {            System.out.println("异常2");        }    }}

客户端程序的实现步骤如下:

public class Client {    private static InputStream bufferedReader;    private static PrintStream printStream;    private static Socket socket;    static void Client_read(Socket socket) {        try {            bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));            String str = bufferedReader.readLine();            if ("".equals(str) || str == null || "end".equals(str)) {                return;            } else {                System.out.println(str);            }        } catch (Exception e) {            System.out.println("异常3");        }    }    public static void main(String[] args) {        try {            socket = new Socket("localhost", 6789);            System.out.println("客户端已连接至服务端!");            Get_Set(socket);        } catch (Exception e) {            System.out.println("客户端异常1");        } finally {            try {                printStream.close();                bufferedReader.close();                socket.close();            } catch (IOException e2) {                System.out.println("客户端异常2");            }        }    }    static void Get_Set(Socket socket) {        try {            bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));            printStream = new PrintStream(socket.getOutputStream());            Scanner keyboard = new Scanner(System.in);            Boolean flag = true;            while (flag) {                Client_read(socket);                System.out.println("请输入信息:");                String shuru = keyboard.nextLine();                if ("".equals(shuru) || shuru == null || "end".equals(shuru)) {                    flag = false;                } else {                    printStream.println(shuru);                    printStream.flush();                }            }        } catch (Exception e) {            System.out.println("异常4");        }    }}

严格的测试环境中运行这些代码,你应该能够看到客户端和服务端之间实现双向通信。在多客户端环境下,服务端会放置所有连接的客户端Thread_Client实例在一个ArrayList中。每当一个客户端发来消息时,都会广播给所有客户端。

经过优化,这些代码不仅符合TCP通信的基本需求,还实现了对多客户端环境的支持。服务器端能够同时与多个客户端保持连接并进行通信,提供了较高的扩展性。这也展示了TCP协议在Java环境下的实际应用场景,对于构建稳定可靠的网络应用具有重要意义。

转载地址:http://vbryk.baihongyu.com/

你可能感兴趣的文章
VTK:可视化之RandomProbe
查看>>
Java时间
查看>>
【编程】C语言入门:1到 100 的所有整数中出现多少个数字9
查看>>
pair的用法
查看>>
javaWeb服务详解(含源代码,测试通过,注释) ——Emp的Dao层
查看>>
echarts 基本图表开发小结
查看>>
TreeSet、TreeMap
查看>>
JVM内存模型
查看>>
可变长度参数
查看>>
GitHub上传时,项目在已有文档时直接push出现错误解决方案
查看>>
嵌入式系统试题库(CSU)
查看>>
00010.02最基础客户信息管理软件(意义类的小项目,练习基础,不涉及数据库)
查看>>
00013.05 字符串比较
查看>>
SpringCloud-Eureka报错 Error creating bean with name解决
查看>>
UE4 错误列表 error码(只记录我遇到的情况,持续添加,未完成)
查看>>
cmd编译.java文件 : java:720: 错误: 编码GBK的不可映射字符 Why ? ? ? ?
查看>>
Android 架构组件 – 让天下没有难做的 App
查看>>
能解决数据可视化大屏需求的3款可视化工具
查看>>
第01问:MySQL 一次 insert 刷几次盘?
查看>>
Android 开发常用的工具类(更新ing)
查看>>