Tag: udp

UDP通信需要Java ServerSocket吗?

我在考试中有以下问题: “我们假设你想为客户端使用UDP。你是否需要创建一个新的套接字来管理UDP中的并行连接?为什么或为什么不呢?如果多个客户端连接到该套接字会怎样?” 该问题还引用了一个Java类TCPServer.java ,它创建了ServerSocket,稍后在一个while(true)循环中,它接受连接并为来自用户的传入连接请求创建套接字。 在我看来,TCP Server仅用于TCP连接,因此不可能为UDP客户端使用相同的服务器端代码。

带序列号的UDP

我正在尝试为Java中的类赋值实现可靠的UDP协议。 我已经设法将确认添加到收到的每个数据报包中,但是我在发送的数据报包中实现序列号时遇到了问题。 谁能建议一个简单的方法来实现这个? @EJP我试过实现你刚刚建议的内容。 这是我的代码,直到现在(它仍然非常原始 – 我正在使用命中和尝试方法来实现它) 服务器端 public class TestServer extends Activity { private DatagramSocket serverSocket; Thread serverThread = null; byte[] incomingData; byte[] outgoingData; //int numBytesRead = 0; int ackSent = 0; int numPackRecv = 0; int BUF_SIZE = 1024; String msg = “ACK”; BufferedInputStream data=null; BufferedOutputStream out =null; public static final int SERVERPORT […]

Java:显示客户端IP和端口号

您好我已经写了一个小的UDP服务器程序。 我知道使用以下代码显示主机IP的代码很简单: System.out.println(“Listening Port: ” + serverSocket.getLocalPort()); System.out.println(“IP: ” + myIp.getHostAddress()); 有没有办法显示连接到服务器的客户端的IP和端口号?

Java线程不会在I / O操作上暂停

我的印象是,在Java中,线程会暂停并让其他线程有机会在阻塞I / O操作(如Socket.read()或DataGramsocket.receive())期间做一些工作。 出于某些原因,在我的multithreading网络应用程序中,对receive()的调用导致我所有其他线程都饿死(调用receive()的线程正在成为一个大老板,永远不会放弃控制,从而永远阻止!) 为什么会这样? 我曾经拥有相同的应用程序,但它不是UDP而是基于TCP。 Socket.read()总是暂停线程并允许其他人工作一段时间,如果它被阻塞太久了。 – 额外信息 – 我的自定义线程的TCP版本是这个代码: http : //www.dwgold.com/code/proxy/proxyThread.java.txt 我的新代码(UDP版本)几乎相同,但修改了一点使用UDP方法和样式。 然后我创建了其中两个线程,并在两个线程上调用start。 第一个线程总是阻塞,永远不会让另一个在UDP版本中工作。

每次通过3G连接UDP端口都会改变

我使用基于java的UDP套接字与3G模块通信; 但是每次接收数据包的端口(有时是IP地址)都会发生变化,这是非常令人惊讶的。 这表示我无法为3G模块分配固定的IP /端口并与之通信,但仅依靠传入的数据包来获取目的地信息。 谁能告诉我为什么? 通过3G和普通互联网进行TCP / UDP连接有什么区别?提前感谢!

在JavaFx中编码UDP通信

我在JavaFx中编码UDP通信时遇到问题。 代码能够发送消息但不能接收消息。 我应该在源代码中修改以接收消息? 这是源代码: public class JavaFXApplication10 extends Application { public DatagramSocket receivesocket; public DatagramPacket receivepacket; public DatagramSocket sendsocket; public DatagramPacket sendpacket; public InetSocketAddress remoteAdress; public Label label_IP; public TextField tx_IP; public Label label_SENDPORT; public Label label_RECEIVEPORT; public TextField tx_SENDPORT; public TextField tx_RECEIVEPORT; public Button bt_co; public Button bt_start ; private String message; private XYChart.Series […]

UDP通过Internet。 它是如何工作的?

当我正在编程网络聊天(java,但不应该对问题产生影响),并且想要使用UDP时,我遇到了它无法通过互联网工作的问题。 经过一番研究后,我发现你必须为激活的特定端口进行端口转发。 所以现在谈到我的问题: UDP是否以不可配置的方式在Internet上工作? 例如,如果我要编写整个网络游戏,那么使用UDP是否有意义? 或者我是否要求播放器激活Portforwarding并打开端口等? 什么时候使用UDP呢? 为什么? 我实际上并不理解UDP的全部要点。 对于我的编程观点,我希望有一种方法可以直观地使用它。 与创建DatagramSocket和DatagramPacket ,使用数据和目标配置数据包并通过Internet将其发送出去。 至于我的用户我不希望他们必须配置任何特定的东西,比如打开他们想要使用的确切端口等等。我只是希望他们使用程序(服务器和客户端),它应该工作。

用Java清除数据报缓冲区

所以我从互联网上获得了这个简单的udp客户端/服务器代码,它可以工作。 但是,当我输入比我之前输入的东西短的东西时,我会剩下剩下的字符。 例如,如果我先输入: kitty 然后输入: cat 第二个印刷品如下: catty 我一直在寻找其他有类似问题的人,他们中的大多数似乎都是通过清除字节数组来解决的。 但是,如果我尝试实现他们的答案,它不能解决我的问题。 我需要做什么,并且(可能更重要的是)代码应该去哪里? 这是代码: 客户: import java.io.*; import java.net.*; class UDPClient { public static void main(String args[]) throws Exception { BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); DatagramSocket clientSocket = new DatagramSocket(); InetAddress IPAddress = InetAddress.getByName(“localhost”); byte[] sendData = new byte[1024]; byte[] receiveData = new byte[1024]; String sentence […]

netty 4.xx中的UDP广播

我们需要使用Netty 4.0.0二进制文件在UDP通道上广播一个Object(Pojo)。 在Netty 4.0.0中,它允许我们仅使用DatagramPacket类来发送UDP数据包。 该类仅接受ByteBuf作为参数。 还有其他方法,我们可以通过UDP通道发送Pojo吗? 为进一步澄清,我们做了如下: 初始化UDP通道的设置 ConnectionlessBootstrap udpBootstrap; udpBootstrap.setPipelineFactory(new ChannelPipelineFactory() { public ChannelPipeline getPipeline() throws Exception { return Channels.pipeline( new ObjectEncoder(), new ObjectDecoder(new NettyElementInfo()), new UDPBroadcastHandler()); } }); udpBootstrap.setOption(“broadcast”, true); //datagramChannel = (DatagramChannel) udpBootstrap.bind(new InetSocketAddress(udp_port)); datagramChannel = (DatagramChannel) udpBootstrap.bind(new InetSocketAddress(0)); 这里,NettyElementInfo实现了Serializable和ClassResolver接口。我们试图按如下方式广播这个pojo: channel.write(new NettyElementInfo(), new InetSocketAddress(“255.255.255.255”, 9555)); 在接收端,我们对上面的初始化部分做了同样的事情。但是,在处理程序中获取Pojo如下: NettyElementInfo elementInfo = (NettyElementInfo)e.getMessage(); 这是使用netty 3.5.x成功完成的 […]

如何在Java UDP中获取实际的包大小`byte `数组

这是我上一个问题的后续问题: Java UDP发送 – 逐个接收数据包 正如我在那里指出的那样,基本上,我希望通过UDP逐个接收数据包。 这是一个示例代码: ds = new DatagramSocket(localPort); byte[] buffer1 = new byte[1024]; DatagramPacket packet = new DatagramPacket(buffer1, buffer1.length); ds.receive(packet); Log.d(“UDP-receiver”, packet.getLength() + ” bytes of the actual packet received”); 这里,实际的数据包大小是300字节,但buffer1被分配为1024字节,对我来说,处理buffer1是错误的。 如何从这里获取实际的数据包大小byte[]数组? 而且,更根本的是,为什么我们需要预先分配缓冲区大小以接收Java中的UDP数据包? (node.js不这样做) 有没有办法不预先分配缓冲区大小并直接接收UDP数据包? 谢谢你的想法。