разрывы сообщений сокета java - PullRequest
0 голосов
/ 27 сентября 2011

У меня есть клиент-серверное приложение Java в Java, оба используют один и тот же класс соединения, который содержит оба сообщения отправки / получения.по некоторым причинам, некоторые из сообщений, которые я отправляю, принимаются в неправильном порядке:

вот код

//set up
_in = new BufferedReader(new InputStreamReader(this._socket.getInputStream()));
_out = new BufferedWriter(new OutputStreamWriter(this._socket.getOutputStream()));
this._socket.setSoTimeout(S_TIMEOUT);


public synchronized boolean send(String message){
    try {
        _out.write(message);
        _out.write(Connection.DELIMITER);
        _out.flush();
        return true;
    } catch (IOException e) {
    }
    return false;
}


public String receive(){
    int c;
    try {
        String message = "";
        System.out.println("Getting message:");
        c = _in.read();
        while(c != -1 && c != Connection.DELIMITER) {
            message += (char) c;
            c = _in.read();
        }
        if (c == -1) {
            return null;
        }
        return message;
    } catch (IOException e) { }
    return null;
}

некоторые сообщения, например, «new_order» может возвращаться с «ew_ord»,некоторые символы теряются, другие отправляются отдельно.это кажется странным, поскольку его TCP

может ли это быть проблемой, связанной с кодировкой?

Разделитель равен (char) 0 времени ожидания сокета равно 20000 (то есть 20 секунд).каждые 10 секунд я отправляю пустое сообщение, чтобы убедиться, что сокет не закрывается

РЕДАКТИРОВАТЬ: хотя это было решено с помощью сканера, я должен сказать, что оригинальный код работал очень хорошо для многих сообщений / различных машин в течение очень долгого временивремя (несколько недель), а затем вдруг не удалось работать с одним конкретным сообщением на одном конкретном компьютере (другие сообщения проходили просто отлично).Я сделал передачу данных сокета в Java много раз, и я написал много методов чтения / записи для обработки сокетов.это первый раз, когда я столкнулся с этим.

, хотя в исходном коде я установил кодировку (в опубликованном коде я этого не сделал), я считаю, что проблема связана с кодировкой.в какой-то момент в полученном сообщении пропал каждый второй символ.потом я немного его изменил, и первый / второй символ сообщения были получены в отдельном сообщении.Насколько я понимаю, это проблема кодирования или какая-то брандмауэр / другая программа безопасности, которая работала на компьютере отправителя сообщения и который решил отфильтровать исходящие пакеты.

Ответы [ 3 ]

4 голосов
/ 27 сентября 2011

Попробуйте заменить ваш прием сканером, и пусть он сделает всю работу за вас.

// in your setup
Scanner sc = new Scanner(_in).useDelimiter(Connection.DELIMETER);

public String receive() {
    try {
        return sc.next();
    } catch(IOException e) {
        return "";
    }

}
0 голосов
/ 28 сентября 2011

Вы можете использовать кодировку UTF для получения полной строки сообщения.

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

String data=" ";

socket = new Socket("localhost",999);
while(true)
        {
           dos = new DataOutputStream(socket.getOutputStream());
           dis =  new DataInputStream(socket.getInputStream());
           data = dis.readUTF();
           jta.append(data +"\n");
        }

Где jta - JTextArea.

Это на стороне клиента

Теперь для серверной части:

try
{

server = new ServerSocket(999);     

Socket  soc = server.accept();  

        while(true)
        {
            String data="";
            try
            {                   
                dis = new DataInputStream(soc.getInputStream());
                dos = new DataOutputStream(soc.getOutputStream());
                data = dis.readUTF();
            }
            catch(Exception e)
            { }
            jta.append(data + "\n");
        }
    }
    catch (IOException e) 
    {
        JOptionPane.showMessageDialog(this, e);
        System.exit(-1);
    }
0 голосов
/ 27 сентября 2011

Для начала я бы позаботился о том, чтобы вы печатали исключения в этих блоках перехвата.

Затем вы используете кодировку платформы по умолчанию для преобразования символов в байты.Если эти два процесса выполняются на разных машинах, возможно, они используют разные кодировки.Я бы удостоверился, что вы задаете кодировку при настройке Reader и Writer.

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