首页 文章

Java UDP p2p聊天程序 .

提问于
浏览
0

我正在制作一个P2P聊天程序 . 为此,我使用UDP数据报 . 但我有一些问题 .

有时程序运行没有任何问题 . 但大多数时候,2个人中只有1个接收到该消息,或者有时两个人都没有收到消息 . 我想考虑转向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

1 回答

  • 1

    如果你们中的任何一个发现问题或者可以帮助我那将是很棒的

    并非所有消息到达目的地的“问题”都是正常的,这是因为UDP不可靠 . 这不是由于您的代码(因为您使用的是UDP而不是TCP) .

    如果您想确保每封邮件到达目的地,您有两种可能性 . 您可以使用TCP而不是UDP,因为TCP可以保证每条消息到达(并保证更多) . 如果您真的想继续使用UDP,则必须在收到消息时向该消息的原始发件人发送确认 . 当发件人收到确认时,他可以确定该消息到达目的地 . 但是,如果使用UDP(消息顺序,...),则应该修复许多额外的问题 . 所以我建议使用TCP而不是重新发明轮子 .

    我正在考虑转向TCP但我想保持P2P所以没有中央服务器 .

    这很难实现 . 实现点对点系统有不同的可能性:

    • 有一名中央协调员

    • 洪水泛滥

    • 通过分布式哈希表

    第一种方法是最简单但不可能,因为您明确地不需要中央服务器 . 但其他方法要困难得多 .

相关问题