在线程中访问 NetworkStream
本文关键字:NetworkStream 访问 线程 | 更新日期: 2023-09-27 18:32:48
我正在编写一个简单的tcp服务器和multible客户端项目。所以我在这里问,我可以访问线程中的网络流吗?为了使它更清晰 il 列出我的代码所做的一些步骤。第一。如果客户端想要连接,我会使用
Thread t2 = new Thread(delegate ()
{
AcceptTcpClient(server, y);//here it gets networkstream using server
});
t2.Start();
服务器是TcpListener server = new TcpListener(IPAddress.Any, 443);
所以我有一个 gui。我可以看到谁已连接到服务器。现在我想获取该网络流,以便我可以进行通信.我在想,当我双击列出客户端的数据网格视图时,它会打开一个表单。但我不知道我到底怎么能访问线程?当客户端连接时,我应该列出它会得到某种 id 并使用该 id 访问线程吗?
tl dr 当我单击 GUI 中的按钮时,我需要来自线程的网络流。
编辑:我需要一个可以保存网络流的地方。就像客户端连接时一样,它会创建一个新的网络流,因此我可以在单击 GUI 时使用它
如果您阅读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
方法。所有其他处理都是正常的。
这可以处理无限数量的客户端,并且是最小的实现。当然,您需要添加异常处理等,但您可以了解图片。