Tag: udp

Java:multithreading和UDP套接字编程

我是Java中multithreading和套接字编程的新手。 我想知道实现2个线程的最佳方法是什么 – 一个用于接收套接字,另一个用于发送套接字。 如果我想做的事听起来很荒谬,请告诉我原因! 该代码很大程度上受到Sun在线教程的启发。我想使用多播套接字,以便我可以使用多播组。 class Server extends Thread { static protected MulticastSocket socket = null; protected BufferedReader in = null; public InetAddress group; private static class Receive implements Runnable { public void run() { try { byte[] buf = new byte[256]; DatagramPacket pkt = new DatagramPacket(buf,buf.length); socket.receive(pkt); String received = new String(pkt.getData(),0,pkt.getLength()); System.out.println(“From […]

UDP打孔Java示例

我希望在具有静态IP的服务器的帮助下,使用两个客户端进行UDP Hole Punching。 服务器在端口7070和7071上等待两个客户端。之后,它会相互发送IP地址和端口。 这部分工作正常。 但是我无法在两个客户之间建立通信。 我在不同的Wifi网络和3G移动网络中尝试了代码。 客户端程序抛出IO-Exception“无路由到主机”。 客户端代码用于两个客户端。 一旦用7070端口执行,一次用7071执行。 您认为我是否正确实施了UDP打孔概念? 有什么想法让它发挥作用? 这是服务器代码,然后是客户端代码。 谢谢你的帮助。 服务器代码: public class UDPHolePunchingServer { public static void main(String args[]) throws Exception { // Waiting for Connection of Client1 on Port 7070 // //////////////////////////////////////////////// // open serverSocket on Port 7070 DatagramSocket serverSocket1 = new DatagramSocket(7070); System.out.println(“Waiting for Client 1 on Port […]

每个UDP数据报的Netty不同管道

我们已经有一个已经在TCP / IP中实现的服务器,但我们现在要求协议也支持UDP。 发送的每个UDP数据报都包含我需要解码的所有内容,因此它是一个非常简单的回复和响应系统,数据报中的数据由换行符分隔。 启动服务器时引导程序的代码如下所示: //SETUP UDP SERVER DatagramChannelFactory udpFactory = new NioDatagramChannelFactory(Executors.newCachedThreadPool()); ConnectionlessBootstrap udpBootstrap = new ConnectionlessBootstrap(udpFactory); udpBootstrap.setOption(“sendBufferSize”, 65536); udpBootstrap.setOption(“receiveBufferSize”, 65536); udpBootstrap.setOption(“receiveBufferSizePredictorFactory”, new AdaptiveReceiveBufferSizePredictorFactory()); udpBootstrap.setOption(“broadcast”, “true”); udpBootstrap.setPipelineFactory(new ServerPipeLineFactoryUDP()); udpBootstrap.bind(new InetSocketAddress(hostIp, 4000)); 管道代码是: class ServerPipeLineFactoryUDP implements ChannelPipelineFactory { private final static ExecutionHandler EXECUTION_HANDLER = new ExecutionHandler(new OrderedMemoryAwareThreadPoolExecutor(ScorpionFMS.THREAD_POOL_COUNT, 0, 0)); public ServerPipeLineFactoryUDP() { } @Override public […]

同步客户端 – 服务器游戏状态

我正在制作一个客户端服务器MMO风格的游戏。 到目前为止,我已经设置了框架,以便服务器和客户端相互交互以提供状态更新。 服务器维护游戏状态并定期计算下一个状态,然后每隔一段时间(每n毫秒)将其发送给所有客户端。 用户可以在客户端查看和响应该新状态。 然后将这些操作发送回服务器进行处理并发送出去进行下一次更新。 显而易见的问题是这些更新需要时间在服务器和客户端之间传输。 如果客户端行动攻击敌人,那么当更新回到服务器时,服务器很可能已经使游戏状态进展得足够远,以至于敌人不再在同一地点,并且超出范围。 为了解决这个问题,我一直试图找到一个好的解决方案。 我看了下面的内容,它帮助了一些,但并不完全: Mutli Player Game同步 。 我已经得出结论,我不仅可以传输游戏的当前状态,而且可以传输其他信息,例如方向(或AI运动的目标位置)和速度。 从这一点来看,我有一部分需要在客户端“猜测”实际状态是什么(如服务器所见),通过将游戏状态推进到未来n毫秒。 问题是确定进展状态的时间量,因为它将取决于服务器和客户端之间的滞后时间,这可能会有很大差异。 此外,我应该将游戏状态推进到客户端查看时的状态(即仅考虑更新到达客户端所花费的时间),还是应该将其推进到足够远以便在发送响应时回到服务器,到那时它将是正确的状态(来往于旅程的帐户)。 有什么建议么? 重申: 1)计算发送和接收之间的时间量的最佳方法是什么? 2)我是否应该将客户端状态推进到足以计入整个往返时间,或者只是将数据从服务器提供给客户端所需的时间? 编辑:到目前为止我想出了什么 由于我已经有许多数据包在客户端和服务器之间来回传递,我不想在必要时添加到该流量。 目前,客户端向服务器发送状态更新数据包(UDP)〜150毫秒(仅在某些内容发生变化时),然后由服务器接收和处理这些数据包。 目前,服务器不会对这些数据包发送任何响应。 首先,我将让客户尝试估计他们的滞后时间。 我将它默认为50至100毫秒。 我建议大约每2秒(每个客户端)服务器将立即响应其中一个数据包,在特殊的定时更新数据包中发回数据包索引。 如果客户端收到定时数据包,它将使用索引来计算此数据包发送的时间,然后使用数据包之间的时间作为新的延迟时间。 这应该使客户合理地保持最新的延迟,同时避免过多的网络流量。 声音可以接受,还是有更好的方法? 这仍然没有回答问题二。

在将数据报转换为Java中的字节数组之后解析它

我正在尝试解析我将在套接字上收到的DatagramPacket。 我知道我将收到的数据包的格式,这是一个DHCPREQUEST数据包,但我认为这不重要。 为简单起见,我们只考虑前六个字段: 第一个字段是“操作码”,它是1个字节。 第二个字段是“硬件类型”,它是1个字节。 三,“硬件地址长度”,1个字节。 第四,“跳”,1个字节。 五,“事务标识符xid”,4个字节。 第六,“秒”,2个字节。 收到数据包后,我的方法是将其转换为字节数组。 DatagramPacket request = new DatagramPacket(new byte[1024], 1024); socket.receive(request); byte[] buf = request.getData(); 此时,数据包作为一系列字节存储在字节数组buf中。 既然我知道这个字节序列的结构是什么,我该如何解析呢? 单字节字段很简单,但多位字段怎么样? 例如,如何提取字节4到7,并将它们存储在名为xid的变量中? 我可以手动将每个字节放入一个数组: byte[] xid = new byte[4]; xid[0] = buf[4]; xid[1] = buf[5]; xid[2] = buf[6]; xid[3] = buf[7]; 但这对于数百字节长的字段来说只是单调乏味而且不切实际。 给定偏移和长度的String类可以解析子字符串; Java中的字节数组有类似的方法吗? 或者我在某种程度上让自己变得困难?

非阻塞UDP I / O与阻止Java中的UDP I / O.

NIO中的非阻塞TCP / IP SocketChannel和Selector帮助我处理许multithreading数量少的TCP / IP连接。 但UDP DatagramChannels怎么样? (我必须承认我对UDP不是很熟悉。) 即使DatagramChannel未在阻塞模式下运行,UDP发送操作似乎也不会阻塞。 是否存在DatagramSocket.send(DatagramPacket)因拥塞或类似情况而阻塞的情况? 如果存在这样的情况以及生产环境中可能出现的情况,我真的很好奇。 如果DatagramSocket.send(DatagramPacket)实际上没有阻塞,并且我不打算使用连接的DatagramSocket并仅绑定到一个端口,那么使用非阻塞模式与DatagramChannel和Selector没有任何优势吗?

在NAT后面进行UDP打孔

我试图在Java中实现UDP-Holepunching的简单草图来测试它的概念,并在稍后的C / C ++应用程序中使用它。 概念: 从维基百科我可以理解这个概念:让A和B成为未定义网络结构背后的客户端,C是众所周知的公共可达服务器。 A向服务器C发送数据包,服务器保存其IP地址和端口。 C将获得A的NAT的公共IP地址。 这样做,A前面的NAT将创建一个路由,将该端口上的所有数据包传递给A. B与A相同,向服务器C发送数据包,然后保存它的地址和端口,B的NAT创建路由,依此类推。 此时,C知道每个客户端的地址和端口。 C将B的地址和端口发送到A,从A发送到B. A向B发送一个数据包,该数据包将被B的NAT拒绝,但这样做会在A的NAT中打开一个“漏洞”,让B的其他数据包通过。 B向A发送一个数据包,它将到达A,因为“洞”之前是“打孔”。 这样做也会在B的NAT中打开一个“洞”,让来自A的更多数据包通过。 现在已经完成了打孔,A和B应该能够相互通信P2P 这一切都优于localhost(这不是一个大惊喜),但在现实世界的例子中,这失败了。 问题: A和B都能够连接到服务器C,服务器C获取其数据包,存储其地址和端口并将其传输到另一个客户端。 但此时它失败了。 A和B无法相互通信。 所以我问自己哪里做错了。 我花了几天时间在google和stackoverflow中搜索工作示例,但我偶然发现的是使用STUN的建议,这不是我想要的。 执行: 下面我将用Java发布我的草图,因为我不知道我的概念或实现是否有问题。 这是服务器的代码: public class Server { public static void main(String[] args) { int port1 = 0, port2 = 0; String address1 = null, address2; byte[] bytes = new byte[1024]; try { […]

为什么我的UDP客户端/服务器数据报没有运行双向通信?

我在两个应用程序之间设置了一个简单的UDP客户端/服务器数据报:Android-Java-Client和Windows-C#-Server。 这是我的第一个Java编程和Android应用程序,因此解决方案可能很明显。 所以我成功地从客户端向服务器发送了一个数据包。 但是,我无法从服务器发回客户端。 我正在尝试从服务器向客户端发送确认消息。 我尝试将C#客户端代码与现有的C#Server代码合并,但是一旦服务器收到第一条消息System.ObjectDisposedException它就会崩溃。 我删除了并重新开始“如果你想要看见编辑”。 现在,我成功发送到服务器但没有收到任何内容,Java客户端也没有显示任何内容。 我知道我可以(或者可能应该)使用相同的套接字发送回客户端。 我的错误在哪里? 拜托,谢谢。 我尝试将整个NetworkThread放在OnTouchListener 我尝试将SendUdpMessage()分解为两个,一个发送,一个接收 我尝试了下面的答案 而我仍然无法使它工作:( C#服务器端: // This class is responsible of running the server side on the PC. class UdpServer { static void Main(string[] args) { byte[] data = new byte[1024]; UdpClient serverSocket = new UdpClient(15000); int i = 0; while (true) { Console.WriteLine(“Waiting […]

UDP数据报中发送的消息未清理?

我的代码如下。 一切都按照我想要的方式工作,但是当收到我的消息时,他们有很多盒子,有点像这样的“消息:你好▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀“我怎样才能这样做才能收到和打印的只是”消息:你好“? 我非常感谢任何帮助。 import java.io.*; import java.net.*; public class UDPChat { public static void main(String args[]) throws Exception { new UDPChat(); } public UDPChat() { try { runChat(); } catch (Exception e) { }} public void runChat() throws InterruptedException { Sender sender = new Sender(); Receiver receiver = new Receiver(); sender.start(); receiver.start(); sender.join(); receiver.join(); […]

无法从run方法中访问对象的属性(方法)! Javamultithreading

我在ServerConnectionManager中有以下代码: public class ServerConnectionManager implements Runnable { private DatagramPacket receivedPacket; //some more things here public ServerConnectionManager(DatagramPacket receivedPacket){ this.receivedPacket = receivedPacket; System.out.println(“Connection manager has been assigned a request”); System.out.println(“The port of the request packet is “+receivedPacket.getPort()); try { sendReceiveSocket = new DatagramSocket(); } catch (SocketException se) { se.printStackTrace(); System.exit(1); } } @Override public void run() { […]