我正在用Java编写客户端 - 服务器应用程序,客户端和服务器可以通过UDP套接字与每个套接字进行交互,通过TCP套接字进行乒乓,并且用户(客户端)可以相互聊天通过TCP套接字。
我有两个独立的TCP和UDP线程。我将服务器的TCP和UDP功能融合在一起(简单地启动TCP和UDP线程)。但是我该如何为客户做这件事?
我在这里浏览了以下几页:
1)这个人为两个独立的客户端隔离了TCP和UDP:Java TCP and UDP echo in one server
2)线程Can two applications listen to the same port?表明我不能同时为同一客户端使用TCP和UDP作为相同的端口号。这带给我们......
3)...此页面:Listening for TCP and UDP requests on the same port。但是,它没有提出有关如何实现客户端的任何建议。另外,他有一个线程,而不是客户端(很奇怪)接收来自服务器的数据包并将其发送到服务器。
我一直在网上巡游(特别是谷歌)并且无法想出任何东西。我相信很少有人解决这个问题。
所以,我的问题是:如何在客户端融合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连接。
答案 0 :(得分:3)
我在这里找不到实际的问题,但是:
2)线程可以两个应用程序监听同一个端口吗?建议我不能同时为同一个客户端使用TCP和UDP同一个端口号。
它没有说任何这样的事情。它说你不能将两个 TCP 套接字绑定到同一个端口。无论如何,问题的事实是你可以。
这将我们带到......
3)...此页面:在同一端口上侦听TCP和UDP请求。
并且有一个反例证明了这一点。
但是,它没有说明如何实现客户端。
如?您只需要创建一个TCP或UDP套接字,并将TCP套接字连接到远程IP:端口,或者只使用UDP套接字发送到该IP:端口。我不知道这里有什么问题。
另外,他有一个线程,而不是客户端(很奇怪)接收来自服务器的数据包并将其发送到服务器。
所以线程就是客户端。没什么奇怪的。只需提起代码并将其放入程序即可。 Voila:客户端程序。
如何让服务器同时侦听来自同一客户端的TCP和UDP请求?
为TCP创建一个新的ServerSocket(port)
,为UDP创建一个new DatagramSocket(port)
,并让一个线程监听每个。 TCP线程应循环调用accept()
并在每个接受的Socket;
生成一个新线程,UDP线程可以循环DatagramSocket.receive().