jave中的udp套接字,接收方未收到消息 [英] udp socket in jave , the receiver not receive message
本文介绍了jave中的udp套接字,接收方未收到消息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
当我使用此代码时,发送方成功地通过接收方无法收到此消息来发送消息
package UDP_Socket;
导入 java.net.*;
导入 java.io. *;
公共 类 PacketReceiver {
公共 静态 void main(字符串 [] args){
尝试 {
// 创建一个数据报套接字,该套接字绑定到特定的端口9999
DatagramSocket socket = 新 DatagramSocket( 9999 );
// 创建一个数据报包,其中包含最大256个字节的缓冲区
DatagramPacket封包= 新 DatagramPacket(新 byte [ 256 ], 256 );
// 接收数据包-默认情况下,这是一项阻止操作
// socket.setSoTimeout(10000);
socket.receive(packet);
System.out.println(" );
// 显示数据包信息
InetAddress remote_addr = packet.getAddress();
System.out.println(" + remote_addr.getHostAddress());
System.out.println(" + packet.getPort());
// 通过读取字节数组来显示数据包内容
ByteArrayInputStream bin = 新 ByteArrayInputStream(packet.getData());
// 仅显示不超过原始UDP数据包的长度
for ( int i = 0 ; i < packet.getLength(); i ++){
int data = bin.read();
如果(数据==- 1 )
break ;
其他
System.out.print(( char )data);
}
socket.close();
} 捕获(IOException ioe){
System.err.println(" + ioe);
}
}
}
package UDP_Socket;
导入 java.net.*;
导入 java.io. *;
公共 类 PacketSender {
公共 静态 void main(字符串 [] args){
尝试 {
// 远程服务器的主机名/IP地址
字符串主机名= " ;
// 查找指定的主机名,并获取一个InetAddress
System.out.println(" +主机名)";
InetAddress remote_addr = InetAddress.getByName(hostname);
System.out.println(" + remote_addr.getHostAddress());;
// 创建绑定到任何可用本地端口的数据报套接字
DatagramSocket socket = 新 DatagramSocket();
// 创建一条消息,以使用UDP数据包发送
ByteArrayOutputStream bout = 新 ByteArrayOutputStream();
PrintStream pout = 新 PrintStream(bout);
pout.print(" );
// 以字节数组的形式获取消息的内容
字节 [] barray = bout.toByteArray();
// 创建一个数据报包,其中包含我们的字节数组
DatagramPacket封包= 新 DatagramPacket(barray,barray.length);
// 设置数据包的目标地址
packet.setAddress(remote_addr);
// 将端口号设置为9999
packet.setPort( 9999 );
// 发送数据包-请记住,不能保证交货
socket.send(packet);
System.out.println(" );
socket.close();
} 捕获(UnknownHostException,呵呵){
System.err.println(" + uhe.getMessage());
} 捕获(IOException ioe){
System.err.println(" + ioe);
}
}
}
解决方案
首先,您应该尝试另一个套接字. 0-10000套接字经常由不同的应用程序使用,在这里使用更高的值会节省很多(并且请不要再使用33333或22222,并且...您知道哪个...)
我也可以建议阅读有关数据报的Java教程 [package UDP_Socket; import java.net.*; import java.io.*; public class PacketReceiver { public static void main(String[] args) { try { // Create a datagram socket, bound to the specific port 9999 DatagramSocket socket = new DatagramSocket(9999); // Create a datagram packet, containing a maximum buffer of 256 bytes DatagramPacket packet = new DatagramPacket(new byte[256], 256); // Receive a packet - remember by default this is a blocking operation //socket.setSoTimeout(10000); socket.receive(packet); System.out.println("Packet received!"); // Display packet information InetAddress remote_addr = packet.getAddress(); System.out.println("Sent by host: " + remote_addr.getHostAddress()); System.out.println("Sent from port: " + packet.getPort()); // Display packet contents, by reading from byte array ByteArrayInputStream bin = new ByteArrayInputStream(packet.getData()); // Display only up to the length of the original UDP packet for (int i = 0; i < packet.getLength(); i++) { int data = bin.read(); if (data == -1) break; else System.out.print((char)data); } socket.close(); } catch (IOException ioe) { System.err.println("Error - " + ioe); } } }
package UDP_Socket; import java.net.*; import java.io.*; public class PacketSender { public static void main(String[] args) { try { // Hostname/IP address of the remote server String hostname = "localhost"; // Lookup the specified hostname, and get an InetAddress System.out.println("Looking up hostname " + hostname); InetAddress remote_addr = InetAddress.getByName(hostname); System.out.println("Hostname resolved as " + remote_addr.getHostAddress()); // Create a datagram socket, bound to any available local port DatagramSocket socket = new DatagramSocket(); // Create a message to send using a UDP packet ByteArrayOutputStream bout = new ByteArrayOutputStream(); PrintStream pout = new PrintStream(bout); pout.print("Greetings!"); // Get the contents of our message as an array of bytes byte[] barray = bout.toByteArray(); // Create a datagram packet, containing our byte array DatagramPacket packet = new DatagramPacket(barray, barray.length); // Set the destination address of the packet packet.setAddress(remote_addr); // Set port number to 9999 packet.setPort(9999); // Send the packet - remember no guarantee of delivery socket.send(packet); System.out.println("Packet sent!"); socket.close(); } catch (UnknownHostException uhe) { System.err.println("Can't find host " + uhe.getMessage()); } catch (IOException ioe) { System.err.println("Error - " + ioe); } } }解决方案First of all you should try another socket. the sockets 0-10000 are often used by different applications, it''s much saver to use a higher value here (and please not again 33333 or 22222 and... you know which...)
Also can I recommend to read This Java Tutorial on Datagrams[^].
这篇关于jave中的udp套接字,接收方未收到消息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文