多线程Java套接字
我的一位上级要求我把这篇文章,特别是代码,删掉 问题1:客户端未收到消息 解决方案:确保端口与发送的端口匹配 问题2:无法广播消息多线程Java套接字,java,Java,我的一位上级要求我把这篇文章,特别是代码,删掉 问题1:客户端未收到消息 解决方案:确保端口与发送的端口匹配 问题2:无法广播消息 解决方案:使用广播地址只需将端口号添加到接收中的数据报套接字。它会很好用的 类-ClientReceive: DatagramSocket socket = new DatagramSocket(4001); 将重用地址设置为true。。 这将使用地址4001 4002..等 socket.setReuseAddresstrue 问题似乎在于DatagramS
解决方案:使用广播地址只需将端口号添加到接收中的数据报套接字。它会很好用的 类-ClientReceive:
DatagramSocket socket = new DatagramSocket(4001);
将重用地址设置为true。。 这将使用地址4001 4002..等
socket.setReuseAddresstrue 问题似乎在于DatagramSocket允许您将数据报发送到给定的目的地。在您的情况下,您将发送到localhost,因此所有消息仅发送到本地计算机,而不发送到其他客户端。如果要访问所有网络客户端,应使用广播地址或使用MulticastSocket类代替DatagramSocket
// Client REceive
DatagramSocket socket = new DatagramSocket(null);
socket.setReuseAddress(true);
socket.bind(new InetSocketAddress("127.0.0.1", 4002));
// ClientSEnd
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
socket = new DatagramSocket();
socket.setReuseAddress(true);
import java.net.*;
import java.io.*;
public class ClientSend implements Runnable
{
private Thread t;
private DatagramSocket socket;
private String name;
private String sendingMessage;
private int port;
public ClientSend(int port)
{
this.port = port;
}
public void run()
{
try{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
socket = new DatagramSocket();
socket.setReuseAddress(true);
while(true)
{
sendingMessage = br.readLine();
byte sendingData[] = sendingMessage.getBytes();
InetAddress clientAddress = InetAddress.getByName("224.0.0.3");
DatagramPacket sendingPacket = new DatagramPacket(sendingData, sendingData.length, clientAddress, 4011);
socket.send(sendingPacket);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void start()
{
t = new Thread(this);
t.start();
}
public static void main(String args[]) throws Exception
{
ClientSend CS = new ClientSend(4011);
CS.start();
}
}
导入java.net。;
导入java.io
公共类ClientReceive实现可运行
{
私有线程t
public ClientReceive()
{
}
public void run()
{
try {
// DatagramSocket socket = new DatagramSocket(null);
MulticastSocket socket = new MulticastSocket(4011);
InetAddress group = InetAddress.getByName("10.10.222.120");
socket.joinGroup(group);
//socket.setReuseAddress(true);
//socket.bind(new InetSocketAddress("10.10.222.120", 4011));
while(true)
{
byte receivingData[] = new byte[1024];
DatagramPacket receivingPacket = new DatagramPacket(receivingData, receivingData.length);
socket.receive(receivingPacket);
String receivingMessage = new String(receivingPacket.getData(), 0, receivingPacket.getLength());
System.out.println("Received: " + receivingMessage);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void start()
{
t = new Thread(this);
t.start();
}
public static void main(String args[]) throws Exception
{
ClientReceive CR = new ClientReceive();
CR.start();
}
}我不太确定我做错了。。。这不是很具有描述性。到目前为止,你所实施的有什么问题吗?哦,对不起,含糊不清。似乎数据包已发送,但客户端未收到。感谢您的回复。不幸的是,这没有起作用。我会收到一个错误,说明地址已在使用中:无法绑定该程序可能已在IDE中运行。请终止它并重试。您可以在控制台中找到正在运行的程序。@user3503407这仍然是巨大的进步。所以从这里开始排除故障。我同意!这无疑让我离目标更近了一步。谢谢你的帮助,太棒了!这解决了地址在使用中的错误,并允许我发送和打印消息。它打印出发送的消息,这是一个很大的进步,因为我能够看到客户端实际上发送了一个数据包,也可以接收它,它打印出接收到的消息。现在剩下的问题是网络中的其他客户端没有接收到消息,我不知道为什么。我假设使用本地主机地址可以解决这个问题。嗯,当你说网络中的其他客户机…你这是什么意思…你是在试图从其他机器上运行ClientReceive吗?很抱歉没有向上投票。我是新来的堆栈,它说我需要15卢比,我没有。是的,你说得对。我正在尝试在不同的机器上运行客户端,以便它也可以接收正在发送的消息。这基本上是一个聊天程序,其中显示所有发送的消息。没有关于不向上投票的问题。请参阅当您在网络上时,您需要ip地址来识别机器…因此请在命令提示符下检查ipconfig,获取机器的IP地址,并尝试使用该地址从不同的机器连接…这只是建议没有用于此的代码…您可能必须使用MulticastSocket,并且您的机器IP可能无法工作…我将很快粘贴代码…希望它能在您的机器上工作这很有意义。出于某种原因,我认为localhost是本地网络的广播地址。非常感谢。