Java Socket потребляет 100% ЦП, когда начал получать запрос клиента - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть сокет, который потребляет 100% ЦП, один клиент всегда отправляет данные на сервер около 4096 байт, на стороне сервера я хочу получить данные клиента и преобразовать их в реальную форму и сохранить в базе данных. Клиент отправляет данные через каждые 3 секунды. Я сделал следующий код, чтобы получить запрос клиента.

    ServerSocket waiting = new ServerSocket(18800, 50, InetAddress.getByName("192.20.50.102"));
    while(true) {
       Socket socket = waiting.accept(); 
       new SessionHandler(socket).start();
    }

Код клиента написан на C, поэтому типы данных отличаются от Java, поэтому мне нужно преобразовать полученные байты в фактическую форму и вставить в базу данных. Код класса потока в соответствии с:

public class SessionHandler extends Thread {

private Socket socket;

public SessionHandler(Socket socket) {
    this.socket = socket;
}

public void run() {
    DataInputStream dataInputStream;
    try {
        dataInputStream = new DataInputStream(socket.getInputStream());
        int tcCode = dataInputStream.readInt();
        int length = dataInputStream.readInt();
        if (tcCode == 1001) {
            System.out.println("in 1001");
            byte[] messageByte = new byte[length];
            int totalBytesRead = 0;
            while (totalBytesRead < length) {
                int currentBytesRead = dataInputStream.read(messageByte, totalBytesRead, length - totalBytesRead);
                totalBytesRead = currentBytesRead + totalBytesRead;
            }
            ByteBuffer buffer = ByteBuffer.wrap(messageByte);
            ShortBuffer shortBuffer = buffer.asShortBuffer();
            short[] values = new short[length / 2];
            shortBuffer.get(values);
            TCCodeOneOOOne tcCodeOneOOOne = new TCCodeOneOOOne(values);
            tcCodeOneOOOne.main(null);
        } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

1 Ответ

0 голосов
/ 05 ноября 2019

попробуйте следующим образом:

ServerSocket waiting = new ServerSocket(18800, 50, InetAddress.getByName("192.20.50.102"));
Socket socket = waiting.accept(); 
new SessionHandler(socket).start();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...