JAVA网络编程 ——基于TCP的Socket编程(1)——实现服务器端与客户端的实时对话

第一篇文章,我先介绍以及记录一下我所学的知识点。(总结了一下视频老师讲的东西)

一,HTTP与Socket

1.HTTP:超文本传输协议

特点:客户端发送的请求需要服务器端每次来响应,在请求结束之后主动释放连接,从建立连接到关闭连接称为“一次连接”,所以HTTP是“短连接”。

2.Socket(IP+PORT):是TCP/IP的封装与应用,它不是协议,而是API

特点:客户端与服务器之间一旦建立连接,就可以互相范松消息,也叫对话,但在实际应用中,通信双方经过许多的中间节点,比如,路由器,网关,防火墙,大部分防火墙会默认关闭长时间处于不活跃的状态连接,而是Socket断开。

选择:当服务器主要想客户端推送消息,为了保持客户端与服务器数据的实时与同步,通常会从采用HTTP协议,只要客户端定时向服务器端发送请求,同时也是在询问是否有新的数据,如果有那就传入客户端。

二,TCP/IP模型

1.通信原理图

2.模型图

                                                             

三,基于TCP的网络编程

1.Socket: IP地址+端口号组成了Socket,Socket是网络上运行程序之间双向通信的终结点,是TCP和UDP的基础。

2.JAVA提供的网络功能(可以查看API)

InetAddress:标识IP地址

URL:统一资源定位,通过URL可以直接读取或写入网络上的数据

Sockets:使用TCP协议实现Socket相关的类

Datagram:使用UDP协议。将数据保存在数据包中,通过网络通信。

3.Socket通信模型

### Java TCP网络编程原理 TCP/IP协议栈提供了可靠的面向连接的服务,确保数据包按序无误传输。为了使开发者能够便捷地构建网络应用,在Java中引入了Socket API作为TCP/IP协议的具体实现形式[^1]。 在Java环境中,通过`java.net.Socket`和`java.net.ServerSocket`类来支持TCP通信。前者用于客户端发起连接并其他主机交换信息;后者则驻留在服务器端等待来自不同客户的入站请求,并为每一个新建立的连接实例化一个新的`Socket`对象以便单独处理该客户的消息传递过程[^4]。 当涉及到持续对话的应用场景时,通常会在服务器侧采用多线程技术分别管理各个独立会话中的输入输出流,从而实现在同一时间维持多个并发连接的能力。下面给出一段简单的代码片段展示如何搭建一个具备持久通讯特性的Echo回显型聊天室: #### 服务器端代码示例 ```java package com.example.chatserver; import java.io.*; import java.net.*; public class ChatServer { private static final int PORT = 9898; public static void main(String[] args) throws IOException { try (ServerSocket serverSocket = new ServerSocket(PORT)) { System.out.println("服务器已启动..."); while (true) { Socket clientSocket = serverSocket.accept(); // 启动新的线程处理每个客户端连接 Thread thread = new Thread(new ClientHandler(clientSocket)); thread.start(); } } } static class ClientHandler implements Runnable { private final Socket socket; public ClientHandler(Socket socket) { this.socket = socket; } @Override public void run() { try ( BufferedReader reader = new BufferedReader( new InputStreamReader(socket.getInputStream())); PrintWriter writer = new PrintWriter( new OutputStreamWriter(socket.getOutputStream()), true); ) { String message; do { message = reader.readLine(); // 阻塞直到收到消息 if ("bye".equalsIgnoreCase(message)) break; // 收到结束命令退出循环 System.out.printf("收到来自%s的信息:%s%n", socket.getInetAddress(), message); // 将接收到的内容原样返回给对方 writer.println("ECHO:" + message); } while (!socket.isClosed()); } catch (IOException e) { System.err.println(e.getMessage()); } finally { try { socket.close(); } catch (IOException ignored) {} } } } } ``` 此段程序展示了怎样创建一个监听指定口的服务器,并针对每次成功的握手事件开启子线程去负责具体的IO操作。每当有新用户加入房间后,便会形成一对一式的交互模式——即一方发送任意字符串过去之后马上就能得到相同的回应直至其中任何一方向另一方发出特定终止信号为止[^2]。 #### 客户端代码示例 ```java package com.example.chatserviceclient; import java.io.*; import java.net.*; public class ChatClient { private static final String SERVER_ADDRESS = "localhost"; private static final int PORT = 9898; public static void main(String[] args) throws UnknownHostException, IOException { try (Socket socket = new Socket(SERVER_ADDRESS, PORT); BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(socket.getOutputStream()))) { System.out.print("请输入您的昵称:"); String nickname = stdin.readLine(); // 发送初始化问候语句至服务器表明身份 writer.write(nickname + "\n"); writer.flush(); // 开启接收服务器反馈的新线程 Thread receiverThread = new Thread(() -> receiveMessages(socket)); receiverThread.start(); sendUserInput(stdin, writer); } } private static void sendUserInput(BufferedReader stdin, BufferedWriter writer) throws IOException { String userInput; while ((userInput = stdin.readLine()) != null && !"bye".equals(userInput.toLowerCase())) { writer.write(userInput + "\n"); writer.flush(); } } private static void receiveMessages(Socket socket) { try (BufferedReader reader = new BufferedReader( new InputStreamReader(socket.getInputStream()))) { String response; while ((response = reader.readLine()) != null) { System.out.println(response); } } catch (IOException ex) { System.err.println(ex.getMessage()); } } } ``` 上述例子实现基础版的文字交流平台,其核心在于运用到了阻塞性方法readLine()来进行同步读写控制,使得双方可以在不干扰彼此的情况下轮流发言。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值