Tag: udp

Java客户端PHP-Server UDP打孔示例代码

我正在开发一个需要ea p2p服务器的项目,但我还没有找到任何java-client php-server示例代码。 我理解udp打孔如何工作的概念,但我无法在代码中得到任何东西。 我尝试过的: TheSocket.java public class TheSocket { public static String response = “hello”; public static String request; public static String webServerAddress; public static ServerSocket s; protected static ServerSocket getServerSocket(int port)throws Exception{ return new ServerSocket(port); } public static void handleRequest(Socket s){ BufferedReader is; PrintWriter os; try{ webServerAddress = s.getInetAddress().toString(); is = new BufferedReader(new […]

将数据包广播到不在java中工作的客户端

我有多个发送器配置为当它们接收从服务器通过本地端口5255发送的广播数据包时发回响应,远程端口5252包含字符串“AST show me \ 0”(如发送者手册中所述)。 这应该可以帮助我扫描本地网络中的所有发射器。 我已经实现了一个服务器端代码来广播该字符串消息,但是当我运行代码时,它在以下行代码中有一个错误: socket.receive(packet1); 我真的不知道我在这段代码中做错了什么或遗漏了什么。 任何帮助将不胜感激。 注意:如果有帮助:发射器的IP地址是192.168.40。*; 服务器IP地址为192.168.40.254。 提前致谢 !! 这是代码: package socket_test; import java.io.*; import java.net.*; public class Server_UDP_Broadcast { //@SuppressWarnings(“null”) public static void main(String[] args) { // TODO Auto-generated method stub DatagramSocket socket = null; try{ socket = new DatagramSocket(5255); socket.setSoTimeout(10000); String str = “AST show me\0”; byte[] buf […]

DatagramChannel.close()在Windows上保持端口打开

我正在实施一个Discover流程: 打开UDP套接字以侦听给定端口上的广播响应 发送一些请求(并期待以后的响应) 在给定的时间段后关闭UDP套接字 第一个电话有效。 但是其他调用会出现绑定错误。 已经在使用的地址:bind 我正在运行Windows 7.我做了一些测试,发现在channel.close()之后; Netstat仍然给出: netstat -a -b -sp udp | grep 55224 UDP 0.0.0.0:55224 : 所以udp端口仍然在操作系统级别打开 我搜索了网络,它可能是os级别的泄漏: 一些java数据报套接字问题 我使用NIO通道运行了2次测试,没有使用1次(来自网络上的测试)。 我使用NIO版本重现了我的错误,但如果我不使用NIO,它会有效。 我有人可以指出我如何使它适用于NIO。 目标平台是Android,我不想总是听广播但只是重复一段时间。 测试sockets public void testConnectCloseWithSocket() { long tCumulative = 0; int errAt = -1; System.out.println(“start…”); for (int i = 0; i < 4000; i++) { try { errAt […]

Datagramsocket:接收(…)如何处理数据包的碎片

我从我的教授那里得知,使用UDP套接字发送的数据报包在较低层中被分段,并且可能在接收器端以多个数据包的forms到达。 例如,如果我在数据报包中发送1000字节数据,则在接收端它可能会以2字节,500字节,12字节等forms到达。 因此,他建议多次接收(…)接收发送方发送的整个1000字节的数据包。 后来当我浏览数据报套接字接收(…)的Java文档时,有一行读取如下:“此方法一直阻塞,直到收到数据报。…”是否表示收到整个数据报包当我们使用Java时,不需要进行多次接收(即使理论上是这种情况)? PLS。 澄清。 如果每个数据包的多次接收(…)是解决此问题的唯一选择,请参阅。 提出如何做到这一点的建议。

使用TCP连接获取字节数组

我使用UDP发送/接收数据但我现在想切换到TCP以避免丢包。 我已经阅读了几篇关于TCP教程,并注意到TCP不使用像UDP这样的DatagramPacket,而是使用InputStream / OutputStream。 我们如何从DataInputStream获取byte [],这与此类似: byte[] receiveData = new byte[64000]; DatagramPacket receivePacket = new DatagramPacket(receiveData,receiveData.length); receiveData=receivePacket.getData();

是否可以在同一端口上仅使用1个UDPSocket进行发送/接收?

我正在尝试发送一个DatagramPacket,然后必须等待来自服务器的Acknowlegment,以便我知道是否必须重新发送相同的数据包或发送下一个数据包。 我在客户端使用相同的套接字,发送数据包并接收确认(ack),在服务器端使用相同的,另一个用于接收数据包的套接字,然后将确认发送给客户.. 第一个问题是客户端正在发送数据包,服务器正在接收它,然后将确认发送到客户端,但客户端在接收确认数据包时阻塞。 我正在制作一些System.out.println以确定问题所在,但我无法找到解决此问题的方法。 第二个问题是服务器仍然总是接收数据,并且不要等待客户端发送内容,我检查了因为我得到了那些行(例如“得到长度为xxx的数据包”“ack与ackNr yyy一起发送”… “虽然客户端在发送第一个数据包后仍在阻塞,但始终打印在服务器端,因为它正在等待未收到的确认! 这是CLIENT的代码: package blatt7; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketTimeoutException; import java.net.UnknownHostException; import java.nio.ByteBuffer; import java.util.zip.CRC32; public class FileSender { String zielRechner; String filePath; InetAddress host; File file; FileInputStream fis; int readLength; int sequenceNr = 0; int receivedSeqNr = […]

简单UDP广播客户端和服务器在不同的机器上

当两个客户端和服务器UDP广播代码位于同一台PC上时,它们的工作正常。 然而,当我将它们放在同一个WIFI LAN的不同PC上时,根本没有任何事情发生。 我已经设法让两个单独的PC上的多播版本运行良好,但不是这样:(。我已经关闭了两个防火墙,并成功地从两个PC上ping每个。 这个测试背后的想法是这样我可以使用这种方法,因此客户端可以通过发送数据报包(对等点发现)在LAN上找到服务器。 我认为我对主机名或其他东西做错了,但经过一周的谷歌搜索和测试新想法后,我正式将它们全部排除在外:(。 public class Client { private String hostname= “localhost”; private int port=1234; private InetAddress host; private DatagramSocket socket; DatagramPacket packet; public void run() { try { host = InetAddress.getByName(hostname); socket = new DatagramSocket (null); packet=new DatagramPacket (new byte[100], 0,host, port); socket.send (packet); packet.setLength(100); socket.receive (packet); socket.close (); byte[] data = […]

如何摆脱剩余的缓冲区?

我有一个服务器客户端应用程序,它使用数据报套接字来交换消息。 我最初将缓冲区大小设置为1024字节,因为我不知道消息的长度。 当我发送短于1024字节的内容时,我将其余的字符串显示为一些奇怪的字符(空字符或我不确定它们是如何被调用的)。 这是一个屏幕: 客户端代码: byte[] buf = (“This is another packet.\n”).getBytes(); DatagramPacket packet = new DatagramPacket(buf, buf.length, inetAddress, serverport); socket.send(packet) byte[] buf = (“This is another packet.\n”).getBytes(); DatagramPacket packet = new DatagramPacket(buf, buf.length, inetAddress, serverport); socket.send(packet) 服务器代码: byte[] buf = new byte[1024]; DatagramPacket packet = new DatagramPacket(buf, buf.length); socket.receive(packet); byte[] buf = new byte[1024]; […]

Java DatagramPacket(UDP)最大发送/ recv缓冲区大小

在Java中使用DatagramPacket假设您有一个byte[1024*1024]缓冲区。 如果你只是在发送/接收时为DatagramPacket传递它,那么Java接收对DatagramPacket块的调用,直到它读取整个兆字节为止? 我问的是Java是将它拆分还是只是尝试发送掉掉的整个东西。 通常,UDP数据包的大小限制大约是64KB,但我想知道,因为Java的API允许字节数组,如果这是一个限制,那么超级巨大的东西会被丢弃或拆分并重新组装给你。 如果它被删除了什么API调用将告诉我可以在Java调用中使用的最大数据有效负载? 我听说IPv6也有巨型帧,但DatagramPacket(或DatagramSocket )支持,因为UDP定义了头规格?

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

我正在编写一组Client / Server程序 根据客户端请求的操作,我使用make TCP或UDP请求。 实现客户端是直截了当的,因为我可以轻松地打开与任何协议的连接并将请求发送到服务器端。 另一方面,在服务器端,我想在同一端口上同时监听UDP和TCP连接。 而且,我喜欢服务器为每个连接请求打开新线程。 我采用了以下解释的方法: 链接文本 我通过为每个TCP / UDP请求创建新线程来扩展此代码示例。 如果我只使用TCP,这可以正常工作,但是当我尝试进行UDP绑定时它会失败。 请给我任何建议如何纠正这个问题。 TNX 这是服务器代码: public class Server { public static void main(String args[]) { try { int port = 4444; if (args.length > 0) port = Integer.parseInt(args[0]); SocketAddress localport = new InetSocketAddress(port); // Create and bind a tcp channel to listen for […]