StreamReader в NetworkStream не читает строку

Я пытаюсь создать класс для простых клиент-серверных подключений. Внутри этого класса находится клиент на стороне сервера, но он не будет принимать данные, записанные на сервер NetworkStream. Если вам интересно, я намереваюсь, чтобы все данные проходили через серверную программу, прежде чем отправлять их клиенту, поэтому мне нужно что-то для обработки всех данных в NetworkStream (отсюда клиент на стороне сервера). Вот мой класс:

public class ConnectionServer
{
    public readonly IPAddress ServerIP;
    public readonly IPAddress LocalIP;
    public readonly int Port;
    private TcpListener ServerIn;
    private Socket ServerSocket;
    private TcpClient ServerSideClient;
    private NetworkStream NetStream;
    public StreamReader ServerInput;
    public StreamWriter ServerOutput;

    public ConnectionServer(int port)
    {
        try
        {
            Port = port;
            ServerIP = IPAddress.Parse(NetHelper.GetPublicIP());
            LocalIP = IPAddress.Parse(NetHelper.GetLocalIP());

            ServerIn = new TcpListener(IPAddress.Any, Port);
            ServerIn.Start();                
            Console.WriteLine("Server Started At: " + ServerIP.ToString() + ":" + Convert.ToString(Port));
            ServerSideClient = new TcpClient("localhost", Port);
            ServerSocket = ServerIn.AcceptSocket();
            Console.WriteLine("Server-Side Client Socket Accepted.");
            NetStream = ServerSideClient.GetStream();
            ServerInput = new StreamReader(NetStream);
            ServerOutput = new StreamWriter(NetStream);
            ServerOutput.AutoFlush = true;
            Console.WriteLine("All Streams Initialized.");
            ServerOutput.WriteLine("Testing Server-Side Client.");                
            Console.WriteLine("Test Message Sent.");
            Console.WriteLine(ServerInput.ReadLine());
        }

        finally
        {

        }
    }

    ~ConnectionServer()
    {
        ServerInput.Dispose();
        ServerSideClient.Close();
    }

}

Он ничего не пишет на Console.WriteLine(ServerInput.ReadLine());. Я не могу понять, почему он не получает сообщение из потока. Помогите, пожалуйста?


person cubician    schedule 13.06.2013    source источник
comment
Какие данные вы отправляете? Он заканчивается новой строкой?   -  person CodeCaster    schedule 13.06.2013
comment
ServerSocket — это один клиент, который подключился к вам. Попробуйте прочитать это с помощью .Read(). ServerSideClient - это просто петля, которая вам, вероятно, не нужна. (и, вероятно, скрывает любые настоящие внешние связи)   -  person    schedule 13.06.2013


Ответы (1)


Ваша непосредственная проблема заключается в том, что вы пытаетесь использовать один и тот же поток для чтения и записи. NetStream — входной поток — данные от клиента. Если вы хотите писать в сокет, вам нужно создать поток из сокета.

Как написано, вы пишете в клиентский поток. Вам нужно писать в поток сервера.

Чего я не понимаю, так это почему вы используете TcpClient на стороне клиента и необработанные сокеты на стороне сервера после создания файла TcpListener. Лучше использовать AcceptTcpClient. Затем вы можете писать в поток этого клиента и читать из другого потока.

Чтобы создать NetworkStream из сокета, используйте конструктор. Однако я настоятельно рекомендую вместо этого переключиться на AcceptTcpClient.

person Jim Mischel    schedule 13.06.2013
comment
Итак, как мне создать поток из сокета? (Я новичок в сети С#) - person cubician; 14.06.2013
comment
Я попробовал оба, и это не сработало для меня ... но опять же, это моя первая попытка создания сети на C #, поэтому имеет смысл только то, что 1. Это не удается, 2. Это небрежно собрано. Я попробую еще раз с нуля, но на этот раз я буду использовать AcceptTcpClient() и помнить о других советах. Спасибо за вашу помощь, и я обновлю, если у меня возникнут проблемы в будущем. - person cubician; 14.06.2013