2016-01-31 4 views
0

Я пишу простой сервер tcp и многопользовательский проект. Так что я здесь, чтобы спросить, могу ли я получить сетевой поток в потоке? Чтобы сделать его более ясным, перечислите некоторые шаги, которые делает мой код. 1-й. Если клиент хочет подключиться я сделать новый поток, используяAcces NetworkStream в потоке

Thread t2 = new Thread(delegate() 
{ 
AcceptTcpClient(server, y);//here it gets networkstream using server 
}); 
t2.Start(); 

Сервер является TcpListener server = new TcpListener(IPAddress.Any, 443);

Так у меня есть графический интерфейс. Я вижу, кто подключился к серверу. Теперь я хотел бы получить этот сетевой поток, чтобы я мог общаться. Я думал, что, когда я дважды нахожусь на моем представлении datagrid, где перечислены клиенты, он откроет форму. Но я не знаю, как, черт возьми, я могу присоединиться к теме? Должен ли я составлять список, когда клиент подключается, он получит некоторый идентификатор id и использует этот идентификатор для доступа к потоку?

tl dr Мне нужен сетевой поток из потока, когда я нажимаю кнопку в GUI.

Редактировать: Мне нужно место, где я могу держать свои сетевые потоки. Например, когда клиент подключается он создает новый поток сети, чтобы я мог использовать его при нажатии на GUI

+0

Звучит как проблема XY. Почему вы хотите использовать Threads и почему вы хотите использовать NetworkStream? Оба вопроса очень легко решить, и на самом деле они не связаны друг с другом. – Aron

+0

Я хочу использовать поток, потому что им довольно новый C# abaut 4 месяца. Поэтому я слышал об асинхронной вещи, но это было немного сложно, и я просто хотел бы учиться медленно и стабильно. Но как вы могли это решить? Мое ухо большое и широкое –

+0

Я работаю профессионально с C# более 6 лет, и мне еще нужно использовать 'new Thread()' – Aron

ответ

0

Если вы читаете документацию TcpListener, вы заметите BeginAcceptTcpClient метод, который делает то, что вы хотите - принять TcpClient асинхронно. Расширяя приведенный здесь пример, вы получите этот код:

private class StreamParameter 
{ 
    public TcpClient Client; 
    public NetworkStream Stream; 
    public byte[] Buffer; 
} 

public void DoBeginAcceptTcpClient(TcpListener listener) 
{ 
    // Start to listen for connections from a client. 
    Console.WriteLine("Waiting for a connection..."); 

    // Accept the connection. 
    // BeginAcceptSocket() creates the accepted socket. 
    listener.BeginAcceptTcpClient(DoAcceptTcpClientCallback, listener); 
} 

// Process the client connection. 
public void DoAcceptTcpClientCallback(IAsyncResult ar) 
{ 
    // Get the listener that handles the client request. 
    TcpListener listener = (TcpListener) ar.AsyncState; 

    // End the operation and display the received data on 
    // the console. 
    TcpClient client = listener.EndAcceptTcpClient(ar); 

    // Start listening for new client right away 
    DoBeginAcceptTcpClient(listener); 

    // Process the connection here 
    NetworkStream stream = client.GetStream(); 

    StreamParameter param = new StreamParamater(); 
    param.Client = client; 
    param.Stream = stream; 
    param.Buffer = new byte[512]; 

    stream.BeginRead(param.Buffer, 0, 512, AsyncReadCallback, param); 
} 


public void AsyncReadCallback(IAsyncResult result) 
{ 
    StreamParameter param = result.AsyncState as StreamParameter; 

    int numBytesRead = param.Stream.EndRead(result); 

    // Normal processing, sending reply, etc. 
} 

Это довольно прямолинейно. Метод BeginXYZ запускает операцию в фоновом режиме и вызывает обратный вызов, когда произошло что-то заметное (например, клиент подключен в BeginAccept или данные вошли в BeginRead).

В обратном вызове вы вызываете соответствующий метод EndXYZ, который заканчивает асинхронный процесс. Вся другая обработка просто нормальная.

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

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