[英]How can I use UDP in JAVA Socket Programming to implement simple message communication between two ports?
我正在学习套接字编程,我想设计一个简单的程序,该程序能够在2个端口之间发送和接收消息。 我使用相同的IP地址127.0.0.1(应为localhost),但设置了2个不同的端口,分别代表两个彼此通讯的人。 我打开了两个终端来运行Class Demo2和Class Demo2B,以便在两个班级之间发送和接收消息。 但是,我看不到收到任何消息。 我可以知道我的代码哪里出问题了吗?
这是Demo2
public class Demo2 {
public static void main(String[] args) throws SocketException {
DatagramSocket sendSocket = new DatagramSocket();
DatagramSocket receiveSocket = new DatagramSocket(7705); //Set the Demo2 will use port 7705 to receive data
new Thread(new send(sendSocket)).start();
new Thread(new send(receiveSocket)).start();
}
static class send implements Runnable {
private DatagramSocket datagramSocket;
private send(DatagramSocket datagramSocket) {
this.datagramSocket = datagramSocket;
}
@Override
public void run() {
// TODO Auto-generated method stub
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String line = null;
try {
while ((line=bufferedReader.readLine())!=null) {
if(line.equals("88")) {
break;
}
byte[] buf = line.getBytes();
DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length, InetAddress.getByName("127.0.0.1"), 8805); //set the data from Demo2 will be sent to port 8805
datagramSocket.send(datagramPacket);
}
} catch (IOException e) {
// TODO Auto-generated catch block
throw new RuntimeException("Fail to send");
}
}
}
class receive implements Runnable {
private DatagramSocket datagramSocket;
private receive(DatagramSocket datagramSocket) {
this.datagramSocket = datagramSocket;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true) {
byte[] buf = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length);
try {
datagramSocket.receive(datagramPacket);
String ip = datagramPacket.getAddress().getHostAddress();
String data = new String(datagramPacket.getData(), 0, datagramPacket.getLength());
System.out.println(ip+":"+data);
} catch (IOException e) {
// TODO Auto-generated catch block
throw new RuntimeException("Fail to send");
}
}
}
}
}
这是Demo2B
public class Demo2B {
public static void main(String[] args) throws SocketException {
DatagramSocket sendSocket = new DatagramSocket();
DatagramSocket receiveSocket = new DatagramSocket(8805); //Set the Demo2B will use port 8805 to receive data
new Thread(new send(sendSocket)).start();
new Thread(new send(receiveSocket)).start();
}
static class send implements Runnable {
private DatagramSocket datagramSocket;
private send(DatagramSocket datagramSocket) {
this.datagramSocket = datagramSocket;
}
@Override
public void run() {
// TODO Auto-generated method stub
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String line = null;
try {
while ((line=bufferedReader.readLine())!=null) {
if(line.equals("88")) {
break;
}
byte[] buf = line.getBytes();
DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length, InetAddress.getByName("127.0.0.1"), 7705); //set the data from Demo2 will be sent to port 7705
datagramSocket.send(datagramPacket);
}
} catch (IOException e) {
// TODO Auto-generated catch block
throw new RuntimeException("Fail to send");
}
}
}
class receive implements Runnable {
private DatagramSocket datagramSocket;
private receive(DatagramSocket datagramSocket) {
this.datagramSocket = datagramSocket;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true) {
byte[] buf = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length);
try {
datagramSocket.receive(datagramPacket);
String ip = datagramPacket.getAddress().getHostAddress();
String data = new String(datagramPacket.getData(), 0, datagramPacket.getLength());
System.out.println(ip+":"+data);
} catch (IOException e) {
// TODO Auto-generated catch block
throw new RuntimeException("Fail to send");
}
}
}
}
}
我期望看到的是,一旦我分别运行这两个类,如果将消息从Class Demo2发送到Class Demo2B,Demo2B应该能够捕获并显示数据。 与reverse相同,我可以从Class Demo2B答复给Class Demo2,Class Demo2也将捕获数据并显示它。 如果有人可以帮助我解决这种困惑,我真的很感激。
在Demo2
和Demo2B
类中,您仅初始化了发送线程。 您忘记启动接收到的线程。
public class Demo2B {
public static void main(String[] args) throws SocketException {
DatagramSocket sendSocket = new DatagramSocket();
DatagramSocket receiveSocket = new DatagramSocket(8805); //Set the Demo2B will use port 8805 to receive data
new Thread(new send(sendSocket)).start();
// This sould be new Thread(new receive(receiveSocket)).start();
new Thread(new send(receiveSocket)).start();
}
因此,在两个类中更改以下代码将解决问题:
new Thread(new send(sendSocket)).start();
new Thread(new receive(receiveSocket)).start();
由于您只能在这两个类之间的区别是port
,因此您可以简单地保留一个类并提供端口作为要监听的参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.