Java中的点对点通信



我正在尝试使用Java开发一个简单的点对点聊天。我使用Java Sockets编写了这个想法。请找到下面的代码,检查我是否正确启动。请告诉我任何其他的建议或反馈来改进。我用的是TCP, P2P用TCP对吗?或者我应该使用UDP?

提前感谢。

//Peer.java

import java.io.*;
import java.net.*;

class Peer {
int port;
Peer () {

try {

System.out.print("Enter port for this Peer  ");
DataInputStream din = new DataInputStream(System.in);
port = Integer.parseInt(din.readLine());
} catch (Exception e) {
//TODO: handle exception
}
}
class Sender extends Thread {
Socket s;
public void run() {
try {
DataInputStream in = new DataInputStream(System.in);
System.out.println("Enter destPort  ");
int destPort = Integer.parseInt(in.readLine());
s = new Socket("127.0.0.1", destPort);
DataInputStream din = new DataInputStream(s.getInputStream());
DataOutputStream dout = new DataOutputStream(s.getOutputStream());
while (true) {
System.out.println("Enter message for another peer  ");
String str = in.readLine();
dout.writeUTF(str);
System.out.println("Message sent");
if (str.equalsIgnoreCase("bye")) {
din.readUTF();
this.run();
break;
}
}

} catch (Exception e) {
System.out.println(e);
}
}
}
class Receiver extends Thread {
int port;
ServerSocket ss;
Socket s;
DataInputStream din;
DataOutput dout;
Receiver(int port) {
this.port = port;
}
public void run() {
try {
ss = new ServerSocket(port);
System.out.println("Receiver created!!!");
s = ss.accept();
System.out.println("Client connected");
din = new DataInputStream(s.getInputStream());
dout = new DataOutputStream(s.getOutputStream());
while (true) {
String str = din.readUTF();
System.out.println("Message from Client is " + str);
if (str.equalsIgnoreCase("bye")) {
System.out.println("Client left");
dout.writeUTF(str);
s.close();
ss.close();
this.run();
break;
}
}

} catch (Exception e) {
System.out.println(e);
}
}
}
public void newPeer() throws Exception {
Sender s = new Sender();
Receiver r = new Receiver(port);
s.start(); r.start();
s.join(); r.join();
}
public static void main(String[] args) throws Exception {
Peer p = new Peer();
p.newPeer();
}}

我在两个终端上运行这段代码,下面是输出。

Terminal1:

java Peer
Enter port for this Peer  2001
Enter destPort
Receiver created!!!
Client connected
Message from Client is hello
2002
Enter message for another peer
Hello
Message sent
Enter message for another peer
Message from Client is bye
Client left
Receiver created!!!

终端2:

java Peer
Enter port for this Peer  2002
Enter destPort
Receiver created!!!
2001
Enter message for another peer
hello
Message sent
Enter message for another peer
Client connected
Message from Client is Hello
bye
Message sent
Enter destPort

如果你想通过TCP实现p2p,你需要对每一方使用C/S模式:每个对等端都是服务器,它也是客户端。这就是为什么我们总是使用UDP来做到这一点,它相对简单。

更重要的是,你的程序只能在局域网工作。如果你想让这些对等体在WLAN中通信,你可能需要像STUN/TURN/ICE这样的NAT穿越工具。

最新更新