分布式系统(Java)中的多线程客户端和服务器



我是套接字编程的新手,我试图在服务器和客户端之间建立通信,但我不知道该怎么做,我对如何去做有点困惑。我已经在下面编写了程序,但它被错误了,我无法理解为什么。

package server;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Server {

    public static void main(String[] args) {
        // TODO code application logic here
        try {
                DatagramSocket socket = new DatagramSocket(7000);
                socket.setSoTimeout(0);
                while(true)
                {
                    byte []buffer = new byte[1024];
                    DatagramPacket packet = new DatagramPacket(buffer,buffer.length);
                    socket.receive(packet);
                    String message = new String (buffer);
                    System.out.println(message);
                    String Reply ="Am here";
                    DatagramPacket data = new DatagramPacket(Reply.getBytes(), Reply.getBytes().length, packet.getAddress(), packet.getPort());
                    socket.send(data);
                }
        }
        catch (Exception error){
            error.printStackTrace();
        }  
    }
}

客户

package client;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class Client {

    public static void main(String[] args) {
        // TODO code application logic here
        try{
            String message = "Hello Server";
            String host = "localhost";
            InetAddress addr = InetAddress.getByName(host);
            DatagramPacket packet = new DatagramPacket(message.getBytes(), message.getBytes().length, addr, 7000);
            DatagramSocket socket = new DatagramSocket(4000);
            socket.send(packet);
            DatagramSocket sockets = new DatagramSocket(7000);
            sockets.setSoTimeout(0);
            while(true)
            {
                byte []buffer = new byte[1024];
                DatagramPacket packets = new DatagramPacket(buffer,buffer.length);
                sockets.receive(packets);
                String messages = new String (buffer);
                System.out.println(messages);
                }
            }
            catch (Exception error){
                error.printStackTrace();
            }
    }
}

我怎样才能让他们沟通。我听说过多线程,但无法了解它是如何工作的。

我收到以下错误。

java.net.BindException: Address already in use: Cannot bind
    at java.net.DualStackPlainDatagramSocketImpl.socketBind(Native Method)
    at java.net.DualStackPlainDatagramSocketImpl.bind0(DualStackPlainDatagramSocketImpl.java:84)
    at java.net.AbstractPlainDatagramSocketImpl.bind(AbstractPlainDatagramSocketImpl.java:93)
    at java.net.DatagramSocket.bind(DatagramSocket.java:392)
    at java.net.DatagramSocket.<init>(DatagramSocket.java:242)
    at java.net.DatagramSocket.<init>(DatagramSocket.java:299)
    at java.net.DatagramSocket.<init>(DatagramSocket.java:271)
    at client.Client.main(Client.java:32)

如果要使用套接字从客户端向服务器发送/接收,请在服务器端使用 ServerSocket。

然后使用接受 - 这将侦听要与此套接字建立的连接并接受它。

Accept返回的 Socket 对象具有可以读取和写入的输入和输出流。

客户端将只使用套接字对象

有关示例,请参阅 http://cs.lmu.edu/~ray/notes/javanetexamples/

如果出于某种原因您坚持使用 DatagramSocket,请参阅此示例 https://docs.oracle.com/javase/tutorial/networking/datagrams/clientServer.html

发生此错误的原因是您尝试将套接字绑定到的端口已在使用中。端口 7000 由客户端和服务器使用:

DatagramSocket sockets = new DatagramSocket(7000);

最新更新