我正在制作一个P2P聊天程序。为此,我使用UDP数据报。但我有一些问题。
有时程序的工作没有任何问题。但大多数情况下,两个人中只有一个会收到信息,或者有时两个人都没有收到信息。我正在考虑使用TCP,但我想保留它为P2P,这样就没有中央服务器了。
我的代码:
package herexChatProg;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import javax.swing.JOptionPane;
import login.MainScreen;
public class MessageSender extends Thread {
private int Port;
private String recIP;
private final static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
private MainScreen Screen;
private DatagramSocket ds = null;
private DatagramPacket dp = null;
public MessageSender(MainScreen m, String ip, int port) throws Exception {
recIP = ip;
Port = port;
Screen = m;
System.out.println("chat program: IP address: " + recIP + " port " + Port);
start();
}
public void run() {
try {
// open DatagramSocket to receive
ds = new DatagramSocket(Port);
// loop forever reading datagrams from the DatagramSocket
while (true) {
byte[] buffer = new byte[65000]; // max char length
dp = new DatagramPacket(buffer, buffer.length);
ds.receive(dp);
String s = new String(dp.getData(), 0, dp.getLength());
Screen.writeText(s);
// System.out.println("UDP datagram length " + s.length() + "
// from IP " + dp.getAddress() + " received: " + s);
}
} catch (SocketException se) {
System.err.println("chat error (Socket Closed = good): " + Se.getMessage());
JOptionPane.showMessageDialog(null, "Please check your connection or try to log on again");
} catch (IOException se) {
System.err.println("chat error: " + se.getMessage());
}
}
public void Stop() {
if (ds != null) {
ds.close();
ds = null;
}
}
public boolean sendMessage(String message) throws IOException {
try {
System.out.println("Sending to " + recIP + " socket " + Port + " data: " + message);
byte[] data = message.getBytes();
DatagramSocket theSocket = new DatagramSocket();
DatagramPacket theOutput = new DatagramPacket(data, data.length, InetAddress.getByName(recIP), Port);
theSocket.send(theOutput);
Screen.writeText(message);
return true;
} catch (IOException e) {
return false;
}
}}
如果你们中有人发现这个问题或者能帮我的话那就太好了
谢谢DenTilloZie
发布于 2015-08-09 14:45:55
如果你们中有人发现这个问题或者能帮我的话那就太好了
并非所有消息都到达目的地的“问题”是正常的,因为UDP是不可靠的。这并不是因为您的代码(因为您使用的是UDP而不是TCP)。
如果您想确保每条消息都到达目的地,则有两种可能性。您可以使用TCP而不是UDP,因为TCP保证每条消息到达(并且保证更多)。如果您真的想继续使用UDP,则在接收消息时必须发送确认(向消息的原始发件人)。当发送者收到确认时,他可以确保消息到达目的地。但是,如果使用UDP (message,.),则需要修复许多额外的问题。因此,我建议使用TCP,而不是重新发明轮子。
我正在考虑使用TCP,但我想保留它为P2P,这样就没有中央服务器了。
这是很难做到的。实现对等系统有不同的可能性:
第一种方法是最简单的,但不可能,因为您不需要任何中央服务器。但其他方法则要困难得多。
https://stackoverflow.com/questions/31905170
复制相似问题