点击按钮发送网络数据-c#中的线程之间存在冲突

本文关键字:线程 之间 冲突 存在 -c# 数据 按钮 网络 | 更新日期: 2024-10-24 16:04:42

所以我有一个Visual Studio C#WindowsForms程序。它能够在后台打开一个套接字,让tcp客户端加入。然后他们可以交换数据。问题是,向tcp套接字写入数据对我来说是个问题。读取数据是成功的。

所以我的表格1:

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    private TcpListener listener;
    private Socket socket;
    ...
    private void Form1_Load(object sender, EventArgs e)
    {
        comboBox1.SelectedIndex = 0;
        webBrowser1.GoHome();
        const int LIMIT = 1; //5 concurrent clients
        listener = new TcpListener(IPAddress.Any, 8080);
        listener.Start();
        for (int i = 0; i < LIMIT; i++)
        {
            Thread t = new Thread(() => {
               socket = EmployeeTCPServer.accepting(listener, this);
            });
            t.Start();
        }
        toolStripStatusLabel1.Text = "Waiting for Connection";
        listBox1.Items.Add("Waiting");
    }

    ...

    private void button3_Click(object sender, EventArgs e)
    {
        StreamWriter sw = new StreamWriter(new NetworkStream(socket));
        sw.WriteLine("-> Stuff");
    }

接受客户端必须是线程化的,以防表单继续工作,这应该是万恶之源。我的TCP服务器类:

class EmployeeTCPServer
{
    public static Socket accepting(TcpListener plistener, Form1 parent)
    {
        Socket soc = plistener.AcceptSocket();
        parent.SetText("Connection accepted");
        Stream s = new NetworkStream(soc);
        StreamReader sr = new StreamReader(s);
        StreamWriter swa = new StreamWriter(s);
        swa.AutoFlush = true; // enable automatic flushing
        swa.WriteLine("-> Connected to Iface");
        Service(plistener, parent, soc);
        return soc;
    }
    public static void Service(TcpListener plistener, Form1 parent, Socket psoc)
    {
            bool EMPFANG = true;
            Stream s = new NetworkStream(psoc);
            StreamReader sr = new StreamReader(s);
            StreamWriter swa = new StreamWriter(s);
            swa.AutoFlush = true;

            while (EMPFANG)
            {
                string name = sr.ReadLine();
                parent.LBSetText(name);
                if(name=="exit")
                {
                    swa.WriteLine("-> Exit OK");
                    EMPFANG = false;
                }
            }

            psoc.Close();
    }
}

当我点击"Antworten"(按钮3)时,问题崩溃了。它说sw为NULL,这对我来说意味着套接字描述符的返回不起作用。我还尝试在tcp服务器类中创建一个新方法(类似于"send_msg_to_client(string pmessage)"),但后来我不知道如何调用该方法。那么哪种方法是正确的,我如何在点击按钮时发送数据?

提前感谢您的帮助!

点击按钮发送网络数据-c#中的线程之间存在冲突

听起来你想要一个简单的"聊天"系统,在客户端和主机之间发送特定的消息。

试着看看这个项目:http://www.eng.northampton.ac.uk/~espen/CSY2026/CSY2026CSharp5.htm

也许这会给你一些启发。

如果有帮助,请告诉我!