模拟一个UDP通信的小程序,如果传的字符串中只有英文就什么都没打印,如果英文后面在加点数字、符号、或中文,就正常了,搞不懂啊~~~
通过调用open方法开启服务器,其中sendThread线程用来发送字符串public void open() {
DatagramSocket serverSocket = null;
DatagramPacket receiver = null;
byte[] b = new byte[10240];
try {
serverSocket = new DatagramSocket(8000);
System.out.println("服务器已开启");
receiver = new DatagramPacket(b, b.length);
serverSocket.receive(receiver);
InetAddress address = receiver.getAddress();
int port = receiver.getPort();
Thread sendThread = new SendThread(serverSocket, address, port);
sendThread.start();
String message = new String(receiver.getData());
while (message != null) {
for (int i = 0; i < 10240; i++) {
b[i] = 0;
}
System.out.println(port + ":");
System.out.println("\t" + message);
serverSocket.receive(receiver);
message = new String(receiver.getData());
}
} catch (Exception e) {
e.printStackTrace();
}
}
//sendThread里的run方法
public void run() {
DatagramPacket sender = null;
byte[] b = new byte[10240];
String message = "";
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
while (true) {
message = br.readLine();
sender = new DatagramPacket(b, b.length, this.hostAddress,this.port);
sender.setData(message.getBytes());
this.clientSocket.send(sender);
}
} catch (Exception e) {
e.printStackTrace();
}
}客户端的代码基本一样

解决方案 »

  1.   

    不应该是中英文问题。
    记得在接收的时候,这样做:
    String message = new String(receiver.getData(),receiver.getOffset(),receiver.getLength());
      

  2.   

    完整代码://服务端
    public class ServerMain {
    public static void main(String[] args) {
    UdpServerDemo server = new UdpServerDemo();
    server.open();
    }
    }
    public class UdpServerDemo {
    public void open() {
    DatagramSocket serverSocket = null;
    DatagramPacket receiver = null;
    byte[] b = new byte[10240];
    try {
    serverSocket = new DatagramSocket(8000);
    System.out.println("服务器已开启");
    receiver = new DatagramPacket(b, b.length);
    serverSocket.receive(receiver);
    InetAddress address = receiver.getAddress();
    int port = receiver.getPort();
    Thread sendThread = new SendThread(serverSocket, address, port);
    sendThread.start();
    String message = new String(receiver.getData());
    while (message != null) {
    for (int i = 0; i < 10240; i++) {
    b[i] = 0;
    }
    System.out.println(port + ":");
    System.out.println("\t" + message);
    serverSocket.receive(receiver);
    message = new String(receiver.getData(), receiver.getOffset(), receiver.getLength());
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
    public class SendThread extends Thread {
    private DatagramSocket serverSocket = null;
    private InetAddress address;
    private int port; public SendThread(DatagramSocket serverSocket, InetAddress address, int port) {
    this.serverSocket = serverSocket;
    this.address = address;
    this.port = port;
    } public void run() {
    DatagramPacket sender = null;
    byte[] b = new byte[10240];
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String message = "";
    while (true) {
    try {
    message = br.readLine();
    sender = new DatagramPacket(b, b.length, this.address,this.port);
    sender.setData(message.getBytes());
    serverSocket.send(sender);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
    }
      

  3.   

    完整代码,客户端:public class ClientMain {
    public static void main(String[] args) {
    UdpClientDemo client = new UdpClientDemo();
    try {
    InetAddress hostAddress = InetAddress.getByName("localhost");
    int port = 8000;
    client.connect(hostAddress, port);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
    public class UdpClientDemo { public void connect(InetAddress hostAddress, int port) {
    DatagramSocket clientSocket = null;
    DatagramPacket receiver = null;
    byte[] b = new byte[10240];
    try {
    clientSocket = new DatagramSocket(3000);
    receiver = new DatagramPacket(b, b.length, hostAddress, port);
    System.out.println(receiver.getAddress() + "\t" + receiver.getPort());
    Thread sendThread = new SendThread(clientSocket, hostAddress, port);
    sendThread.start();
    clientSocket.receive(receiver);
    String message = new String(receiver.getData());
    while (message != null) {
    for (int i = 0; i < 10240; i++) {
    b[i] = 0;
    }
    System.out.println(port + ":");
    System.out.println(message);
    clientSocket.receive(receiver);
    message = new String(receiver.getData(), receiver.getOffset(), receiver.getLength());
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
    public class SendThread extends Thread {
    private DatagramSocket clientSocket = null;
    private InetAddress hostAddress;
    private int port; public SendThread(DatagramSocket clientSocket, InetAddress hostAddress, int port) {
    this.clientSocket = clientSocket;
    this.hostAddress = hostAddress;
    this.port = port;
    } public void run() {
    DatagramPacket sender = null;
    byte[] b = new byte[10240];
    String message = "";
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    try {
    while (true) {
    message = br.readLine();
    sender = new DatagramPacket(b, b.length, this.hostAddress, this.port);
    sender.setData(message.getBytes());
    this.clientSocket.send(sender);
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
      

  4.   

    byte[] b = new byte[10240];建议你 把这个b定义小一点,各个OS对UDP的包大小并不统一,而且udp也不适合传大包,一般定义512字节.
      

  5.   

    没看出问题啊,是不是byte[] b = new byte[10240];数组太大了,打印出来的你没看到。