Связь между клиентом и сервером через сокеты - PullRequest
0 голосов
/ 17 апреля 2011

Хорошо, это пересмотренный вопрос, сделанный ранее сегодня, я включил код, чтобы помочь объяснить проблему. Я отправляю два сообщения от клиента на сервер. Затем сервер берет сообщения и обрабатывает их. Сервер наконец пытается отправить сообщение обратно клиенту (обратите внимание на код сервера «testmessage»), именно здесь у меня возникают проблемы. Либо я не получаю сообщение на стороне клиента, либо неправильно отправляю его со стороны сервера.

public class ClientConnection {

String address, language, message;
int portNumber;
Socket clientSocket = null;

public ClientConnection(String lan, String mes, String add, int pn) throws IOException{
    address = add;
    portNumber = pn;
    language = lan;
    message = mes;
}
public String createAndSend() throws IOException{
    // Create and connect the socket
    Socket clientSocket = null;
    clientSocket = new Socket(address, portNumber);
    PrintWriter pw = new PrintWriter(clientSocket.getOutputStream(),true);
    BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));     

    // Send first message - Message is being correctly received
    pw.write(language+"\n"); 
    pw.flush(); 
    // Send off the data  

    // Send the second message - Message is being correctly received
    pw.write(message); 
    pw.flush();
    pw.close();
    // Send off the data

    // NOTE: Either I am not receiving the message correctly or I am not sending it from the server properly.
    String translatedMessage = br.readLine();       
    br.close();
    //Log.d("application_name",translatedMessage); Trying to check the contents begin returned from the server.
    return translatedMessage;
}

Код сервера:

public class ServerConnection {

public static void main(String[] args) throws Exception {       
    // Delete - Using while loop to keep connection open permanently.
    boolean status = false;
    while( !status){
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(4444);
        } catch (IOException e) {
            System.err.println("Could not listen on port: 4444.");
            System.exit(1);
        }
        Socket clientSocket = null;
        try {
            clientSocket = serverSocket.accept();
        } catch (IOException e) {
            System.err.println("Accept failed.");
            System.exit(1);
        }
        // Delete - Working as of here, connection is established and program runs awaiting connection on 4444
        BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));     
        String language = br.readLine();
        String message = br.readLine();
        // Test - Works
        System.out.println(language);      
        // Test - Works
        System.out.println(message);
        // Delete - Working as of here, both messages are passed and applied. Messages are received as sent from client.
        TranslateMessage tm = new TranslateMessage();
        String translatedMessage = tm.translateMessage(language, message);

        // NOTE: This seems to be where I am going wrong, either I am not sending the message correctly or I am not receiving it correctly..
        // PrintWriter writer = new PrintWriter(new BufferedOutputStream(clientSocket.getOutputStream()));
        PrintWriter pw = new PrintWriter(clientSocket.getOutputStream(),true);
        // Send translation back 
        System.out.println(translatedMessage);
        // pw.write(translatedMessage+"\n"); 
        pw.write("Return test"); // Test message!
        pw.flush(); 
        // Send off the data 
        pw.close();
        br.close();
        clientSocket.close();
        serverSocket.close();
    }
}
}

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

Спасибо за любую помощь!

1 Ответ

1 голос
/ 17 апреля 2011

Вы используете BufferedReader.readLine () для чтения ответа с сервера, но в тестовом примере вы отправляете строку, которая не заканчивается на \ n или \ r \ n, поэтому она не получит строкунасколько я могу судить по документам ...

public String readLine()
            throws IOException

Read a line of text. A line is considered to be terminated by any one of a line feed ('\n'), a carriage return ('\r'), or a carriage return followed immediately by a linefeed.

Returns:
    A String containing the contents of the line, not including any line-termination characters, or null if the end of the stream has been reached

Дополнительное предложение ...

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

В Java вы можете использовать ByteBuffer.order () для обработки бигендовых чисел.

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