在c#网络编程winform中发送和接收数据

在c#网络编程winform中发送和接收数据,c#,winforms,network-programming,C#,Winforms,Network Programming,我有一个小型服务器,接收并将消息发送回客户端。 这是客户端 当我打开客户端时,它将通过connect()连接到服务器 这是我的连接 void Connect() { ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9999); server = new Socket(AddressFamily.InterNetwork, SocketType.Strea

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

这是我的连接

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);
                    }
} } 这是主服务器 公共静态void 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();
            }
        }
服务器接收到消息,但当它发送回消息时,出现错误“已建立的连接被主机中的软件中止”
你们能告诉我哪里出了错,我该如何修复它吗?

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

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


此外,您不应直接从后台线程更新UI控件,请使用。否则还会引发异常并关闭连接。

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

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

此外,您不应该直接从后台线程更新UI控件,用于此。否则还会引发异常并关闭连接

            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();
            }
        }