java udp p2p 聊天_Java UDP p2p聊天程序 .

本文介绍了一个Java实现的UDP P2P聊天程序遇到的问题,即通信不稳定,有时只有一方或双方都无法接收到消息。作者考虑保持P2P特性,因此不倾向于切换到TCP。代码中展示了数据报的接收和发送过程,但存在潜在的可靠性问题。作者希望社区能提供帮助和解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我正在制作一个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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值