在线程中访问 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 时使用它

在线程中访问 NetworkStream

如果您阅读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 方法。所有其他处理都是正常的。

这可以处理无限数量的客户端,并且是最小的实现。当然,您需要添加异常处理等,但您可以了解图片。