Java网络编程是指开发可以通过网络连接与其他计算机进行通信的Java程序的过程。网络编程中需要通过Socket进行交互,而Socket是一种文件描述符,它使得程序可以从网络中读取和写入数据。
一、创建SocketServer
在Java中,我们可以使用SocketServer创建一个服务端,来接受并处理客户端发送的请求。具体步骤如下:
try {
ServerSocket serverSocket = new ServerSocket(port); // 创建ServerSocket,指定端口号
while (true) {
Socket clientSocket = serverSocket.accept(); // 接收来自客户端的请求
// 处理请求的线程
Thread thread = new Thread(() -> {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
String line;
while ((line = in.readLine()) != null) { // 读取客户端发送的数据
out.println(line); // 将数据回传给客户端
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
clientSocket.close(); // 关闭客户端连接
} catch (IOException e) {
e.printStackTrace();
}
}
});
thread.start(); // 开启线程处理请求
}
} catch (IOException e) {
e.printStackTrace();
}
代码解析:
- 使用ServerSocket类的构造方法创建服务端,并指定监听端口号。
- 我们使用了一个while循环,来一直接受客户端的连接请求,处理请求的线程也是利用了Java中的多线程机制。
- 在while循环中,我们使用serverSocket.accept()方法来接受客户端的连接。
- 当客户端连接成功后,我们为该客户端开启一个线程,处理客户端发送的消息。
- 在线程中,我们使用BufferedReader和PrintWriter来读取客户端发送的消息,并将消息回传给客户端。
二、Socket客户端
在Java网络编程中,我们还要实现一个客户端程序,使得客户端能够向服务端发送请求并得到响应。具体步骤如下:
try {
Socket socket = new Socket("localhost", port); // 连接到服务器
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("Hello, World!"); // 发送数据
String response = in.readLine(); // 读取服务端响应
System.out.println("Server response: " + response); // 打印服务端响应
socket.close(); // 关闭连接
} catch (IOException e) {
e.printStackTrace();
}
代码解析:
- 在客户端中,我们使用Socket类的构造方法连接到服务器,指定服务器的IP地址和端口号。
- 连接成功后,我们可以使用getInputStream()和getOutputStream()方法获取输入输出流,这样就可以进行数据的发送和接收。
- 在该示例中,我们向服务端发送一条消息 “Hello, World!”,然后使用in.readLine()方法来读取服务端的响应消息,并将消息打印在控制台上。
- 最后,我们使用socket.close()方法关闭连接。
三、Socket传输协议
在Java网络编程中,我们可以使用不同的传输协议进行数据的发送和接收。常用的有TCP和UDP协议。
- TCP协议:TCP协议是一种面向连接的协议,使用可靠的数据传输,保证数据的可靠性和顺序性。在TCP协议中,发送数据之前需要先建立连接,然后才能进行数据的传输。
- UDP协议:UDP协议是一种无连接的协议,使用不可靠的数据传输,不保证数据的可靠性和顺序性。在UDP协议中,不需要建立连接,直接发送数据。
在Java中,我们可以使用Socket和ServerSocket类来实现TCP协议的网络编程,使用DatagramSocket类来实现UDP协议的网络编程。
完整代码示例:
这里为大家提供一个完整的SocketServer示例,用于在本地进行测试。
import java.net.*;
import java.io.*;
public class SocketServer {
public static void main(String[] args) {
int portNumber = 7777;
try {
ServerSocket serverSocket = new ServerSocket(portNumber);
System.out.println("Server started listening on port " + portNumber + "...");
while (true) {
Socket clientSocket = serverSocket.accept();
Thread thread = new Thread(() -> {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
String line;
while ((line = in.readLine()) != null) {
System.out.println("Received message: " + line);
out.println(line.toUpperCase());
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
thread.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
这里为大家提供一个完整的SocketClient示例,用于在本地进行测试。
import java.net.*;
import java.io.*;
public class SocketClient {
public static void main(String[] args) {
String hostName = "localhost";
int portNumber = 7777;
try (
Socket socket = new Socket(hostName, portNumber);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
) {
out.println("Hello, World!");
String response = in.readLine();
System.out.println("Server response: " + response);
} catch (UnknownHostException e) {
System.err.println("Don't know about host " + hostName);
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection to " +
hostName);
System.exit(1);
}
}
}
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/185531.html
微信扫一扫
支付宝扫一扫