Java 客户端混合 TCP 和 UDP 功能
Posted
技术标签:
【中文标题】Java 客户端混合 TCP 和 UDP 功能【英文标题】:Java client mixed TCP-and-UDP functionality 【发布时间】:2013-11-23 17:55:37 【问题描述】:我正在用 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。但是,它没有就如何实现客户端提出任何建议。另外,他有一个线程,而不是客户端(奇怪)从服务器接收数据包并将它们发送到服务器。
我一直在浏览网络(尤其是 Google),但什么都想不出来。我相信很少有人(如果有的话)解决了这个问题。
所以,我的问题是:如何在客户端中融合 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 连接。
【问题讨论】:
您为 (2) 引用的线程并没有说您不能在我能看到的任何地方为 TCP 和 UDP 使用相同的端口。它甚至不是关于那个。任何确实说这是错误的消息来源。你可以。你的问题的其余部分太宽泛了,有太多的代码需要清楚地回答。请将其缩小到可管理的大小和可以回答的问题。 @EJP : (2) 明确指出“对于 TCP,不可以。一次只能让一个应用程序监听一个端口。”将很快调整我的帖子大小。另外,如果问题太宽泛,需要说明什么? 它明确not 声明您不能同时将 TCP 和 UDP 套接字绑定到同一个端口。我向您保证这是可能的,当您实际尝试时,您会亲眼看到。 @EJP :无论如何,这次我提供了一大块代码(客户端代码)而不是四个。鉴于该代码,我怎样才能让服务器同时监听来自同一个客户端的 TCP 和 UDP 请求? 【参考方案1】:我无法确定此处的实际问题,但是:
2) 线程两个应用程序可以监听同一个端口吗?建议我不能同时为同一个客户端同时对同一个端口号使用 TCP 和 UDP。
它没有说任何这样的事情。它说您不能将两个 TCP 套接字绑定到同一个端口。无论如何,事实是你可以。
这让我们...
3) ...此页面:在同一端口上侦听 TCP 和 UDP 请求。
还有一个反例可以证明这一点。
但是,它没有就如何实现客户端提出任何建议。
比如?您只需要创建一个 TCP 或 UDP 套接字,然后将 TCP 套接字连接到远程 IP:端口,或者只使用 UDP 套接字发送到该 IP:端口。我看不出这里有什么问题。
另外,他有一个线程,而不是一个客户端(奇怪)从服务器接收数据包并将它们发送到服务器。
所以线程是客户端。这没什么奇怪的。只需提取代码并将其放入程序中即可。 瞧:一个客户端程序。
如何让服务器同时监听来自同一个客户端的 TCP 和 UDP 请求?
只需为 TCP 创建一个新的ServerSocket(port)
,为 UDP 创建一个new DatagramSocket(port)
,并让每个线程监听。 TCP 线程应该循环调用accept()
并为每个接受的Socket;
生成一个新线程,UDP 线程可以在DatagramSocket.receive().
上循环
【讨论】:
谢谢。我会遵循你在这里给出的最后一条建议。抱歉,我是新手,所以我正在学习。以上是关于Java 客户端混合 TCP 和 UDP 功能的主要内容,如果未能解决你的问题,请参考以下文章