设为首页 加入收藏

TOP

C#的Socket简单实现消息发送(二)
2015-02-03 22:27:47 来源: 作者: 【 】 浏览:54
Tags:Socket 简单 实现 消息 发送
关闭一个连接,先要结束在Socket所在的线程方法,我这里的处理是停止掉死循环的函数调用,每当线程所在函数执行完毕,则线程自动销毁。之后就是关闭所连接的socket。


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


最后就是界面的调用,完成Socket的网络消息交互。


下面是具体的实现及源码:


public class SocketManager
? ? {
? ? ? ? public Dictionary _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();
? ? ? ? }


? ? ? ? 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
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? i

首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇AngularJS开发指南9:AngularJS作.. 下一篇C语言实例:同时实现两个文件的内..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: