我正在用Java编写客户端-服务器应用程序,客户端和服务器可以通过UDP套接字相互交互,通过TCP套接字进行乒乓球交互,用户(客户端)可以通过TCP套接字相互聊天.
我有两个独立的 TCP 和 UDP 线程。我将服务器的 TCP 和 UDP 功能融合在一起(只需启动 TCP 和 UDP 线程)。但是我该如何为客户做到这一点?
我在这里浏览了以下页面:
1)这家伙为两个独立的客户端分离了 TCP 和 UDP:Java TCP 和 UDP 回显在一个服务器中
2)线程两个应用程序可以监听同一个端口吗?建议我不能同时为同一个客户端同时对同一个端口号使用 TCP 和 UDP。这让我们...
3) ...此页面:在同一端口上侦听 TCP 和 UDP 请求。但是,它没有就如何实现客户端提出任何建议。另外,他有一个线程,而不是客户端(奇怪)从服务器接收数据包并将它们发送到服务器。
我一直在浏览网络(尤其是谷歌),但什么都想不出来。我相信很少,如果有的话,已经解决了这个问题。
所以,我的问题是:如何在客户端融合 TCP 和 UDP 功能?我希望服务器能够通过 TCP 和 UDP 套接字与客户端连接,并在客户端之间使用 TCP。我不知道下一步该做什么。
任何帮助表示赞赏。提前致谢。
============================================
这是我当前形式的客户端代码:
String hostName = args[0];
int portNumber = Integer.parseInt(args[1]);
MulticastSocket udpSocket = new MulticastSocket(4446);
InetAddress address = InetAddress.getByName("230.0.0.1");
udpSocket.joinGroup(address);
DatagramPacket packet;
// UDP: get a few quotes
for (int i = 0; i < 5; i++) {
byte[] buf = new byte[256];
packet = new DatagramPacket(buf, buf.length);
udpSocket.receive(packet);
String received = new String(packet.getData(), 0, packet.getLength());
System.out.println("Quote of the Moment: " + received);
}
udpSocket.leaveGroup(address);
udpSocket.close();
// TCP
try (
Socket tcpSocket = new Socket(hostName, portNumber);
PrintWriter out = new PrintWriter(tcpSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(tcpSocket.getInputStream()));
) {
BufferedReader stdIn =
new BufferedReader(new InputStreamReader(System.in));
String fromServer;
String fromUser;
// AS LONG AS server and client are interacting:
while ((fromServer = in.readLine()) != null) {
System.out.println(fromServer);
if (fromServer.equals("Bye."))
break;
fromUser = stdIn.readLine();
if (fromUser != null) {
//System.out.println(fromUser);
out.println(fromUser);
}
}
} catch (UnknownHostException e) {
System.err.println("Unknown host: " + hostName);
System.exit(1);
} catch (IOException e) {
System.err.println("Unable to find I/O for connection to " +
hostName);
System.exit(1);
}
在这种情况下,客户端在 UDP 连接中正确接收数据报,然后按预期切换到 TCP 功能。但是有两个问题:
1)一旦输入正确的输入,服务器就无法退出监听循环(我在“退出”命令中硬编码)。
2) 服务器和客户端在切换到 TCP 之前只会保持一次 UDP 连接。