Отправка более одного сообщения на сервер TCP в одном соединении

1

Я создал TCP-сервер в Java и клиент TCP в Ruby. Проблема в том, что я не могу отправить более одного сообщения в одном и том же соединении, только первое сообщение отправляется, а другое не отправляется.

вот код Java

package com.roun512.tcpserver;

import java.io.*;
import java.net.*;

public class Program {


    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {

        String clientSentence;
        String capitalizedSentence;
        ServerSocket Socket = new ServerSocket(6789);

        while(true)
        {
            Socket connection = Socket.accept();
            BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            DataOutputStream outToClient = new DataOutputStream(connection.getOutputStream());
            clientSentence = inFromClient.readLine();
            System.out.println(clientSentence);
            capitalizedSentence = clientSentence + '\n';
            outToClient.writeBytes(capitalizedSentence);
            System.out.println("Sent msg");
        }
    }
}

И вот код клиента

Client.rb

require 'socket'
class Client

        def initialize()
                server = TCPSocket.open("127.0.0.1", 6789)
                if server.nil?
                        puts "error"
                else
                        puts "connected"
                end
                server.puts("Hello\r\n")
                sleep 2
                server.puts("There\r\n")
                server.close
        end
end
Client.new()

Я получаю только Hello. Я пробовал много других способов, но никто не работал.

Поэтому мой вопрос заключается в том, как отправить более одного сообщения в одном соединении, любая помощь будет оценена :)

Заранее спасибо!

  • 4
    Код вашего сервера даже не пытается прочитать более одной строки ввода. Что вы ожидаете от второй строки? Кроме того, потоки TCP не разбиваются на «сообщения». Это поток, который означает, что вы помещаете байты на одном конце и получаете те же байты в том же порядке на другом конце, но концепция границ сообщений отсутствует.
  • 0
    Я попробовал клиент на сервере Battlefield, который использует rcon, и он дал тот же результат ... так что это не сервер. Ох, и сервер только для целей тестирования :)
Теги:
sockets
tcp

1 ответ

4
Лучший ответ

Socket.accept() ждет нового соединения после прочтения первой строки. Попробуйте следующее:

public static void main(String[] args) throws Exception {

    String clientSentence;
    String capitalizedSentence;
    ServerSocket Socket = new ServerSocket(6789);

    while (true)
    {
        Socket connection = Socket.accept();
        while(true)
        {
            BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            DataOutputStream outToClient = new DataOutputStream(connection.getOutputStream());
            clientSentence = inFromClient.readLine();
            System.out.println(clientSentence);
            capitalizedSentence = clientSentence + '\n';
            outToClient.writeBytes(capitalizedSentence);
            System.out.println("Sent msg");
        } 
    }
}

Если он работает, измените значение while (true) на какое-либо значимое условие и не запустите его, чтобы закрыть соединение после завершения работы.

  • 0
    Спасибо, теперь я вижу, что мой клиент не проблема :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню