首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java p2p聊天程序。

Java p2p聊天程序。
EN

Stack Overflow用户
提问于 2015-08-09 14:14:40
回答 1查看 2.3K关注 0票数 0

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

有时程序的工作没有任何问题。但大多数情况下,两个人中只有一个会收到信息,或者有时两个人都没有收到信息。我正在考虑使用TCP,但我想保留它为P2P,这样就没有中央服务器了。

我的代码:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2015-08-09 14:45:55

如果你们中有人发现这个问题或者能帮我的话那就太好了

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

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

我正在考虑使用TCP,但我想保留它为P2P,这样就没有中央服务器了。

这是很难做到的。实现对等系统有不同的可能性:

  • 用一个中央协调器
  • 浸水
  • 通过分布式哈希表

第一种方法是最简单的,但不可能,因为您不需要任何中央服务器。但其他方法则要困难得多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31905170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档