Как создать слушатель для получения данных в сокете Java - PullRequest
0 голосов
/ 16 мая 2019

Мне нужно отправлять и получать данные между клиентом и сервером. Сервер будет управлять несколькими клиентами одновременно, поэтому он должен иметь возможность отправлять и получать данные с небольшой задержкой.

В данный момент я могу отправлять и получать данные от клиента на сервер, но это делается процедурно, поэтому, если какие-либо данные будут потеряны, сервер остановится, пока клиент не отправит новые данные. Проблема в том, что если сервер возвращает данные, то и сервер, и клиент будут зависать в ожидании данных от другого.

Мои текущие методы получения и отправки данных

    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, которое позволит мне получать действие при получении данных. В данный момент он будет запускать пару тиков каждый раз, когда получает данные.

1 Ответ

1 голос
/ 16 мая 2019

Это то место, где приходит использование потоков. Я не большой в 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){}
}

Это не то же самое, что вы работаете, но этопросто шаблон для использования потоков для обработки запросов от клиентов.Вы можете изменить это, чтобы ваш проект работал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...