好的,下面是一个简洁的示例,用于展示如何在Java中使用TCP协议搭建一个简单的客户端。我们会先创建一个简单的服务端,然后再创建一个客户端与之通讯。
步骤1:创建TCP服务端
首先,我们需要创建一个简单的TCP服务端来监听连接并处理来自客户端的数据请求。
```java import java.io.*; import java.net.*; public class SimpleServer { public static void main(String[] args) { int port = 12345; // 服务端监听的端口号 try (ServerSocket serverSocket = new ServerSocket(port)) { System.out.println("服务器启动,等待客户端连接..."); while (true) { try (Socket socket = serverSocket.accept()) { System.out.println("客户端连接成功:" + socket.getInetAddress()); BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter output = new PrintWriter(socket.getOutputStream(), true); String message; while ((message = input.readLine()) != null) { System.out.println("收到客户端消息:" + message); output.println("服务器响应:" + message); } } catch (IOException e) { System.out.println("客户端连接异常:" + e.getMessage()); } } } catch (IOException e) { System.err.println("无法启动服务器:" + e.getMessage()); } } } ```
步骤2:创建TCP客户端
接下来,我们创建一个简单的TCP客户端来连接并与服务端通讯。
```java import java.io.*; import java.net.*; public class SimpleClient { public static void main(String[] args) { String hostname = "localhost"; // 服务端地址 int port = 12345; // 服务端端口号 try (Socket socket = new Socket(hostname, port)) { PrintWriter output = new PrintWriter(socket.getOutputStream(), true); BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream())); BufferedReader consoleInput = new BufferedReader(new InputStreamReader(System.in)); System.out.println("已连接到服务器:" + socket.getInetAddress()); String userInput; while (true) { System.out.print("输入消息:"); userInput = consoleInput.readLine(); if ("exit".equalsIgnoreCase(userInput)) { break; } output.println(userInput); String response = input.readLine(); System.out.println("服务器响应:" + response); } } catch (UnknownHostException e) { System.err.println("未知主机:" + hostname); } catch (IOException e) { System.err.println("I/O 错误:" + e.getMessage()); } } } ```
代码详解
服务端代码详解
1. **ServerSocket**: 创建一个`ServerSocket`对象,并绑定到指定的端口。
2. **accept()**: 这个方法会阻塞,直到有客户端连接进来。
3. **Socket**: 当有客户端连接时,`accept()`方法会返回一个`Socket`对象,通过这个对象可以与客户端进行通讯。
4. **BufferedReader 和 PrintWriter**: 使用这些流类来读取客户端发送的数据以及向客户端发送数据。
服务端会不断地等待新的客户端连接,并为每个连接创建一个新的`Socket`对象进行处理。
客户端代码详解
1. **Socket**: 创建一个`Socket`对象,并连接到指定的主机和端口。
2. **PrintWriter 和 BufferedReader**: 使用这些流类来发送数据到服务器和读取服务器的响应。
3. **控制台输入**: 通过`BufferedReader`读取用户输入,并将其发送到服务器。
客户端程序会读取用户输入,并将其发送到服务器,然后等待并打印服务器的响应。当用户输入“exit”时,客户端程序会退出。
运行步骤
1. **运行服务端**: 先编译并运行`SimpleServer`类。服务器会启动并等待客户端连接。
```sh javac SimpleServer.java java SimpleServer ```
2. **运行客户端**: 编译并运行`SimpleClient`类。客户端会连接到服务器,并可以与之通讯。
```sh javac SimpleClient.java java SimpleClient ```
3. **测试通讯**: 在客户端程序中输入消息并发送,可以看到服务端打印出相应的消息。输入“exit”可以断开连接并退出客户端程序。
通过上述步骤,你可以搭建一个简单的基于TCP协议的客户端和服务端模型。这是网络编程的基础,通过这种方式,你可以实现更加复杂的网络应用程序。