Java 客户端混合 TCP 和 UDP 功能

     2023-04-14     43

关键词:

【中文标题】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编程

 TCP客户端:importjava.io.BufferedReader;importjava.io.InputStreamReader;importjava.io.PrintWriter;importjava.net.Socket;publicclassMyClient{publicstaticvoidmain(String[]args)throwsException{Socketso 查看详情

java网络编程之udp和tcp套接字(代码片段)

文章目录一.网络编程概述二.UDP网络编程1.UDP套接字2.UDP客户端回显服务器程序2.1UDP回显服务器2.2UDP客户端2.3UDP实现查词典的服务器三.TCP网络编程1.TCP套接字2.TCP客户端回显服务器程序2.1TCP回显服务器2.2TCP客户端2.3解决服务器无法... 查看详情

c/s模型:tcp,udp构建客户端和服务器端(bio实现

Java中提供了socket编程来构建客户端和服务器端TCP构建服务器端的步骤:(1)bind:绑定端口号(2)listen:监听客户端的连接请求(3)accept:返回和客户端连接的实例(4)read/write:进行读写操作,也就是和客户端进行交互(5)c... 查看详情

如何使用 UDP 或 TCP (lua / java) 发送压缩数据

...】:2019-08-3123:57:24【问题描述】:我正在制作一个带有lua客户端和Java服务器的服务器。我需要压缩一些数据以减少数据流。为了做到这一点,我使用LibDeflate在客户端压缩数据localconfig=level=1localcompressed 查看详情

tcp和udp网络通讯的区别及实现方式

...基于TCP还是基于UDP的网络通讯编程,都要区分服务器端和客户端,下面以TCP为例,实现客户端和服务器端通讯的实现步骤:TCP服务器端的编写步骤:1.首先,你需要创建一个用于通讯的套接口,一般使用socket调用来实现。这等于... 查看详情

UDP 和 TCP 总是为一个客户端使用相同的 IP?

】UDP和TCP总是为一个客户端使用相同的IP?【英文标题】:UDPandTCPalwaysusesameIPforoneclient?【发布时间】:2015-09-0117:13:57【问题描述】:我为我的在线游戏制作了一个服务器(python,twisted)。从TCP开始,然后使用UDP添加了不断更新... 查看详情

tcp和udp

...可靠性:(1)在使用TCP协议进行数据传输时,往往需要客户端和服务端先建立一个“通道“、且这个通道只能够被客户端和服务端使用,所以TCP传输协议只能面向一对一的连接。(2)为了保证数据传输的 查看详情

tcp和udp套接字编程(java实现)

...UDP不可靠即可!我们来设计一个应用来示范一下,流程:客户机从键盘读取一行字符串,并通 查看详情

tcp和udp的区别

...TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但... 查看详情

在同一端口上侦听 TCP 和 UDP 请求

...布时间】:2011-02-1815:25:05【问题描述】:我正在编写一组客户端/服务器程序根据客户端请求的操作,我使用makeTCP或UDP请求。实现客户端很简单,因为我可以轻松打开任何协议的连接并将请求发送到服务器端。另一方面,在服务... 查看详情

linuxsocket编程示例(最简单的tcp和udp两个例子)

...P的网络编程:    基于连接,在交互过程中,服务器和客户端要保持连接,不能断开。重发一切出错数据、数据验证,保证数据的正确性、完整性和顺序性,    缺点是消耗的资源比较大。  基于UDP的网络编程:    无... 查看详情

网络编程(关于tcp和udp)

...ip地址和端口号skt.listen()#监听链接conn,addr=skt.accept()#接受客户端连接ret=conn.recv(1024)#接受客户端1024个字节print(ret)#打印客户端信息conn.send(b"laowang")#向客户端发送信息conn.close()#关闭客户端接字skt.close()#关闭服务器接字客户端:import... 查看详情

micropythonesp32udp和tcp数据收发通讯综合实例(代码片段)

...网络调试助手UDP和TCP4种通讯模式MicroPythonESP32设备作为TCP客户端MicroPythonESP32设备作为TCP服务端MicroPythonESP32设备作为UDP客户端MicroPythonESP32设备作为UDP服务端根据不同的通讯模式启用对应的代码if__na 查看详情

tcp和udp的区别(代码片段)

...比,TCP有三大核心特性:面向连接。所谓的连接,指的是客户端和服务器的连接,在双方互相通信之前,TCP需要三次握手建立连接,而UDP没有相应建立连接的过程。可靠性。TCP花了非常多的功夫保证连接的可靠,这个可靠性体现... 查看详情

Java TCP 打孔

...发一款在线游戏。在游戏中,需要通过TCP和UDP从服务器向客户端发送数据。实现UDP打孔很容易,但我不太确定如何实现TCP打孔:服务器:ServerSocket监听给定端口1客户端:套接字(对象)使用端口2连接到端口1上的服务器一旦建立... 查看详情

tcp和udp的区别

...不丢包管不着,但是在TCP层,会努力保证可靠性一开始,客户端和服务端都处于CLOSED状态,先是服务端主动监听某个端口,处于LISTEN状态,然后客户端主动发起连接SYN,之后处于SYN-SENT状态,服务端收到发起的连接,返回SYN,并... 查看详情

windowsserver2016-客户端加域端口汇总

简单对客户端加域端口做汇总操作,希望对大家有帮助。之前有对服务端口做汇总,具体请参照:WindowsServer2016-ActiveDirectory域服务端口汇总:http://blog.51cto.com/wenzhongxiang/2088693协议端口端口类型备注TCP/UDP53DNS用户和计算机认证,... 查看详情

网络编程tcp/udp(socket编程)

...cket常见APIsockaddr结构地址转换函数UDP基本概念UDP服务器和客户端框架服务器(Server)客户端(Client)TCP基本概念代码演示(框架)连接过程背景知识源IP地址和目的IP地址在IP数据包 查看详情