下面是详细的Java实现TCP/IP协议的收发数据(服务端)代码实例攻略。
1. TCP/IP协议简介
TCP/IP协议是互联网协议的基础。在互联网的架构中,TCP/IP协议是一种可靠的、面向连接的传输层协议,用于在网络中的不同主机之间传输数据。TCP/IP协议包含了许多子协议,其中比较重要的有TCP协议和IP协议。TCP协议提供了可靠的、面向连接的数据传输服务,而IP协议则负责将数据包从源地址传输到目的地址。
2. TCP/IP协议的服务端实现
2.1. 创建ServerSocket
在Java中,服务端实现TCP/IP协议需要先创建一个ServerSocket对象。ServerSocket对象是用来监听指定网络端口的,等待客户端的TCP连接请求。服务端可以通过以下代码来创建一个ServerSocket对象:
ServerSocket serverSocket = new ServerSocket(port);
其中,port为服务端要监听的端口号。
2.2. 监听客户端连接请求
创建ServerSocket对象后,服务端需要通过ServerSocket对象的accept()方法来监听连接请求,该方法会阻塞当前线程,直到有客户端连接请求到来,才会返回Socket对象。
Socket socket = serverSocket.accept();
2.3. 收发数据
建立连接后,服务端可以通过Socket对象来收发数据。服务端通过Socket的getInputStream()方法获取到输入流,通过getOutputStream()方法获取到输出流。示例代码如下:
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
服务端可以通过读取输入流的数据,在输出流中发送响应数据。具体的收发数据代码如下:
// 收发数据循环
while (true) {
// 读取输入流
byte[] buffer = new byte[1024];
int len = in.read(buffer);
if (len == -1) {
break;
}
// 处理数据
String request = new String(buffer, 0, len);
String response = handleRequest(request);
// 发送响应数据
out.write(response.getBytes());
}
上述代码中,服务器通过in.read(buffer)方法读取输入流的数据,并将读取到的数据转换成字符串。服务器通过handleRequest()方法来处理收到的数据,并将响应数据转换成字节数组,并通过out.write()方法发送给客户端。
2.4. 关闭连接
服务端在处理完客户端连接请求后应该关闭连接,以释放连接所占用的资源。代码如下:
socket.close();
3. 示例说明
3.1. 示例1:实现一个简单的回显服务器
下面是一个简单的回显服务器示例,示例代码如下:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class EchoServer {
private static final int PORT = 8888;
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(PORT);
System.out.println("Server started at port " + PORT);
while (true) {
Socket socket = serverSocket.accept();
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) != -1) {
String request = new String(buffer, 0, len);
String response = "echo: " + request;
out.write(response.getBytes());
}
socket.close();
}
}
}
该示例实现了一个简单的回显服务器,可以对客户端发送的数据进行打印,并将收到的数据回显给客户端。
3.2. 示例2:实现一个简单的文件服务器
下面是一个简单的文件服务器示例,该示例可以将指定目录下的文件发送给客户端。示例代码如下:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class FileServer {
private static final int PORT = 8888;
private static final String ROOT_DIR = "/path/to/root/dir";
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(PORT);
System.out.println("Server started at port " + PORT);
while (true) {
Socket socket = serverSocket.accept();
String request = readRequest(socket.getInputStream()).trim();
System.out.println("Request: " + request);
File file = new File(ROOT_DIR + request);
OutputStream out = socket.getOutputStream();
if (file.exists() && file.isFile()) {
out.write("HTTP/1.0 200 OK\r\n".getBytes());
out.write(("Content-Length: " + file.length() + "\r\n").getBytes());
out.write("\r\n".getBytes());
try (InputStream in = new FileInputStream(file)) {
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
}
} else {
out.write("HTTP/1.0 404 Not Found\r\n".getBytes());
out.write("\r\n".getBytes());
}
socket.close();
}
}
private static String readRequest(InputStream in) throws IOException {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
byte[] data = new byte[1024];
int len;
while ((len = in.read(data)) != -1) {
buffer.write(data, 0, len);
if (len < 1024) {
break;
}
}
return buffer.toString();
}
}
该示例实现了一个简单的文件服务器,客户端可以通过HTTP协议请求服务器上指定目录下的文件。当客户端发送GET请求时,服务器会解析请求路径,并将对应文件的内容发送给客户端。如果文件不存在,则服务器会返回404 Not Found响应。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现TCP/IP协议的收发数据(服务端)代码实例 - Python技术站