设为首页 加入收藏

TOP

C#的Socket简单实现消息发送(一)
2015-02-03 22:27:47 来源: 作者: 【 】 浏览:55
Tags:Socket 简单 实现 消息 发送

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


一、先建立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进行处理,方法一般带有回调函数,用于执行操作之后的处理。


还有就是连接的关闭,每

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

评论

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