C#的Socket简单实现消息发送 (详细分析)

        Socket一般用于网络之间的通信,在这里,实现的是服务端与客户端的简单消息通信。

        首先是客户端的搭建,一般步骤是先建立Socket绑定本地的IP和端口,并对远端连接进行连接进行监听,这里的监听一般开启后台线程进行循环处理如果远端有连接到本机的Socket的端口,则获取一个新的Socket对象并重新添加一个线程用于对远端地址进行消息通信(消息的收发),这样,服务端的Socket就简单实现,下面是winForm的具体实现。

一、服务端

        一般步骤是先建立Socket绑定本地的IP和端口,并对远端连接进行连接进行监听,这里的监听一般开启后台线程进行循环处理如果远端有连接到本机的Socket的端口,则获取一个新的Socket对象并重新添加一个线程用于对远端地址进行消息通信(消息的收发)

        先建立Socket的服务类SocketServerManager,用于对Socket各种操作的统一管理:

public class SocketManager
    {
        Socket _socket = null;
        EndPoint _endPoint = null;
        bool _isListening = false;
        int BACKLOG = 10;
        public SocketManager(string ip, int port)
        {
            _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress _ip = IPAddress.Parse(ip);
            _endPoint = new IPEndPoint(_ip, port);
        }
        public void Start()
        {
            _socket.Bind(_endPoint); //绑定端口
            _socket.Listen(BACKLOG); //开启监听
            Thread acceptServer = new Thread(AcceptWork); //开启新线程处理监听
            acceptServer.IsBackground = true;
            _isListening = true;
            acceptServer.Start();
        }
        public void AcceptWork()
        {
            while (_isListening)
            {
                Socket acceptSocket = _socket.Accept();
                if (acceptSocket != null)
                {
                    Thread socketConnectedThread = new Thread(newSocketReceive);
                    socketConnectedThread.IsBackground = true;
                    socketConnectedThread.Start(acceptSocket);
                }
                Thread.Sleep(200);
            }
        }
        public void newSocketReceive(object obj)
        {
            Socket socket = obj as Socket;
            while (true)
            {
                try
                {
                    if (socket == null) return;
                    //这里向系统投递一个接收信息的请求,并为其指定ReceiveCallBack做为回调函数 
                    socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveCallBack, buffer);
                }
                catch (Exception ex)
                {
                    return;
                }
                Thread.Sleep(100);
            }
        }
        private void ReceiveCallBack(IAsyncResult ar)
        {
        }
    }

public class SockeServertManager上面是Socket管理类的模型,具体的方法是初始化和开启监听,接下来就是在Form的界面调用建立类和Start方法。

 

二、客户端

        客户端同样是初始化socket,然后就不是监听socket,而是调用Connect连接指定的Socket地址,最后是开启新的线程接收和发送消息。

public class SocketClientManager
    {
        public Socket _socket = null;
        public EndPoint endPoint = null;
        public bool _isConnected = false;
        public SocketClientManager(string ip, int port)
        {
            IPAddress _ip = IPAddress.Parse(ip);
            endPoint = new IPEndPoint(_ip, port);
            _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        }
        public void Start()
        {
            _socket.BeginConnect(endPoint, ConnectedCallback, _socket);
            _isConnected = true;
            Thread socketClient = new Thread(SocketClientReceive);
            socketClient.IsBackground = true;
            socketClient.Start();
        }
        public void SocketClientReceive()
        {
            while (_isConnected)
            {
                try {
                    _socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveCallback, buffer);
                }
                catch (SocketException ex)
                {
                    _isConnected = false;
                }
                
                Thread.Sleep(100);
            }
        }
        public void ReceiveCallback(IAsyncResult ar)
        {
        }
    }

         public class SocketClientManager 主要记住的是,客户端是监听Socket是固定的,是监听绑定地址的,每当有新的连接访问,则开启新的线程与之进行交互,而客户端只简单实现与服务端交互,服务端则只有一个。

        Socket的进行发送与接收,一般是通过异步方法BeginReceive和BeginSend进行处理,方法一般带有回调函数,用于执行操作之后的处理。

       

        还有就是连接的关闭,每关闭一个连接,先要结束在Socket所在的线程方法,我这里的处理是停止掉死循环的函数调用,每当线程所在函数执行完毕,则线程自动销毁。之后就是关闭所连接的socket。

 

        下面是我程序的完整实现,为了方便socket的管理,我把服务器的所有与客户端对话的Socket统一用字典管理,并封装在SocketInfo的内部类中,消息的发送与接收必须先找到该连接socket。

        最后就是界面的调用,完成Socket的网络消息交互。下面是具体的实现及源码:

三、服务端

public class SocketManager
    {
        public Dictionary<string,SocketInfo> _listSocketInfo = null;
        Socket _socket = null;
        public SocketInfo socketInfo = null;
        EndPoint _endPoint = null;
        bool _isListening = false;
        int BACKLOG = 10;
        public delegate void OnConnectedHandler(string clientIP);
        public event OnConnectedHandler OnConnected;
        public delegate void OnReceiveMsgHandler(string ip);
        public event OnReceiveMsgHandler OnReceiveMsg;
        public event OnReceiveMsgHandler OnDisConnected;
        public SocketManager(string ip, int port)
        {
            _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress _ip = IPAddress.Parse(ip);
            _endPoint = new IPEndPoint(_ip, port);
            _listSocketInfo = new Dictionary<string, SocketInfo>();
        }
        public void Start()
        {
            _socket.Bind(_endPoint); //绑定端口
            _socket.Listen(BACKLOG); //开启监听
            Thread acceptServer = new Thread(AcceptWork); //开启新线程处理监听
            acceptServer.IsBackground = true;
            _isListening = true;
            acceptServer.Start();
        }
        public void AcceptWork()
        {
            while (_isListening)
            {
                Socket acceptSocket = _socket.Accept();
                if (acceptSocket != null && this.OnConnected != null)
                {
                    SocketInfo sInfo = new SocketInfo();
                    sInfo.socket = acceptSocket;
                    _listSocketInfo.Add(acceptSocket.RemoteEndPoint.ToString(), sInfo);
                    OnConnected(acceptSocket.RemoteEndPoint.ToString());
                    Thread socketConnectedThread = new Thread(newSocketReceive);
                    socketConnectedThread.IsBackground = true;
                    socketConnectedThread.Start(acceptSocket);
                }
                Thread.Sleep(200);
            }
        }
        public void newSocketReceive(object obj)
        {
            Socket socket = obj as Socket;
            SocketInfo sInfo = _listSocketInfo[socket.RemoteEndPoint.ToString()];
            sInfo.isConnected = true;
            while (sInfo.isConnected)
            {
                try
                {
                    if (sInfo.socket == null) return;
                    //这里向系统投递一个接收信息的请求,并为其指定ReceiveCallBack做为回调函数 
                    sInfo.socket.BeginReceive(sInfo.buffer, 0, sInfo.buffer.Length, SocketFlags.None, ReceiveCallBack, sInfo.socket.RemoteEndPoint);
                }
                catch (Exception ex)
                {
                    return;
                }
                Thread.Sleep(100);
            }
        }
        private void ReceiveCallBack(IAsyncResult ar)
        {
            EndPoint ep = ar.AsyncState as IPEndPoint;
            SocketInfo info = _listSocketInfo[ep.ToString()];
            int readCount = 0;
            try
            {
                if (info.socket == null) return;
                readCount = info.socket.EndReceive(ar);
            }catch(Exception ex){
                return;
            }
            if (readCount > 0)
            {
                //byte[] buffer = new byte[readCount];
                //Buffer.BlockCopy(info.buffer, 0, buffer, 0, readCount);
                if (readCount < info.buffer.Length)
                {
                    byte[] newBuffer = new byte[readCount];
                    Buffer.BlockCopy(info.buffer, 0, newBuffer, 0, readCount);
                    info.msgBuffer = newBuffer;
                }
                else
                {
                    info.msgBuffer = info.buffer;
                }
                string msgTip = Encoding.ASCII.GetString(info.msgBuffer);
                if (msgTip == "\0\0\0faild")
                {
                    info.isConnected = false;
                    if (this.OnDisConnected != null) OnDisConnected(info.socket.RemoteEndPoint.ToString());
                    _listSocketInfo.Remove(info.socket.RemoteEndPoint.ToString());
                    info.socket.Close();
                    return;
                }
                if (OnReceiveMsg != null) OnReceiveMsg(info.socket.RemoteEndPoint.ToString());
            }
        }
        public void SendMsg(string text, string endPoint)
        {
            if (_listSocketInfo.Keys.Contains(endPoint) && _listSocketInfo[endPoint] != null)
            {
                _listSocketInfo[endPoint].socket.Send(Encoding.ASCII.GetBytes(text));
            }
        }
        public void Stop()
        {
            _isListening = false;
            foreach (SocketInfo s in _listSocketInfo.Values)
            {
                s.socket.Close();
            }
        }
        public class SocketInfo
        {
            public Socket socket = null;
            public byte[] buffer = null;
            public byte[] msgBuffer = null;
            public bool isConnected = false;
            public SocketInfo()
            {
                buffer = new byte[1024 * 4];
            }
        }
    }

四、客户端

 

public class SocketClientManager
    {
        public Socket _socket = null;
        public EndPoint endPoint = null;
        public SocketInfo socketInfo = null;
        public bool _isConnected = false;
        public delegate void OnConnectedHandler();
        public event OnConnectedHandler OnConnected;
        public event OnConnectedHandler OnFaildConnect;
        public delegate void OnReceiveMsgHandler();
        public event OnReceiveMsgHandler OnReceiveMsg;
        public SocketClientManager(string ip, int port)
        {
            IPAddress _ip = IPAddress.Parse(ip);
            endPoint = new IPEndPoint(_ip, port);
            _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        }
        public void Start()
        {
            _socket.BeginConnect(endPoint, ConnectedCallback, _socket);
            _isConnected = true;
            Thread socketClient = new Thread(SocketClientReceive);
            socketClient.IsBackground = true;
            socketClient.Start();
        }
        public void SocketClientReceive()
        {
            while (_isConnected)
            {
                SocketInfo info = new SocketInfo();
                try {
                    _socket.BeginReceive(info.buffer, 0, info.buffer.Length, SocketFlags.None, ReceiveCallback, info);
                }
                catch (SocketException ex)
                {
                    _isConnected = false;
                }
                
                Thread.Sleep(100);
            }
        }
        public void ReceiveCallback(IAsyncResult ar)
        {
            socketInfo = ar.AsyncState as SocketInfo;
            if (this.OnReceiveMsg != null) OnReceiveMsg();
        }
        public void ConnectedCallback(IAsyncResult ar)
        {
            Socket socket = ar.AsyncState as Socket;
            if (socket.Connected)
            {
                if (this.OnConnected != null) OnConnected();
            }
            else
            {
                if (this.OnFaildConnect != null) OnFaildConnect();
            }
        }
        public void SendMsg(string msg)
        {
            byte[] buffer = Encoding.ASCII.GetBytes(msg);
            _socket.Send(buffer);
        }
        public class SocketInfo
        {
            public Socket socket = null;
            public byte[] buffer = null;
            public SocketInfo()
            {
                buffer = new byte[1024 * 4];
            }
        }
    }

具体源码(.net4.5,vs2013)下载

------------------------------------------分割线------------------------------------------

免费下载地址在 http://linux.linuxidc.com/

用户名与密码都是www.linuxidc.com

具体下载目录在 /2015年资料/1月/29日/C#的Socket简单实现消息发送/

下载方法见 http://www.linuxidc.com/Linux/2013-07/87684.htm

------------------------------------------分割线------------------------------------------

本文永久更新链接地址http://www.linuxidc.com/Linux/2015-01/112590.htm

https://www.cnblogs.com/asdyzh/p/9870999.html

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
本书详细介绍了利用Visual C# 2005进行网络编程的方法和技巧。全书共分13章,主要内容包括网络编程原理、Visual C# 2005的套接字以及多线程的开发、基于各种不同协议的网络编程应用模块,并通过几个典型的实例介绍了Visual C# 2005网络编程的实际应用。 本书注重代码的通用性和工程实践性,书中提供的通用模块和典型实例稍加修改就可以为读者所用。   本书不仅适用于使用Visual C# 2005进行软件开发的广大软件开发人员,也适合高等院校师生学习和参考使用,特别对高校计算机专业的学生进行毕业设计具有非常好的指导价值,也可以作为广大计算机编程爱好者的自学参考书。 第1章 C#.NET网络编程概述  1.1 网络通信概述   1.1.1 网络通信模型概述   1.1.2 网络通信协议、接口和服务概述   1.1.3 TCP/IP网络架构概述   1.1.4 IP地址与端口  1.2 C#.NET网络编程相关类   1.2.1 IPAddress类   1.2.2 DNS类   1.2.3 IPHostEntry类   1.2.4 IPEndPoint类   1.2.5 Socket类  1.3 套接字概述   1.3.1 套接字的类型和常用属性   1.3.2 建立面向连接的套接字   1.3.3 建立面向无连接的套接字  1.4 使用套接字的简单示例   1.4.1 C/S与B/S架构通信模式概述   1.4.2 编写客户端代码   1.4.3 编写服务器端代码 .  1.4.4 无阻塞套接字  1.5 本章小结 第2章 C#.NET高级网络编程技术概述  2.1 线程与网络通信   2.1.1 基于线程的网络通信概述   2.1.2 在网络编程中使用多线程   2.1.3 线程基础   2.1.4 多线程在网络编程中的应用  2.2 网络通信的常见问题   2.2.1 让网络通信代码更强壮   2.2.2 数据缓冲区处理方法  2.3 TCP无保护消息边界   2.3.1 发送固定长度的消息   2.3.2 采用变长的消息   2.3.3 使用特殊标记处理消息  2.4 本章小结 第3章 开发基于TCP协议的应用程序  3.1 套接字与TCP协议   3.1.1 使用套接字传输数据   3.1.2 NetworkStream对象同数据发送与接收   3.1.3 TcpClient与TcpListener类   3.1.4 使用TCP/IP协议编写应用层的通信代码  3.2 开发异步的TCP应用编程   3.2.1 TCP的异步通信流程   3.2.2 线程阻塞与异步中的同步问题  3.3 开发异步的TCP聊天程序   3.3.1 客户端界面设计   3.3.2 客户端业务逻辑设计   3.3.3 服务器端界面设计   3.3.4 服务器端业务逻辑设计   3.3.5 运行界面  3.4 本章小结 第4章 开发基于UDP的应用程序  4.1 UDP通信协议概述   4.1.1 UDP协议与TCP协议的差别   4.1.2 UDP协议的使用场合  4.2 在C#下UDP协议的相关类   4.2.1 IPAddress类   4.2.2 UdpClient类的构造函数   4.2.3 UdpClient类的常用方法与实例  4.3 UDP协议使用示例   4.3.1 UDP模块功能概述   4.3.2 设计通信流程   4.3.3 开发服务器端程序   4.3.4 开发客户端程序   4.3.5 使用多线程开发UDP协议   4.3.6 使用校验保证信息完整性   4.3.7 效果演示  4.4 本章小结 第5章 开发基于SNMP协议的应用程序  5.1 SNMP协议概述   5.1.1 了解SNMP协议   5.1.2 SNMP的常用命令   5.1.3 设计SNMP包  5.2 SNMP协议使用示例   5.2.1 需求分析与设计   5.2.2 设计程序流程   5.2.3 程序窗口界面设计   5.2.4 SNMP类编写   5.2.5 SNMP程序窗口类编写  5.3 运行效果演示  5.4 使用供货商提供的MIB库  5.5 本章小结 第6章 使用.NET发送邮件  6.1 邮件发送与接收协议概述   6.1.1 SMTP协议与邮件发送   6.1.2 POP3协议与邮件接收   6.1.3 .NET下支持SMTP和POP3的类  6.2 邮件发送与接收模块   6.2.1 需求分析与设计   6.2.2 设计邮件发送和接收的流程   6.2.3 界面设计   6.2.4 编写主窗口的业务逻辑   6.2.5 编写发送邮件的业务逻辑   6.2.6 编写接收邮件的业务逻辑   6.2.7 使用多线程发送与接收邮件  6.3 运行效果演示  6.4 本章小结 第7章 FTP下载与文件传输  7.1 FTP协议概述   7.1.1 使用FTP协议下载文件的流程   7.1.2 相关类库说明  7.2 FTP客户端设计   7.2.1 需求分析   7.2.2 界面设计   7.2.3 业务逻辑设计  7.3 FTP服务器端设计   7.3.1 需求分析   7.3.2 FTP响应码   7.3.3 业务逻辑设计  7.4 运行界面  7.5 本章小结 第8章 基于C#.NET的网络管理模块  8.1 ICMP协议概述   8.1.1 ping命令   8.1.2 tracert命令  8.2 ICMP包  8.3 编写网络管理模块   8.3.1 需求分析   8.3.2 界面设计   8.3.3 编写核心icmp类的业务逻辑   8.3.4 编写具有ping功能的业务逻辑   8.3.5 编写具有tracert功能的业务逻辑   8.3.6 编写findmask功能的业务逻辑   8.3.7 编写时间戳功能的业务逻辑  8.4 运行界面  8.5 本章小结 第9章 编写基于.NET的Web Service  9.1 Web Service概述   9.1.1 Web服务基本概念   9.1.2 Web服务的优势   9.1.3 Web服务的架构  9.2 需求分析与设计   9.2.1 需求分析   9.2.2 文件功能设计   9.2.3 数据库设计  9.3 编写Web Service服务系统   9.3.1 构建Web Service   9.3.2 编写Web服务代码   9.3.3 主页面与登录相关的WebService数据访问模块   9.3.4 发表主题相关的Web Service访问模块   9.3.5 投票相关的Web Service访问模块   9.3.6 管理相关的Web Service访问模块  9.4 主页面与登录模块   9.4.1 界面设计   9.4.2 编写业务逻辑  9.5 发表主题模块   9.5.1 界面设计   9.5.2 编写业务逻辑  9.6 投票模块   9.6.1 界面设计   9.6.2 编写业务逻辑  9.7 管理模块   9.7.1 界面设计   9.7.2 编写业务逻辑  9.8 本章小结 第10章 基于.NET的远程技术  10.1 远程技术概述   10.1.1 远程技术开发结构   10.1.2 远程技术使用  10.2 远程控制开发客户端的设计   10.2.1 界面设计与控件使用   10.2.2 客户端的代码设计  10.3 远程控制开发服务器端的设计   10.3.1 界面设计与控件使用   10.3.2 服务器端的代码设计  10.4 运行效果演示  10.5 本章小结 第11章 流媒体在线播放  11.1 需求分析与设计   11.1.1 需求分析   11.1.2 模块设计   11.1.3 数据库设计  11.2 DirectShow接口   11.2.1 滤波图模型   11.2.2 如何使用DirectShow接口   11.2.3 流媒体在线播放相关接口  11.3 流媒体协议   11.3.1 实时传输协议(RTP)   11.3.2 实时传输控制协议(RTCP)   11.3.3 实时流传输协议(RTSP)   11.3.4 流媒体服务过程  11.4 建立.NET的窗体项目   11.4.1 主窗口界面设计   11.4.2 收藏夹数据库相关业务逻辑设计   11.4.3 流媒体在线播放器业务逻辑设计  11.5 运行效果演示  11.6 本章小结 第12章 在线五子棋系统模块  12.1 需求分析与设计   12.1.1 需求分析   12.1.2 模块设计  12.2 五子棋规则类设计   12.2.1 胜负判定类   12.2.2 行棋规则类  12.3 基于TCP协议的通信类   12.4 网络配置模块   12.4.1 网络配置模块的界面设计   12.4.2 网络配置模块的代码设计  12.5 扫描主机模块   12.5.1 扫描主机模块的界面设计   12.5.2 扫描主机模块的代码设计  12.6 主界面模块   12.6.1 主界面模块的界面设计   12.6.2 主界面模块的代码设计  12.7 运行界面  12.8 本章小结 第13章 基于HTTP协议的下载工具  13.1 HTTP协议   13.1.1 HTTP下载理论   13.1.2 .NET的几个支持HTTP协议的类  13.2 异步机制   13.2.1 异步机制的原理   13.2.2 异步类  13.3 下载工具的设计   13.3.1 需求设计   13.3.2 模块设计   13.3.3 界面设计   13.3.4 业务逻辑设计  13.4 运行效果演示  13.5 本章小结 Microsoft Visual C# 2005是一种新的编程环境,它是为生成在.NET Framework上运行的多种应用程序而设计的。C#简单,功能强大,类型安全,而且是面向对象的。C#凭借它的许多创新实现了对应用程序的快速开发。. Visual Studio支持Visual C#,这是通过功能齐全的代码编辑器、项目模板、设计器、代码向导、功能强大且易于使用的调试器以及其他工具实现的。通过.NET Framework类库,可以访问多种操作系统服务和其他有用的精心设计的类,这些类可显著加快开发周期。 本书大量地使用了.NET Framework提供的类库中的函数来协同开发,通过使用这些已经被封装的类来协助开发确实提高了不少效率,为开发工作带来了诸多的便利。 本书共分13章,第1章介绍了利用Visual C# 2005提供的网络命名空间下的诸多API进行套接字的开发,并对网络编程的原理进行了详细的阐述,为后续的章节奠定了基础。 第2章介绍了具有多线程能力的网络应用程序,这使得用户开发的程序能够适应更加复杂的情况。 第3章~第8章是本书的重要部分,主要介绍基于各种不同协议的网络编程应用模块。第3章介绍了基于TCP协议的聊天程序;第4章介绍了基于UDP的通信程序;第5章介绍了使用SNMP协议的网络管理程序;第6章介绍了使用SMTP以及POP3协议的E-mail系统;第7章介绍了基于FTP的文件传输模块;第8章介绍了使用ICMP协议的网络探测程序。 第9章介绍了基于Web Service的电子公告板系统,并结合采用了SQL Server 2005数据库;第10章介绍了使用远程控制技术的应用程序;第11章则介绍了流媒体在线播放系统。.. 第12章介绍了基于TCP通信协议的在线五子棋系统;第13章主要介绍了基于HTTP协议的下载工具,该工具具有多线程下载、断点续传的功能。 本书注重理论指导性和工程实践性,书中提供的各个网络应用程序只要稍加修改就可以为读者所用。本书不仅适用于使用Visual C# 2005进行软件开发的广大软件开发人员,也适合高等院校师生学习和参考使用,特别对高校计算机专业的学生进行毕业设计具有非常好的指导价值,也可以作为广大计算机编程爱好者的自学、参考用书。 本书主要由梅晓冬、颜烨青执笔,在编写本书程序的过程中,得到了陈璧元的大力支持,在此表示衷心的感谢。此外,还要感谢杨文军、程伟、袁远、刘武、彭澜、李通、李杰、卢茂琼、张燕生、胡燕生、邓湘成、卢下知、王周浩、邱岳、刘流、代本、刘明星、孙靖华等人,他们在本书编写过程中给予了我鼓励和支持。 由于时间仓促,加之水平有限,书中不足之处在所难免,敬请读者批评指正。... 编者 2008年1月
SuperSocket 是一个轻量级, 跨平台而且可扩展的 .Net/Mono Socket 服务器程序框架。你无须了解如何使用 Socket, 如何维护 Socket 连接和 Socket 如何工作,但是你却可以使用 SuperSocket 很容易的开发出一款 Socket 服务器端软件,例如游戏服务器,GPS 服务器, 工业控制服务和数据采集服务器等等。 SuperSocket具有如下特点: 高性能的事件驱动通信; 非常简单易用; 你只需要通过创建几个类就能获得一个健壮的 Socket 服务器; 内置的命令行协议让你能够迅速创建一个网络命令行接口服务器; 强大且高性能的协议解析实现工具帮你简化了网络数据的分析工作; 灵活的配置功能和友好的配置 API; 多监听器支持; 让你在一个服务器实例内监听多个端口; 多服务器实例托管的支持让你从容面对复杂的部署需求; 应用程序域和进程级别的隔离能够满足你大部分的宿主场景; 内置的 SSL/TLS 加密支持; 会话级别的发送队列能够让你通过会话并发的发送数据,并保持高性能和可控性; SuperSocket 的命令处理模式让你的业务逻辑更清晰,更有条理; 优良的可扩展 API 支持: Command Filter, Connection Filter, Command Loader; 可替换的日志架构允许你使用你喜欢的日志组件; 动态语言的支持; 允许你用 Python 之类的脚本语言来实现命令; 与 Mono/Linux 保持二进制级别的兼容; Windows Azure 的支持; 内置你可以直接用于 Flash 或 Silverlight 客户端的 Socket 策略服务器;
C#中使用Socket发送文件的过程如下: 1. 实例化Socket对象,并配置IP和端口号。可以使用Socket类的构造函数来创建Socket对象,并使用IPEndPoint类来指定要连接的目标IP地址和端口号。 2. 使用Connect方法连接到目标主机。使用Socket对象的Connect方法来建立与目标主机的连接。 3. 启动异步接收。可以使用Socket对象的BeginReceive方法来启动异步接收数据的操作。 4. 创建一个缓冲区数组来接收文件数据。可以创建一个字节数组来作为接收数据的缓冲区。 5. 使用Receive方法接收数据,并获取接收长度。使用Socket对象的Receive方法来接收数据,并使用返回值来获取接收到的字节数。 6. 解码接收到的数据并进行显示。可以使用相应的解码方式(如UTF-8)来将接收到的字节数组转换为字符串,并将其显示在界面上。 以上是使用Socket发送文件的基本步骤,具体的实现可以根据具体的需求和场景进行调整和扩展。 #### 引用[.reference_title] - *1* [C# Socket简单编程实现文件传送](https://blog.csdn.net/irkj_csdn/article/details/84042519)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C# Socket 网络信息传输](https://blog.csdn.net/againknow/article/details/128755460)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值