首页 文章

Java客户端混合了TCP和UDP功能

提问于
浏览
1

我正在用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连接 .

1 回答

  • 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().

相关问题