【发布时间】:2023-03-28 08:29:01
【问题描述】:
我有一个需要使用 TCP 和 UDP 传输文件的网络编程主题。如果 TCP 发送失败,则会执行 UDP。我已经构建了每个部分,但我不确定如何同时运行 TCP 和 UDP 的服务器才能接收两种协议的数据(我的问题是在主服务器中启动 2 个服务器,因为我有作为接口)。希望大家帮忙。
【问题讨论】:
标签: java networking server tcp udp
我有一个需要使用 TCP 和 UDP 传输文件的网络编程主题。如果 TCP 发送失败,则会执行 UDP。我已经构建了每个部分,但我不确定如何同时运行 TCP 和 UDP 的服务器才能接收两种协议的数据(我的问题是在主服务器中启动 2 个服务器,因为我有作为接口)。希望大家帮忙。
【问题讨论】:
标签: java networking server tcp udp
在一种情况下您需要打开一个 ServerSocket,在另一种情况下需要打开一个 DatagramSocket。应该可以并行打开它们,这意味着您可以在不同线程上并行运行两个实现。
【讨论】:
如果您想在同一台机器上运行 TCP 和 UDP 服务器,您将需要使用不同的端口。然后你可以启动两个不同的线程,每个服务器一个:
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.stream.Collectors;
public class TcpUdpServer {
private final static int UDP_PORT = 8100;
private final static int TCP_PORT = 8200;
public static void main(String[] args) {
new Thread(() -> executeTcpServer()).start();
new Thread(() -> executeUdpServer()).start();
}
public static void executeTcpServer() {
try (ServerSocket serverSocket = new ServerSocket(TCP_PORT)) {
while (true) {
System.out.println("waiting for TCP connection...");
// Blocks until a connection is made
final Socket socket = serverSocket.accept();
final InputStream inputStream = socket.getInputStream();
String text = new BufferedReader(
new InputStreamReader(inputStream, StandardCharsets.UTF_8))
.lines()
.collect(Collectors.joining("\n"));
System.out.println(text);
}
} catch (Exception exception) {
exception.printStackTrace();
}
}
public static void executeUdpServer() {
try (DatagramSocket socket = new DatagramSocket(UDP_PORT)) {
while (true) {
byte[] packetBuffer = new byte[2024];
final DatagramPacket packet = new DatagramPacket(packetBuffer, packetBuffer.length);
System.out.println("waiting for UDP packet...");
// Blocks until a packet is received
socket.receive(packet);
final String receivedPacket = new String(packet.getData()).trim();
System.out.println(receivedPacket);
}
} catch (Exception exception) {
exception.printStackTrace();
}
}
}
【讨论】: