使用来自 2 种不同形式的相同 tcp 客户端

Using the same tcp client from 2 different forms

我正在我的主窗体上创建一个 tcpClient,我正在读写一个 irc 服务器。

tcpClient = new TcpClient(serverName, 6667);
reader = new StreamReader(tcpClient.GetStream());
writer = new StreamWriter(tcpClient.GetStream());
writer.AutoFlush = true;

有时我的应用会打开第二个表单,其中包含一些选项的列表框,我想双击其中一个选项并向初始流写入一些内容。我曾尝试在同一端口上使用新的 reader 和 writer 创建一个新的 tcpClient,但这似乎不起作用。

    private void listBox_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        SendMessage("some message");
    }

    private void SendMessage(string message)
    {
        TcpClient tcpClient;
        StreamReader reader;
        StreamWriter writer;            
        string serverName = "chicago.il.us.undernet.org";
        tcpClient = new TcpClient(serverName, 6667);
        reader = new StreamReader(tcpClient.GetStream());
        writer = new StreamWriter(tcpClient.GetStream());
        writer.AutoFlush = true;
        writer.WriteLine("PRIVMSG #chan :" + message + "\r\n");

    }

有人能给我指出正确的方向吗?

就像你一样,我不是 C# 方面的专家,我只是出于业余爱好而自学编程。所以也许有更好的方法来做到这一点,但这就是我自己的方法。

像这样向您的项目添加一个新的 class:

namespace Test //If you copy this, remember to change the namespace to match your application
{
    class Shared
    {
        public static TcpClient client = new TcpClient(“server”, 6667);

        //OR do this and use the Connect method to connect later (see below)
        public static TcpClient client = new TcpClient();
    }
}

如果您使用第二个声明,您稍后可以在加载表单或单击按钮等时从任何表单连接(您只需要连接一次)。使用此:

Shared.client.Connect(serverName, 6667);

然后在您的两个表单中,您可以执行以下操作。或者,如果两种形式的 SendMessage() 函数相同,您始终可以在 Shared class 中将其设为静态函数并调用 Shared.SendMessage("your message");.

private void SendMessage(string message)
{

    if (Shared.client.Connected)
    {
        StreamReader reader;
        StreamWriter writer;

        reader = new StreamReader(Shared.client.GetStream());
        writer = new StreamWriter(Shared.client.GetStream());
        writer.AutoFlush = true;
        writer.WriteLine("PRIVMSG #chan :" + message + "\r\n");
    }

}

使用staticShared中声明client class意味着它没有被class的实例引用。因此,您不必先执行 Shared sharedClass = new Shared(); 即可访问它,如果您制作了 Shared class client 的 2 个实例,则只有一个实例可供两个实例访问class.