【问题标题】:Send and receive data in c# network programming winformc#网络编程winform中收发数据
【发布时间】:2020-06-12 10:07:02
【问题描述】:

我有一个小型服务器,它接收并将消息发送回客户端。 这是客户端 当我打开客户端时,它将通过 Connect() 连接到服务器

public Form1()
            {
                InitializeComponent();
                Connect();
                CheckForIllegalCrossThreadCalls = false;
            }

这是我的连接

void Connect()
            {
                ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9999);
                server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                try
                {
                    server.Connect(ipep);
                }
                catch (SocketException e)
                {
                    MessageBox.Show(Convert.ToString(e));           
                }
                Thread listen = new Thread(Receive);
                listen.IsBackground = true; ;
                listen.Start();
            }

我有这样的收货

void Receive()
            {
                datarec = new byte[1024];
                try
                {
                    while (true)
                    {
                        string StringData;
                        rec = server.Receive(datarec);
                        StringData = Encoding.ASCII.GetString(data, 0, rec);
                        txtShow.Text = StringData;
                    }
                }
                catch
                {
                    Close();
                }
            }

我通过一个按钮发送数据有发送方法

void Send(string s)
            {
                data = new byte[1024];
                data = Encoding.ASCII.GetBytes(s);
                server.Send(data, data.Length, SocketFlags.None); 
            }

发送按钮

private void button1_Click(object sender, EventArgs e)
            {
                string s = txtText.Text;
                Send(s);          
            }

这是服务器端 我有一个线程服务器

public static void Process(Socket client)
            {
                byte[] data = new byte[1024];
                int recv;
                string dataInput;
                IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
                Console.WriteLine("Connected with {0} at port {1}", clientep.Address, clientep.Port);             

                while (true)
                {
                    try
                    {                   
                         recv = client.Receive(data);
                        dataInput = Encoding.ASCII.GetString(data, 0, recv);
                        Console.WriteLine(dataInput);
                        client.Send(data);
                    }
                    catch (SocketException e)
                    {
                        Console.WriteLine(e);
                    }

} } 这是服务器主要 公共静态无效 Main() {

            byte[] rec = new byte[1024];
            IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9999);
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            server.Bind(ipep);
            server.Listen(10);

            Console.WriteLine("Waiting for client...");
            Console.WriteLine("LOG CHAT");
            while (true)
            {
                Socket client = server.Accept();
                Core core = new Core();
                Thread t = new Thread(() => Core.Process(client));
                t.Start();
            }
        }

服务器接收到消息,但是当它发回消息时出现错误“已建立的连接已被主机中的软件中止” 你们能告诉我我哪里错了吗?我该如何解决?

【问题讨论】:

    标签: c# winforms network-programming


    【解决方案1】:

    当您在服务器代码中调用 client.Send(data) 时,您会将整个 1024 字节缓冲区发送回客户端,而不仅仅是接收到的数据。 处理此垃圾时,客户端中的 Encoding.ASCII.GetString 可能会失败,并且异常将关闭连接。

    尝试将client.Send(data) 替换为client.Send(data, recv, SocketFlags.None)

    此外,您不应直接从后台线程更新 UI 控件,为此请使用 Control.Invoke。否则也会抛出异常并关闭连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-21
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      相关资源
      最近更新 更多