Tag: udp

Spring集成多个UDP入站/出站通道

我正在尝试使用Spring引导构建一个部署在多个节点上的模块。 由于特定应用程序的时间限制,我必须使用UDP并且不能依赖Spring提供的易于使用的REST工具。 我必须能够将数据报发送到可能随时间变化的一组节点 (即,集合可能增大或缩小,或者某些节点可能移动到新的ip / port“坐标”)。 沟通必须是单播的 。 我一直在阅读有关TCP和UDP支持TCP和UDP支持的官方文档,但它相当……紧凑,不透明。 org.springframework.integration类上的javadoc也非常简短。 根据我的理解,“入站”通道用于发送数据包,而出站通道用于接收数据包。 到目前为止,我还没能找到入站的以下问题的答案(即“发送”频道,如果我理解的话): – 如何在运行时创建更多频道,将数据包发送到多个目的地? – 如果主机被移动,我应该销毁通道并设置一个新通道,还是可以在运行时更改通道的参数(目标IP /端口)? 对于出站通道(如果我理解的话,“接收”通道),我有与上述相似的问题,如: – 如何在运行时设置多个通道? – 如何在运行时更改现有通道的目标,而不是必须将其拆除并重新设置? – 我应该只打开/关闭“原始”UDP套接字吗?

使用Java中的UDP在网络上发送对象

我还没有找到我所遇到的问题的确切答案,所以无论如何我都会问这个问题,如果我这样做了,事实上,重新提出一个已被问过的问题,我道歉。 我正在为我的Java类做另一个实验任务,对于本周的实验,我必须让UDP服务器通过网络发送一个Message对象,然后我必须让UDP客户端读取该消息。 Message本身只是一个具有String消息和String用户名的Object; 相当随意。 消息是可序列化的。 现在,我遇到的问题是如何实际在DatagramPacket中通过网络发送消息对象? 实际的构造函数让我放入一个字节数组,数组的大小,InetAddress和端口号。 我的最后一个问题是:如何找出数组的大小,以及如何将我的Message转换为要发送的字节?

具有Netty的multithreadingUDP服务器

我正在尝试使用Netty实现UDP服务器。 想法是只绑定一次(因此只创建一个Channel )。 此Channel仅使用一个处理程序进行初始化,该处理程序通过ExecutorService在多个线程之间调度传入数据报的处理。 @Configuration public class SpringConfig { @Autowired private Dispatcher dispatcher; private String host; private int port; @Bean public Bootstrap bootstrap() throws Exception { Bootstrap bootstrap = new Bootstrap() .group(new NioEventLoopGroup(1)) .channel(NioDatagramChannel.class) .option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) .handler(dispatcher); ChannelFuture future = bootstrap.bind(host, port).await(); if(!future.isSuccess()) throw new Exception(String.format(“Fail to bind on [host = %s , port = […]

如何从Java中获取网络数据包数据

在C中,如果你有一个特定类型的数据包,你通常做的是定义一些结构并将char *转换为指向结构的指针。 在此之后,您可以直接以编程方式访问网络数据包中的所有数据字段。 像这样: struct rdp_header { int version; char serverId[20]; }; 获得网络数据包后,您可以快速执行以下操作: char * packet; // receive packet rdp_header * pckt = (rdp_header * packet); printf(“Servername : %20.20s\n”, pckt.serverId); 这种技术对基于UDP的协议非常有用,并且允许使用非常少的代码进行非常快速和非常有效的数据包解析和发送,以及简单的error handling(只需检查数据包的长度)。 有没有相同的,同样快速的方式在java中做同样的事情? 或者你被迫使用基于流的技术?

Java如何解析UDP数据包中的原始数据

我有来自UDP连接的假设数据,它是二进制forms。 它由5个字段组成,大小为25位 他们的补偿如下 1. 0-4 ID 2. 5-10 payload 3. 11-12 status 4. 13-23 location 5. 23-25 checksum 我如何阅读这些数据? DatagramSocket serverSocket = new DatagramSocket(18000); byte[] receiveData = new byte[1024]; while (true) { DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); serverSocket.receive(receivePacket); //not sure how I should be reading the raw binary data back in } 我该如何存储这些数据?

从ANDROID 2.2发送UDP包(HTC欲望)

我有一个局域网,我想从我的机器人(HTC欲望)发送一条更新消息到我的电脑。 他们之间有一个Wlan路由器。 问题是,UPD消息永远不会到达PC。 Android上的代码: package org.example.androidapp; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UDPClientAnd { public void sendUDPMessage(int port) throws java.io.IOException { DatagramSocket socket = new DatagramSocket(); InetAddress serverIP = InetAddress.getByName(“192.168.1.110”); byte[] outData = (“Ping”).getBytes(); DatagramPacket out = new DatagramPacket(outData,outData.length, serverIP,50005); socket.send(out); socket.close(); } } 我在展位两侧选择一个高端口。 Android上的权限是: uses-permission android:name=”android.permission.INTERNET” uses-permission android:name=”android.permission.CHANGE_WIFI_MULTICAST_STATE” 服务器端是PC只是一个简单的接收程序: package org.example.androidapp; […]

如何最小化UDP数据包丢失

我每秒接收~3000个UDP数据包,每个数据包的大小约为200字节。 我写了一个java应用程序,它监听那些UDP数据包并将数据写入文件。 然后,服务器以先前指定的速率发送15000条消息。 写入文件后,它只包含~3500条消息。 使用wireshark我确认我的网络接口收到了所有15000条消息。 之后我尝试更改套接字的缓冲区大小(最初为8496bytes): (java.net.MulticastSocket)socket.setReceiveBufferSize(32*1024); 该更改将保存的消息数量增加到~8000。 我不断将缓冲区大小增加到1MB。 之后,保存的消息数达到~14400。 将缓冲区大小增加到更大的值不会增加保存的消息数。 我想我已达到允许的最大缓冲区大小。 不过,我需要捕获网络接口收到的所有15000条消息。 任何帮助,将不胜感激。 提前致谢。

在Java中忽略您自己的UDP广播

在我的程序中,我发送UDP广播并对它们做出反应。 我需要一种方法来忽略我发出的UDP广播,但是对那些不是来自我的机器的广播做出反应。 我确实尝试使用: if (NetworkInterface.getByInetAddress(packet.getAddress()) != null)但是在某些情况下这会生成IOExceptions(java.net.SocketException:没有网络接口绑定到这样的IP地址) 任何想法? 另外:我的socket上的getInetAddress()抛出NullPointerException

为什么Netty只给我768字节的UDP消息

我已将“receiveBufferSize”选项设置为1024,但由于某种原因,我仍然只在messageReceived中获得768个字节。 数据标题表示正在发送的数据大小为1004。 以下是服务器的初始化代码: public static void main(String[] args) throws Exception { ConnectionlessBootstrap b = new ConnectionlessBootstrap(new NioDatagramChannelFactory()); // Options for a new channel b.setOption(“receiveBufferSize”, 1024); System.out.println(b.getOptions()); b.setPipelineFactory(new ChannelPipelineFactory() { @Override public ChannelPipeline getPipeline() throws Exception { return Channels.pipeline( new MyUDPPacketDecoder(), new StdOutPrintHandler()); } }); b.bind(new InetSocketAddress(myPort)); }

什么是STUN,是否需要端口转发服务器?

我已经对没有基本服务器的p2p通信做了一些研究,并且通过了STUN。 从我所读到的,STUN是NAT“打孔”的一种方式,它不需要将对等端口转发连接到。 这是正确的,打孔究竟是什么意思? 如果它不需要端口转发,它似乎非常脆弱,因为它越过防火墙,我不完全理解STUN的作用。 STUN可以用于Java中的p2p程序或其他语言,例如聊天客户端,它通过TCP / UDP端口向没有基本服务器的对等端发送消息,或者不要求用户端口转发?