多线程Java套接字

多线程Java套接字,java,Java,我的一位上级要求我把这篇文章,特别是代码,删掉 问题1:客户端未收到消息 解决方案:确保端口与发送的端口匹配 问题2:无法广播消息 解决方案:使用广播地址只需将端口号添加到接收中的数据报套接字。它会很好用的 类-ClientReceive: DatagramSocket socket = new DatagramSocket(4001); 将重用地址设置为true。。 这将使用地址4001 4002..等 socket.setReuseAddresstrue 问题似乎在于DatagramS

我的一位上级要求我把这篇文章,特别是代码,删掉

问题1:客户端未收到消息 解决方案:确保端口与发送的端口匹配

问题2:无法广播消息
解决方案:使用广播地址

只需将端口号添加到接收中的数据报套接字。它会很好用的

类-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是本地网络的广播地址。非常感谢。