java - 如何在Java套接字中创建接收数据的监听器

标签 java networking

我需要在客户端和服务器之间发送和接收数据。服务器将同时管理多个客户端,因此它需要能够以很小的延迟发送和接收数据。

目前,我可以从客户端向服务器发送和接收数据,但这是按程序完成的,因此如果丢失任何数据,服务器将卡住,直到客户端发送新数据。问题是,如果服务器返回数据,那么服务器和客户端都会卡住,等待对方的数据。

我当前接收和发送数据的方法

    public void run(){
        while(true){
            byte[] data = new byte[1024]; 
            DatagramPacket packet = new DatagramPacket(data, data.length);
            try {
                socket.receive(packet);
            } catch (IOException e) {
                e.printStackTrace();
            }
            System.out.println("SERVER > " +new String(packet.getData()));
        }
    }

    public void sendData(byte[] data){
        DatagramPacket packet = new DatagramPacket(data, data.length, 6969);
        try {
            socket.send(packet);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

理想情况下,我想要像 ActionListener 这样的东西,它可以让我在收到数据时得到一个 Action 。目前,每次接收数据时,它都会运行几个时钟周期。

最佳答案

这就是使用线程的用武之地。在编码方面我对java不太了解,但我认为这会对你有所帮助。 这是服务器端代码

public static void main(String[] args) throws IOException {
    ServerSocket s = new ServerSocket(8000);
    while(true) {
        Socket socket = s.accept();
        HandleClient c = new HandleClient(socket);
        Thread t = new Thread(c);
        t.start();
    }

}

HandleClient代码

public class HandleClient implements Runnable{
Socket socket;

HandleClient(Socket socket){
    this.socket = socket;
}

public void run() {
    try{
        DataInputStream inputFromClient = new DataInputStream(socket.getInputStream());
        DataOutputStream outputToClient = new DataOutputStream(socket.getOutputStream());

        double radius;  

        while(true){
            radius = inputFromClient.readDouble();
            double area = radius * radius * Math.PI;
            outputToClient.writeDouble(area);
        }
    }catch(Exception e) {}
}
}

以及客户端

public static void main(String[] args){
    try{

        //System.out.println(add);
        Socket socket = new Socket("localhost",8000);
        Scanner input = new Scanner(System.in);
        DataInputStream inputFromServer = new DataInputStream(socket.getInputStream());
        DataOutputStream outputToServer = new DataOutputStream(socket.getOutputStream());
        double radius;
        System.out.println("Client running at IP address: "+socket.getLocalAddress().toString() +"and port number: "+socket.getLocalPort());


        System.out.println("Enter the value of radius");
        radius = input.nextDouble();

        System.out.println("Writing input");
        outputToServer.writeDouble(radius);
        System.out.println(inputFromServer.readDouble());
    }catch (Exception E){}
}

它与您正在处理的内容不同,但它只是一个使用线程处理来自客户端的请求的模板。您可以修改它以使您的项目正常运行。

关于java - 如何在Java套接字中创建接收数据的监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56173761/

相关文章:

c - 无线 NIC 如何在硬件级别和功能上工作?

java - Android Studio-通过HTTP连接到服务器的IP和端口

java - 在正则表达式中重用子模式

java - Hazelcast:分布式执行和本地成员信息

java - Android 中带有 fragment 的微调器

windows - python easysnmp packge install error windows..失败,退出状态为2

java - Opencsv - 如何获取仅在双引号外用逗号分隔的值,同时忽略双引号?

java - 如何在 Java 中验证数独网格的有效性?

c++ - 游戏协议(protocol)

c# - 通过网络运行 .net 应用程序