Amr*_*awi 19 java firewall udp
我做了一个程序,从客户端发送UDP数据包到服务器这里是发送器代码
import java.io.IOException;
import java.net.*;
/**
*
* @author hp
*/
public class JavaApplication9 {
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws UnknownHostException, SocketException, IOException {
// TODO code application logic here
byte[] buffer = {10,23,12,31,43,32,24};
byte [] IP={-64,-88,1,106};
InetAddress address = InetAddress.getByAddress(IP);
DatagramPacket packet = new DatagramPacket(
buffer, buffer.length, address, 57
);
DatagramSocket datagramSocket = new DatagramSocket();
datagramSocket.send(packet);
System.out.println(InetAddress.getLocalHost().getHostAddress());
}
}
Run Code Online (Sandbox Code Playgroud)
接收器代码功能是
public void run(){
try{
DatagramSocket serverSocket = new DatagramSocket(port);
byte[] receiveData = new byte[8];
byte[] sendData = new byte[8];
while(true)
{
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
String sentence = new String( receivePacket.getData());
System.out.println("RECEIVED: " + sentence);
InetAddress IPAddress = receivePacket.getAddress();
String sendString = "polo";
sendData = sendString.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
serverSocket.send(sendPacket);
}
}catch (Exception e){
}
}
Run Code Online (Sandbox Code Playgroud)
我使用过WireShark程序.UDP数据包是在接收器的WireShark程序中接收的,但Java程序无法识别它,程序只是一直在监听端口而没有任何反应?
Jas*_*nM1 31
接收方必须设置接收方端口以匹配发送方DatagramPacket中设置的端口.对于调试,尝试侦听端口> 1024(例如8000或9000).端口<1024通常由系统服务使用,需要管理员访问才能在此端口上绑定.
如果接收器将数据包发送到它正在侦听的硬编码端口(例如端口57),并且发送器在同一台机器上,那么您将创建一个到接收器本身的环回.始终使用从数据包中指定的端口,如果是生产软件,则无论如何都需要检查以防止出现这种情况.
数据包无法到达目的地的另一个原因是发送方中指定的IP地址错误.与TCP不同的UDP将尝试发送数据包,即使地址无法访问且发送方也不会收到错误指示.您可以通过在接收器中打印地址来检查这一点,作为调试的预防措施.
在您设置的发件人中:
byte [] IP= { (byte)192, (byte)168, 1, 106 };
InetAddress address = InetAddress.getByAddress(IP);
Run Code Online (Sandbox Code Playgroud)
但是以字符串形式使用地址可能更简单:
InetAddress address = InetAddress.getByName("192.168.1.106");
Run Code Online (Sandbox Code Playgroud)
换句话说,您将target设置为192.168.1.106.如果这不是接收器,那么你将无法获得数据包.
这是一个简单的UDP接收器,可以工作:
import java.io.IOException;
import java.net.*;
public class Receiver {
public static void main(String[] args) {
int port = args.length == 0 ? 57 : Integer.parseInt(args[0]);
new Receiver().run(port);
}
public void run(int port) {
try {
DatagramSocket serverSocket = new DatagramSocket(port);
byte[] receiveData = new byte[8];
String sendString = "polo";
byte[] sendData = sendString.getBytes("UTF-8");
System.out.printf("Listening on udp:%s:%d%n",
InetAddress.getLocalHost().getHostAddress(), port);
DatagramPacket receivePacket = new DatagramPacket(receiveData,
receiveData.length);
while(true)
{
serverSocket.receive(receivePacket);
String sentence = new String( receivePacket.getData(), 0,
receivePacket.getLength() );
System.out.println("RECEIVED: " + sentence);
// now send acknowledgement packet back to sender
InetAddress IPAddress = receivePacket.getAddress();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length,
IPAddress, receivePacket.getPort());
serverSocket.send(sendPacket);
}
} catch (IOException e) {
System.out.println(e);
}
// should close serverSocket in finally block
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
100322 次 |
最近记录: |