模拟一个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();
}
}客户端的代码基本一样
通过调用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();
}
}客户端的代码基本一样
记得在接收的时候,这样做:
String message = new String(receiver.getData(),receiver.getOffset(),receiver.getLength());
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();
}
}
}
}
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();
}
}
}