繁体   English   中英

多线程Java套接字

[英]Multithreading Java Socket

我的上司曾要求我删除这篇文章,尤其是代码

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

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

只需将端口号添加到接收中的数据报套接字即可。 它将正常工作。

类-ClientReceive:

  DatagramSocket socket = new DatagramSocket(4001);
// 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);

将重用地址设置为true ..将使用该地址,无论它是4001 4002..etc

socket.setReuseAddress(true);

问题似乎在于DatagramSocket允许您将数据报发送到给定的目的地。 在您的情况下,您将发送到localhost,以便所有消息仅发送到本地计算机,而不发送到其他客户端。 如果要访问所有网络客户端,则应使用广播地址或使用MulticastSocket类代替DatagramSocket。

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实现Runnable {私有线程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();

}

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM