我写了个简单的UDP收发程序,服务器端收到一个数据包之后打印数据包的内容,然后回应一个数据包,内容都很简单。客户端发送数据,然后等待服务器返回数据,接着打印出返回的数据。流程就这么简单。
    但现在遇到一个问题:
    当我把服务器程序放在A机器上,客户端程序放在B机器上时,B发给A的数据A可以收到,A返回给B的应答数据B收不到,用抓包工具在B上抓包的时候发现数据包确实已经到达B了,但程序就是无法收到打印数据。
    当我把服务器程序放在B机器上,客户端程序放在A机器上时,A发送给B的数据,B收不到!用抓包工具显示B确实已经收到包了,就是程序没法打印和返回数据包,程序无法收到包。(调换机器的时候程序里的服务器和客户端地址我都有换过来的)
    也就是说,所有发给B的数据包B用抓包工具显示都能收到,但程序就是无法接收数据包。是机器的问题还是程序的问题?
    我刚接触java的网络编程,不知道是不是我程序写的有问题,请各位大侠帮我看看,谢谢!服务器端的代码如下:import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.text.SimpleDateFormat;
import java.util.Date;
public class UDPServer { public static String addr = "218.241.103.121";//服务器地址
public static int receiv_port = 4446;//叫我去监听数据端口
public static int response_port = 4444;//服务器发送数据端口
public static int BUFFSIZE = 1024; public static void main(String[] args) {
DatagramSocket server_receive = null;// 用于接收数据
DatagramSocket server_response = null;// 用于发送数据
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
server_receive = new DatagramSocket(receiv_port, InetAddress.getByName(addr));//接收4446端口发来的数据
server_response = new DatagramSocket(response_port, InetAddress.getByName(addr));//从4444端口返回数据
byte[] data = new byte[BUFFSIZE];
String response = "GOT IT!";//返回应答数据包的内容
byte[] resData = response.getBytes();
while (true) {
DatagramPacket packet = new DatagramPacket(data, data.length);
//接收数据
server_receive.receive(packet);
//got data
String receive = new String(data, 0, packet.getLength());
System.out.println("Receive data: IP = " + packet.getAddress().getHostAddress()
+ ", Port = " + packet.getPort()
+ ", Data = " + receive
+ ", Time =" + format.format(new Date()));
//返回应答数据
DatagramPacket responsePacket = new DatagramPacket(resData, resData.length, packet.getAddress(), packet.getPort());
server_response.send(responsePacket);
}
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
if (server_receive != null) 
server_receive.close();
if (server_response != null) 
server_response.close();
} }}
客户端代码如下:import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPClient { public static int server_port = 4446;//服务器的监听端口
public static int client_port = 51643;//客户端发送数据端口
public static String server_addr = "218.241.111.240";//服务器地址
public static String client_addr = "218.241.103.121";客户端地址
public static int BUFFSIZE = 1024;
/**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
DatagramSocket client = null;
try {
client = new DatagramSocket(client_port, InetAddress.getByName(client_addr));
String sendData = "Client";
byte[] send = sendData.getBytes();
DatagramPacket sendPacket = new DatagramPacket(send, send.length, InetAddress.getByName(server_addr), server_port);
//发送数据
client.send(sendPacket);
//接收数据
byte[] receive = new byte[BUFFSIZE];
DatagramPacket receivePacket = new DatagramPacket(receive, receive.length);
client.receive(receivePacket);
String receiveData = new String(receive, 0, receivePacket.getLength());
System.out.println("Response Data: " + receiveData);
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
client.close();
} }}

解决方案 »

  1.   

        public static int response_port = 4444;//服务器发送数据端口
        public static int server_port = 4446;//服务器的监听端口服务器发包端口和客户端监听端口都不一样。。你叫客户端怎么能监听到包
      

  2.   

    A木有向B监听的端口发送返回数据B貌似也木有监听什么端口楼主的连接是不是有点乱ps,要响应的连接为什么用UDP呢?
      

  3.   

    B监听的端口是4444,上面写错了,A确实是想B监听的端口发送返回数据,但B就是收不到
    B确实在4444上面监听了,你看程序绑定了
    基于UDP协议的程序,请求用UDP,返回也用UDP,错了吗?