网络编程学习笔记(二)基于TCP的Socket编程
基于 TCP 的 Socket 编程概述
TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。基于 TCP 的 Socket 编程是网络编程中常用的方式,它允许不同主机上的程序通过网络进行数据交换。在 Java 中,使用 java.net
包下的 Socket
和 ServerSocket
类可以方便地实现基于 TCP 的 Socket 编程。
示例场景
我们以一个简单的客户端 - 服务器聊天程序为例,服务器端监听特定端口,等待客户端连接,客户端连接到服务器后,双方可以互相发送消息。
服务器端代码示例
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
public static void main(String[] args) {
try (
// 创建一个 ServerSocket 对象,监听 8888 端口
ServerSocket serverSocket = new ServerSocket(8888);
// 等待客户端连接,返回一个 Socket 对象
Socket socket = serverSocket.accept();
// 获取输入流,用于接收客户端发送的消息
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 获取输出流,用于向客户端发送消息
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
// 获取控制台输入流,用于获取服务器端用户输入的消息
BufferedReader consoleIn = new BufferedReader(new InputStreamReader(System.in))
) {
System.out.println("客户端已连接:" + socket.getInetAddress());
String inputLine;
while (true) {
// 接收客户端发送的消息
if ((inputLine = in.readLine()) != null) {
System.out.println("客户端:" + inputLine);
}
// 获取服务器端用户输入的消息
System.out.print("服务器:");
String serverMessage = consoleIn.readLine();
// 向客户端发送消息
out.println(serverMessage);
if ("bye".equalsIgnoreCase(serverMessage)) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
代码解释
- 创建
ServerSocket
:使用ServerSocket
类创建一个服务器套接字,监听指定的端口(这里是 8888)。 - 等待客户端连接:调用
accept()
方法等待客户端连接,该方法会阻塞,直到有客户端连接成功,返回一个Socket
对象。 - 获取输入输出流:通过
Socket
对象的getInputStream()
和getOutputStream()
方法获取输入输出流,用于与客户端进行数据交换。 - 消息交互:使用
BufferedReader
读取客户端发送的消息,使用PrintWriter
向客户端发送消息。
客户端代码示例
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class TCPClient {
public static void main(String[] args) {
try (
// 创建一个 Socket 对象,连接到服务器的 8888 端口
Socket socket = new Socket("localhost", 8888);
// 获取输入流,用于接收服务器发送的消息
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 获取输出流,用于向服务器发送消息
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
// 获取控制台输入流,用于获取客户端用户输入的消息
BufferedReader consoleIn = new BufferedReader(new InputStreamReader(System.in))
) {
String inputLine;
while (true) {
// 获取客户端用户输入的消息
System.out.print("客户端:");
String clientMessage = consoleIn.readLine();
// 向服务器发送消息
out.println(clientMessage);
// 接收服务器发送的消息
if ((inputLine = in.readLine()) != null) {
System.out.println("服务器:" + inputLine);
}
if ("bye".equalsIgnoreCase(clientMessage)) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
代码解释
- 创建
Socket
:使用Socket
类创建一个客户端套接字,连接到指定的服务器地址(这里是localhost
)和端口(8888)。 - 获取输入输出流:同样通过
Socket
对象的getInputStream()
和getOutputStream()
方法获取输入输出流,用于与服务器进行数据交换。 - 消息交互:使用
BufferedReader
读取服务器发送的消息,使用PrintWriter
向服务器发送消息。
运行步骤
- 先运行
TCPServer
类,服务器开始监听 8888 端口。 - 再运行
TCPClient
类,客户端连接到服务器。 - 客户端和服务器可以在控制台输入消息进行交互,输入
bye
可以结束聊天。
通过这个简单的示例,你可以了解基于 TCP 的 Socket 编程的基本原理和实现方式。
分类:
网络编程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
2017-06-19 面试题--如何防止sql注入,使用PreparedStatement的预编译,传入的内容就不会和原来的语句发生任何匹配的关系,达到防止注入的方法