2014-01-30 4 views
0

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

сервер ждет подключения

private void ListenForConnection(IPAddress ipAddress) 
{ 

    tcpListener = new TcpListener(ipAddress, portNumber); 
    tcpListener.Start(); 

    client = tcpListener.AcceptTcpClient(); 

    stream = client.GetStream(); 

    stream.ReadTimeout = 200; 

} 

клиент подключения

private void EstablishConnection(IPAddress ipAddress) 
{ 

    client = new TcpClient(); 

    client.Connect(ipAddress, portNumber); 

    stream = client.GetStream(); 

    stream.ReadTimeout = 200; 

} 

клиент написания сообщения

public void SendMessage(String message) 
    { 
     StreamWriter networkWriter = new StreamWriter(stream); 

     networkWriter.Write(message); 

     networkWriter.Flush(); 

    } 

сервер читает сообщение

public String ListenForMessage() 
    { 

     String networkRead = String.Empty; 

     try 
     { 
      networkRead = new StreamReader(stream).ReadToEnd(); 
     } 
     catch (Exception e) { } 

     return networkRead; 

    } 

Отправка и получение идентичны для сервера и клиента. Я собираюсь добавить обработку ошибок больше, когда сообщения работают.

Мне интересно, что, возможно, есть проблема с моей связью. В настоящее время я запускаю 2 экземпляра чат-программы на своей машине, один сервер один клиент. Клиент подключается на 127.0.0.1 (localhost) на порту 8080, когда сервер прослушивает порт 8080. Однако клиент не подключается к 192.168.1.100, который является фактическим ip-адресом моего компьютера, но не уверен, что это может что-то указать.

EDIT: скорректировал запись и чтение использовать потоковый писатель и читатель и флеш

+0

Вам нужно узнать о сети. 'TcpClient' и TCP/IP в целом работают на потоках байтов. Если вы хотите навязать структуру сообщений, вам нужно сделать это самостоятельно. Например, может предшествовать каждому сообщению количество байтов в сообщении. Клиент будет считывать количество байтов, а затем читать следующие «n» байты в качестве сообщения. –

+0

@Saunders Я также пытался использовать StreamReader и StreamWriter, потому что это похоже на структуру сообщений ipoped, но мне не повезло – Centimane

+0

Нет структуры сообщений, если вы не навязываете ее. –

ответ

1

1.First всего, я предлагаю вам, чтобы убедиться, что подключение было действительно установлено между клиентом и сервером.
2.Во время, я предлагаю вам очистить ваш поток после того, как вы напишете, есть механизм кеша, встроенный в Stream, запись в поток не означает, что он будет немедленно отправлять по кабелю.
3.Это хороший способ научиться созданию сетей таким образом, но если вы создаете коммерческий продукт, я предлагаю вам найти некоторые зрелые компоненты с открытым исходным кодом.

+0

(Во-первых, это для учебных целей, а не для коммерческих целей), я думаю, что соединение устанавливается, потому что tcp-слушатель ждет, пока соединение не будет выполнено до перехода через код. код действительно прогрессирует, поэтому я думаю, что соединение в порядке. – Centimane

+0

также, я попробовал добавить поток.flush() после записи без успеха – Centimane

+0

Можете ли вы опубликовать свой проект где-нибудь, чтобы мы могли помочь вам взглянуть. – Johnny

Смежные вопросы