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

时间:2018-01-03 09:31:38

标签: c# winforms tcpclient

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

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

在某些时候,我的应用程序打开第二个表单,其中包含一些选项的列表框,我想双击其中一个选项并将内容写入初始流。我尝试使用新的读写器在同一端口上创建一个新的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");

    }

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

1 个答案:

答案 0 :(得分:0)

就像你一样,我不是C#的专家,我只是作为一个爱好编程而且我是自学成才。所以也许有更好的方法来做到这一点,但这就是我自己接近它的方式。

为您的项目添加一个新类:

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类中的静态函数并调用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");
    }

}

使用staticclient类中声明Shared意味着它没有被类的实例引用。因此,在访问它之前不必执行Shared sharedClass = new Shared();,如果您创建了共享类client的2个实例,则只有一个实例可供该类的两个实例访问。 / p>