TCP клиент / сервер связи только отправляет первое сообщение? - PullRequest
3 голосов
/ 23 августа 2011

Я настраиваю простое взаимодействие клиента TCP с сервером в java.

Сервер:

Сервер является клиентом для настольного компьютера, написанным на Java:

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

class TCPServer
{
    public static int PORT_NUMBER = 6129;

    public static void main(String argv[]) throws Exception
    {
        String clientMessage;
        ServerSocket welcomeSocket = new ServerSocket(PORT_NUMBER);

        while (true)
        {
            Socket connectionSocket = welcomeSocket.accept();

            BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));

            DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());

            clientMessage = inFromClient.readLine();

            System.out.println("Received: " + clientMessage);

            outToClient.writeBytes("I received this: "+ clientMessage +"\n");
        }
    }
}

Клиент:

Клиент - это приложение для Android, которое подключается к серверу по протоколу TCP.В клиенте у меня есть метод sendMessage(String msg), который пытается отправить сообщение на сервер.

public static void sendMessage(String msg) throws IOException
{
    if (mainSocket == null)
    {
        return;
    }
    if (!mainSocket.isConnected())
    {
        connectSocket();
    }
    PrintWriter output = new PrintWriter( mainSocket.getOutputStream());
    output.println(msg);
    output.flush();
    System.out.println(msg);
}

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

Вот что видит сервер:

Received: message 1

Нет активности долгое времяtime ...
Затем я закрываю клиент

Received: message 2 message 3 message 4 message 5 etc..

Я помещаю println в метод sendMessage (), и сам метод вызывается в режиме реального времени.

1 Ответ

6 голосов
/ 23 августа 2011

Вам необходимо явно close() ваш PrintWriter на стороне клиента каждый раз, когда вы отправляете сообщение.То же самое на стороне сервера, когда вы закончите читать inFromClient, и снова, когда вы закончите писать в outToClient.

См. Также этот базовый пример , они объясняют базовый рабочий процесс довольнокрасиво:

Тем не менее, основы почти такие же, как в этой программе:

Откройте сокет.

Откройте входной поток и выходной поток длясокет.

Чтение и запись в поток в соответствии с протоколом сервера.

Закрытие потоков.

Закрытие сокета.

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