C#实现客户端与服务器的TCP通讯

本文档详细介绍了使用C#实现TCP客户端与服务器的通讯过程,包括客户端和服务器的界面设计,连接与接收数据的步骤,以及在实际操作中可能遇到的问题和解决策略,如线程中操作界面控件的限制、错误处理、接收数据的循环判断等。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

实现多个客户端与一个服务器之间的通讯,界面使用Windows窗体应用程序生成


一、客户端与服务器界面

#1、客户端界面如下:客户端界面
功能1: 输入IP和端口号点击“connect”按钮实现客户端与服务器的连接(服务器处于监听状态),提示显示在第一个textbox中
功能2:在第二个textbox中输入要发送的内容,点击“发送"按钮,实现数据的发送,提示显示在第一个textbox中

#2、服务器界面如下:
服务器界面
功能1:输入端口号,点击”开始监听“按钮,等待客户端的连接,提示显示在第一个textbox中
功能2:选中combox中的ip和端口号,在第二个textbox中输入要发送的内容,点击”发送“按钮,蒋数据发送到对应的客户端,提示显示在第一个textbox中

二、客户端与服务器的连接、接收数据

1.服务器”开始监听“

等待客户端的连接,连接成功后一直接收客户端发来的消息

代码如下(示例):

		/// <summary>
        /// 开始监听
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            //创建用于监听的socket
            Socket socketwatch = new Socket(SocketType.Stream, ProtocolType.Tcp);
            IPAddress ip = IPAddress.Any;
            IPEndPoint point = new IPEndPoint(ip,Convert.ToInt32(textBox1.Text));
            
            //监听
            socketwatch.Bind(point);
            socketwatch.Listen(10);
            showmsg("监听成功");
            
            //开辟新线程一直监听客户端的连接
            Thread th = new Thread(Listen);
            th.IsBackground = true;
            th.Start(socketwatch);
            
        }

        /// <summary>
        /// 开辟新的线程一直监听客户端的连接
        /// </summary>
        Socket socketsend;
        void Listen(object o)
        {
            Socket socketwatch = o as Socket;
            while(true)
            {
                //等待客户端的连接,并创建一个用于通信的socket
                socketsend = socketwatch.Accept();
                showmsg(socketsend.RemoteEndPoint.ToString() + ": 连接成功");
                
                //开辟新的后台线程一直接收客户端发来的消息
                Thread th = new Thread(receive);
                th.IsBackground = true;
                th.Start(socketsend);
            }
        }

        //定义键值对将ip和对应的通讯socket存入
        Dictionary<string, Socket> dicSocket = new Dictionary<string, Socket>();

        /// <summary>
        /// 接收客户端发来的消息
        /// </summary>
        /// <param name="o"></param>
        public void receive(object o)  //线程中传递变量必须是object类型
        {
            Socket socketsend = o as Socket;
            
            //将连接的ip和对应的socket存入键值对
            dicSocket.Add(socketsend.RemoteEndPoint.ToString(), socketsend);
            
            //将连接的ip和端口号存入combox中
            comboBox1.Items.Add(socketsend.RemoteEndPoint.ToString());
            while (true)
            {
                try {
                    //接收客户端发来的消息
                    byte[] buffer = new byte[1024 * 1024 * 2];
                    int i = socketsend.Receive(buffer);
              
  • 8
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
当然,我可以帮你编写一个基本的C# TCP服务器口程序。以下是一个简单的示例: ```csharp using System; using System.Net; using System.Net.Sockets; using System.Text; public class TCPServer { public static void Main() { // 服务器IP和口 string ip = "127.0.0.1"; int port = 8080; // 创建TCP监听器 TcpListener listener = new TcpListener(IPAddress.Parse(ip), port); try { // 启动监听器 listener.Start(); Console.WriteLine("服务器已启动,等待客户端连接..."); while (true) { // 接受客户端连接 TcpClient client = listener.AcceptTcpClient(); Console.WriteLine("客户端已连接"); // 获取客户端的网络流 NetworkStream stream = client.GetStream(); // 读取客户端发送的数据 byte[] buffer = new byte[1024]; int bytesRead = stream.Read(buffer, 0, buffer.Length); string requestData = Encoding.ASCII.GetString(buffer, 0, bytesRead); Console.WriteLine("接收到客户端数据:{0}", requestData); // 处理客户端请求(这里仅作为示例,直接返回相同的数据) byte[] responseData = Encoding.ASCII.GetBytes(requestData); stream.Write(responseData, 0, responseData.Length); Console.WriteLine("发送响应数据给客户端:{0}", requestData); // 关闭连接 client.Close(); Console.WriteLine("客户端已断开连接"); } } catch (Exception ex) { Console.WriteLine("服务器发生错误:{0}", ex.Message); } finally { // 停止监听器 listener.Stop(); } Console.ReadLine(); } } ``` 这是一个简单的TCP服务器口程序,它会监听指定的IP地址和口,接受客户端连接,并读取客户端发送的数据,然后返回相同的数据给客户端。你可以根据需求进行修改和扩展。请注意,这只是一个基本示例,实际应用中可能需要处理更多的逻辑和错误处理。希望对你有所帮助!如果有任何问题,请随时提问。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值