当前位置: 首页 > 知识库问答 >
问题:

Java客户端混合TCP和UDP功能

公西英叡
2023-03-14

我正在用Java编写一个客户端-服务器应用程序,客户端和服务器可以通过UDP套接字进行交互,通过TCP套接字进行乒乓交互,用户(客户端)可以通过TCP套接字进行聊天。

我有两个独立的TCP和UDP线程。我将服务器的TCP和UDP功能融合在一起(只需启动TCP和UDP线程)。但我该如何为客户做这件事呢?

我在这里浏览了以下几页:

1)这个家伙为两个独立的客户端分离了TCP和UDP:一个服务器中的Java TCP和UDP echo

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)一旦输入了正确的输入(在“exit”命令中硬编码),服务器就无法退出监听循环。

2)服务器和客户端在切换到TCP之前只保持一次UDP连接。

共有1个答案

公羊涛
2023-03-14

我很难找到一个真正的问题,但是:

2)线程可以让两个应用程序侦听同一个端口吗?建议我不能对同一个客户端同时对同一个端口号同时使用TCP和UDP。

上面没写任何这样的东西。它规定不能将两个TCP套接字绑定到同一端口。无论如何,事实是你可以。

所以我们要...

3)...本页:侦听同一端口上的TCP和UDP请求。

有一个反例证明了这一点。

但是,它并没有就如何实现客户端提出任何建议。

比如?您只需要创建一个TCP或UDP套接字,并且要么将TCP套接字连接到远程ip:端口,要么只使用UDP套接字发送到那个ip:端口。我看不出这里有什么问题。

只需为TCP创建一个新的ServerSocket(port)和为UDP创建一个新的DatagramSocket(port)并让一个线程侦听每一个。TCP线程应循环调用Accept()并为每个接受的套接字生成一个新线程;UDP线程只能循环DataGramSocket.Receive()。

 类似资料:
  • Coroutine\Client提供了TCP、UDP、unixSocket传输协议的Socket客户端封装代码,使用时仅需new Swoole\Coroutine\Client即可。 实现原理 Coroutine\Client的所有涉及网络请求的方法,Swoole都会进行协程调度,业务层无需感知 使用方法和Client同步模式方法完全一致 connect超时设置同时作用于Connect和Recv、

  • 同样,如果客户机已经创建了一个IPv6套接字(因为getaddrinfo()说它是有效的),然后调用getaddrinfo()来查找服务器的地址,那么如果它只得到一个IPv4结果呢?我知道我可以告诉getaddrinfo()只给出IPv6结果,但是如果服务器没有IPv6地址怎么办?UDP客户端是否应该关闭并重新创建其套接字以匹配服务器地址格式?还是保证我能得到我要求的地址格式? (我欢迎任何能回答

  • 所谓客户端混合,指的是 Vue 在浏览器端接管由服务端发送的静态 HTML,使其变为由 Vue 管理的动态 DOM 的过程。 在entry-client.js中,我们用下面这行挂载 (mount) 应用程序: // 这里假定 App.vue template 根元素的 `id="app"` app.$mount('#app') 由于服务器已经渲染好了 HTML,我们显然无需将其丢弃再重新创建所

  • 本文向大家介绍Android编程实现TCP、UDP客户端通信功能示例,包括了Android编程实现TCP、UDP客户端通信功能示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android编程实现TCP、UDP客户端通信功能。分享给大家供大家参考,具体如下: 在进行Android开发的过程中,免不了,要开发TCP/UDP通讯的程序,下面这两段代码,分别介绍了TCP/UCP通过的一个实例

  • udp 客户端 udp 客户端 源码/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * *//* * 程序清单:udp 客户端 * * 这是一个 udp 客户端的例程 * 导出 u

  • 我正在为一个大学项目创建一个游戏服务器,所以我不使用任何库/框架。 经过大量研究后,我希望客户端和服务器使用UDP协议进行大量通信,例如角色移动和计时器,因为这方面的可靠性并不重要,丢失的数据包可以得到补偿。 但是,我还想将TCP协议用于游戏的其他方面,例如操作和事件,在这些方面,信息到达客户端是至关重要的。 我的问题是,我对使用UDP不太了解,在Java,从我的理解来看,它完全不同于仅仅为TCP