C# Socket编程(服务端、客户端)

这篇具有很好参考价值的文章主要介绍了C# Socket编程(服务端、客户端)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.最直白的Socket代码

服务端

// 创建一个用于监听的Socket
            Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            // 绑定IP地址和端口号
            IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
            IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 12345);
            listener.Bind(localEndPoint);

            // 开始监听
            Console.WriteLine("Waiting for a connection...");
            listener.Listen(10);

            while (true)
            {
                // 接受连接
                Socket handler = listener.Accept();
                Console.WriteLine($"Connected: {handler.RemoteEndPoint}");

                // 读取数据
                byte[] buffer = new byte[1024];
                int bytesRec = handler.Receive(buffer);
                string data = Encoding.ASCII.GetString(buffer, 0, bytesRec);
                Console.WriteLine($"Received: {data}");

                // 发送数据
                byte[] msg = Encoding.ASCII.GetBytes("Hello from server!");
                handler.Send(msg);

                // 关闭连接
                handler.Shutdown(SocketShutdown.Both);
                handler.Close();

客户端

// 创建一个Socket并连接到服务器
            IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
            IPEndPoint remoteEP = new IPEndPoint(ipAddress, 12345);
            Socket sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            sender.Connect(remoteEP);

            // 发送数据
            string message = "Hello from client!";
            byte[] msg = Encoding.ASCII.GetBytes(message);
            int bytesSent = sender.Send(msg);
            Console.WriteLine($"Sent: {message}");

            // 接受数据
            byte[] buffer = new byte[1024];
            int bytesRec = sender.Receive(buffer);
            string data = Encoding.ASCII.GetString(buffer, 0, bytesRec);
            Console.WriteLine($"Received: {data}");

            // 关闭连接
            sender.Shutdown(SocketShutdown.Both);
            sender.Close();

            Console.ReadKey();

2.封装过有点绕的Socket代码

服务端

/// <summary>
        /// 开始监听
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnStartListen_Click(object sender, EventArgs e)
        {
            // 创建监听Socket
            socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            // IP
            IPAddress ip = IPAddress.Parse(this.tbIP.Text.Trim());

            // 端口号
            IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(this.tbPort.Text.Trim()));

            // 绑定IP地址和端口
            socketWatch.Bind(point);
            this.tbLog.AppendText("监听成功" + "\r\n");

            // 设置最大连接数
            socketWatch.Listen(10);

            // 回调实例化
            setTextValueCallBack = new SetTextValueCallBack(SetTextValue);
            receiveMsgCallBack = new ReceiveMsgCallBack(ReceiveMsg);
            setCmbCallBack = new SetCmbCallBack(AddCmbItem);
            sendFileCallBack = new SendFileCallBack(SendFile);

            // 线程开启监听
            acceptSocketThread = new Thread(new ParameterizedThreadStart(StartListen));
            acceptSocketThread.IsBackground = true;
            acceptSocketThread.Start(socketWatch);

        }

        /// <summary>
        /// 监听
        /// </summary>
        /// <param name="obj"></param>
        private void StartListen(object obj)
        {
            Socket sw = obj as Socket;

            while (true)
            {
                // 等待连接
                socketSend = socketWatch.Accept();

                // 获取连接主机IP和端口
                string rip = socketSend.RemoteEndPoint.ToString();
                dicSocket.Add(rip, socketSend);
                this.cmbIPList.Invoke(setCmbCallBack, rip);
                string strMsg = "远程主机:" + socketSend.RemoteEndPoint + "连接成功";

                // 回显
                tbLog.Invoke(setTextValueCallBack, strMsg);

                // 接收客户端消息线程
                Thread threadReceive = new Thread(new ParameterizedThreadStart(Receive));
                threadReceive.IsBackground = true;
                threadReceive.Start(socketSend);
            }
        }

        /// <summary>
        /// 接收
        /// </summary>
        /// <param name="obj"></param>
        private void Receive(object obj)
        {
            Socket socketR = obj as Socket;
            socketR.ReceiveTimeout = 5000;

            try
            {
                if (socketR == null || !socketR.Connected)
                {
                    SetTextValue("客户端关闭连接...");
                    return;
                }

                while (true)
                {
                    // 接收到的消息缓存区
                    byte[] buffer = new byte[2048];
                    
                    // 接收到的有效字节数
                    int count = socketR.Receive(buffer); // 阻塞操作
                    if (count == 0)
                    {
                        // 客户端关闭
                        return;
                    }

                    // 回显接收到的消息
                    string str = Encoding.Default.GetString(buffer, 0, count);
                    string strR = "接收:" + socketR.RemoteEndPoint + " 发送的消息:" + str;
                    tbLog.Invoke(receiveMsgCallBack, strR);
                }
            }
            catch (SocketException sex)
            {
                tbLog.Invoke(receiveMsgCallBack, "网络异常:" + "[" + socketR.RemoteEndPoint.ToString() + "]" + sex.Message);
                dicSocket.Remove(socketR.RemoteEndPoint.ToString());
            }
            catch (ObjectDisposedException dex)
            {
                tbLog.Invoke(receiveMsgCallBack, "连接异常:" + "[" + socketR.RemoteEndPoint.ToString() + "]" + dex.Message);
            }
            catch (Exception ex)
            {
                tbLog.Invoke(receiveMsgCallBack, "接收客户端消息异常:" + ex.Message);
            }
        }

客户端

private void btnConnect_Click(object sender, EventArgs e)
        {
            try
            {
                socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPAddress ip = IPAddress.Parse(this.tbIP.Text.Trim());
                socketSend.Connect(ip, Convert.ToInt32(this.tbPort.Text.Trim()));

                // 实例化
                setTextCallBack = new SetTextCallBack(SetValue);
                receiveMsgCallBack = new ReceiveMsgCallBack(SetValue);

                // 线程接收服务端消息
                threadReceive = new Thread(new ThreadStart(Receive));
                threadReceive.IsBackground = true;
                threadReceive.Start();

                SetValue("连接成功...");

            }
            catch (Exception ex)
            {
                MessageBox.Show("连接服务端出错:" + ex.Message);
            }
        }

        /// <summary>
        /// 接收服务器消息
        /// </summary>
        private void Receive()
        {
            try
            {
                if (socketSend == null || !socketSend.Connected)
                {
                    SetValue("连接被关闭...");
                    return;
                }

                while (true)
                {
                    byte[] buffer = new byte[2048];
                    // 接收的字节
                    int r = socketSend.Receive(buffer); // 阻塞操作
                    if (r == 0)
                    {
                        return;
                    }

                    // 判断发送的数据类型
                    // 文字消息
                    if (buffer[0] == 0)
                    {

                        string str = Encoding.Default.GetString(buffer, 1, r - 1);
                        this.tbLog.Invoke(receiveMsgCallBack, "接收服务端:" + socketSend.RemoteEndPoint + " 发送消息:" + str);
                    }

                    // 文件消息
                    if (buffer[0] == 1)
                    {
                        SaveFileDialog sfd = new SaveFileDialog();
                        sfd.InitialDirectory = @"";
                        sfd.Title = "请选择要保存的文件";
                        sfd.Filter = "所有文件|*.*";
                        sfd.ShowDialog(this);

                        string strPath = sfd.FileName;
                        using (FileStream fsWrite = new FileStream(strPath, FileMode.OpenOrCreate, FileAccess.Write))
                        {
                            fsWrite.Write(buffer, 1, r - 1);
                        }

                        MessageBox.Show("保存文件成功");
                    }
                }
            }
            catch (SocketException sex)
            {
                MessageBox.Show("网络异常:" + sex.Message);
            }
            catch (Exception ex)
            {
                MessageBox.Show("接收服务端消息异常:" + ex.Message);
            }
        }

3.GitHub代码

https://github.com/harrylsp/AndroidADBDriver文章来源地址https://www.toymoban.com/news/detail-597036.html

到了这里,关于C# Socket编程(服务端、客户端)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C# socket——简单的TCP 客户端 连接通信

    TCP编程的客户端一般步骤是: 1、创建一个socket,用函数socket()。 2、设置socket属性。 3、设置要连接的对方的IP地址和端口等属性。 4、连接服务器,用函数connect()。 5、收发数据,用函数send()和recv(),或者read()和write()。 6、关闭网络连接。 using System; using System.Net; using System.

    2024年02月11日
    浏览(53)
  • 基于C# Socket实现的简单的Redis客户端

         Redis 是一款强大的高性能键值存储数据库,也是目前 NOSQL 中 最流行 比较流行的一款数据库,它在广泛的应用场景中扮演着至关重要的角色,包括但不限于缓存、消息队列、会话存储等。在本文中,我们将介绍如何基于 C# Socket 来实现一个简单的Redis客户端类 RedisClien

    2024年02月05日
    浏览(54)
  • C# Socket通信从入门到精通(12)——多个同步UDP客户端C#代码实现

    我们在开发Udp客户端程序的时候,有时候在同一个软件上我们要连接多个服务器,这时候我们开发的一个客户端就不够使用了,这时候就需要我们开发出来的软件要支持连接多个服务器,最好是数量没有限制,这样我们就能应对任意数量的服务器连接,由于我们开发的Udp客户

    2024年02月04日
    浏览(60)
  • C# Socket通信从入门到精通(14)——多个异步UDP客户端C#代码实现

    在之前的文章C# Socket通信从入门到精通(13)——单个异步UDP客户端C#代码实现我介绍了单个异步Udp客户端的c#代码实现,但是有的时候,我们需要连接多个服务器,并且对于每个服务器,我们都有一些比如异步发送、异步接收的操作,那么这时候我们使用之前单个异步Udp客户

    2024年02月03日
    浏览(81)
  • Linux网络编程:socket、客户端服务器端使用socket通信(TCP)

    socket(套接字),用于网络中不同主机间进程的通信。 socket是一个伪文件,包含读缓冲区、写缓冲区。 socket必须成对出现。 socket可以建立主机进程间的通信,但需要协议(IPV4、IPV6等)、port端口、IP地址。          (1)创建流式socket套接字。                 a)此s

    2024年02月11日
    浏览(65)
  • Socket实例,实现多个客户端连接同一个服务端代码&TCP网络编程 ServerSocket和Socket实现多客户端聊天

    Java socket(套接字)通常也称作\\\"套接字\\\",用于描述ip地址和端口,是一个通信链的句柄。应用程序通常通过\\\"套接字\\\"向网络发出请求或者应答网络请求。 使用socket实现多个客户端和同一客户端通讯;首先客户端连接服务端发送一条消息,服务端接收到消息后进行处理,完成后再

    2024年02月12日
    浏览(76)
  • 网络编程——socket服务端和客户端(TCP)

    所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通

    2024年02月07日
    浏览(86)
  • Linux网络编程:Socket服务器和客户端实现双方通信

    目录 一,什么是网络编程 二,为什么使用端口号 三,TCP协议与UDP协议 ①TCP(传输控制协议) ②UDP(用户数据报协议,User Data Protocol) ③总结归纳 四,Socket服务器和客户端的开发流程 五,服务器和客户端相关API说明 ①socket()函数 ②bind()函数 ③listen()函数 ④accept()函数 ⑤客户端

    2024年02月11日
    浏览(71)
  • Socket网络编程(TCP/IP)实现服务器/客户端通信。

    一.前言 回顾之前进程间通信(无名管道,有名管道,消息队列,共享内存,信号,信号量),都是在同一主机由内核来完成的通信。 那不同主机间该怎么通信呢? 可以使用Socket编程来实现。 Socket编程可以通过网络来实现实现不同主机之间的通讯。 二.Socket编程的网络模型如

    2024年02月08日
    浏览(89)
  • python网络编程:通过socket实现TCP客户端和服务端

    目录 写在开头 socket服务端(基础) socket客户端(基础) 服务端实现(可连接多个客户端)  客户端实现 数据收发效果   近期可能会用python实现一些网络安全工具,涉及到许多关于网络的知识,逃不过的就是最基本的socket。本文将介绍如何通过python自带的socket库实现TCP客户

    2024年03月21日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包