2013-04-29 3 views
0

Я достигли отправки сервера сообщений -> сервера и фактически подключил многие клиенты одновременно. Но то, что я хочу сделать, это, например, подключить 2 клиента и заставить их общаться между собой. И если подключается третий клиент, то он начинает общаться с обоими другими клиентами.C# - потоковая передача клиента на многопоточном сервере

К настоящему времени я нахожусь на этапе чата client-> server-> client отдельно от другого c-> s-> c. Что происходит - я запускаю client1, и все в порядке. Затем я запускаю client2, и с ним все в порядке, но 1-й клиент перестает работать, а затем первое сообщение, которое я получаю на втором клиенте, является последним сообщением, которое я отправил с client1 (но на самом деле не получил его обратно от сервера). Итак, я полагаю, что есть проблемы с потоками - что 2 клиента каким-то образом приобретают потоки друг друга. Вот некоторые части сервера (соответствующие них): TheServer

HandleClientComm (объект клиента) обрабатывает операции Receive-отправителя.

А вот на стороне клиента часть кода, который обрабатывает полученные-отправить операции: TheClient

И я получаю An unhandled exception of type 'System.OutOfMemoryException' occurred... в в сервере на Byte[] bData = new Byte[BitConverter.ToInt32(bSize, 0)];

ооочень ... да, есть что-то не так с потоками (по моему мнению). Но я действительно не знаю, как заставить сервер правильно различать потоки клиентов.

Я открыт для любых предложений.

P.S. Я не размещаю код прямо здесь, потому что он будет слишком длинным.

ответ

1

Это первая часть HandleClientComm():

private void HandleClientComm(object client) 
{ 
    TcpClient tcpClient = (TcpClient)client; 
    NetworkStream stm = clientList[n].GetStream(); 
    msg = new TheMessage(); 

Вы имеете tcpClient, который клиент вы послали в качестве параметра, но NetworkStream не для что клиента, но для clientList[n] и n - это переменная класса. Позже в этом методе, в цикле while, вы используете:

stm = clientList[n].GetStream(); 

Как только вы увеличиваете n, все потоки, работающие HandleClientComm() будут получать и отправлять сообщения от/до последнего клиента.

NetworkStream вы используете в HandleClientComm() должны быть созданы из tpcClient вместо этого, так что каждый поток работает HandleClientComm() служит его собственный клиент:

stm = theClient.GetStream(); 
+0

Спасибо, это сработало! :) Теперь осталось сделать чат между клиентами, и если у меня есть 4 клиента, то сделайте каждый клиент найти другую конечную точку, а не смешивать между более чем двумя клиентами. Но это я выясню (надеюсь ...). :) – Milkncookiez

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

  • Нет связанных вопросов^_^