稳扎稳打Silverlight(24) - 2.0通信之Socket, 开发一个多人聊天室

简介:
[索引页]
[源码下载]


稳扎稳打Silverlight(24) - 2.0通信之Socket, 开发一个多人聊天室


作者: webabcd


介绍
Silverlight 2.0 Socket通信。开发一个多人聊天室
    服务端:实例化Socket, 绑定, 监听, 连接, 接收数据, 发送数据
    客户端:实例化Socket, 指定服务端地址, 连接, 接收数据, 发送数据


在线DEMO
http://webabcd.blog.51cto.com/1787395/342779

示例
1、Policy服务(向客户端发送策略文件的服务)
clientaccesspolicy.xml
<? xml  version ="1.0" encoding  ="utf-8" ?> 
< access-policy > 
         < cross-domain-access > 
                 < policy > 
                         < allow-from > 
                                 < domain  uri ="*"  /> 
                         </ allow-from > 
                         < grant-to > 
                                 < socket-resource  port ="4502-4534"  protocol ="tcp"  /> 
                         </ grant-to > 
                 </ policy > 
         </ cross-domain-access > 
</ access-policy >
 
Main.cs
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.ComponentModel; 
InBlock.gif using System.Data; 
InBlock.gif using System.Drawing; 
InBlock.gif using System.Linq; 
InBlock.gif using System.Text; 
InBlock.gif using System.Windows.Forms; 
InBlock.gif 
InBlock.gif using System.Net.Sockets; 
InBlock.gif using System.IO; 
InBlock.gif using System.Net; 
InBlock.gif 
InBlock.gif namespace PolicyServer 
InBlock.gif
InBlock.gif         public partial  class Main : Form 
InBlock.gif        { 
InBlock.gif                 // 客户端 socket 发送到服务端的对策略文件的请求信息 
InBlock.gif                 private  readonly  string _policyRequestString =  "<policy-file-request/>"
InBlock.gif 
InBlock.gif                 private Socket _listener;  // 服务端监听的 socket 
InBlock.gif                 private  byte[] _policyBuffer;  // 服务端策略文件的 buffer 
InBlock.gif                 private  byte[] _requestBuffer;  // 客户端 socket 发送的请求信息的 buffer 
InBlock.gif 
InBlock.gif                 private  int _received;  // 接收到的信息字节数 
InBlock.gif 
InBlock.gif                 private  bool _flag =  false// 标志位。服务端是否要处理传入的连接 
InBlock.gif 
InBlock.gif                System.Threading.SynchronizationContext _syncContext; 
InBlock.gif 
InBlock.gif                 public Main() 
InBlock.gif                { 
InBlock.gif                        InitializeComponent(); 
InBlock.gif 
InBlock.gif                        _flag =  true
InBlock.gif 
InBlock.gif                        lblStatus.Text =  "PolicyServer状态:启动"
InBlock.gif                        lblStatus.ForeColor = Color.Green; 
InBlock.gif 
InBlock.gif                         // 启动 PolicyServer 
InBlock.gif                        StartupPolicyServer(); 
InBlock.gif 
InBlock.gif                         // UI 线程 
InBlock.gif                        _syncContext = System.Threading.SynchronizationContext.Current; 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 private  void btnStartup_Click( object sender, EventArgs e) 
InBlock.gif                { 
InBlock.gif                        _flag =  true
InBlock.gif 
InBlock.gif                        lblStatus.Text =  "PolicyServer状态:启动"
InBlock.gif                        lblStatus.ForeColor = Color.Green; 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 private  void btnPause_Click( object sender, EventArgs e) 
InBlock.gif                { 
InBlock.gif                        _flag =  false
InBlock.gif 
InBlock.gif                        lblStatus.Text =  "PolicyServer状态:暂停"
InBlock.gif                        lblStatus.ForeColor = Color.Red; 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 启动 PolicyServer 
InBlock.gif                 /// </summary> 
InBlock.gif                 private  void StartupPolicyServer() 
InBlock.gif                { 
InBlock.gif                         string policyFile = Path.Combine(Application.StartupPath,  "clientaccesspolicy.xml"); 
InBlock.gif 
InBlock.gif                         using (FileStream fs =  new FileStream(policyFile, FileMode.Open, FileAccess.Read)) 
InBlock.gif                        { 
InBlock.gif                                 // 将策略文件的内容写入 buffer 
InBlock.gif                                _policyBuffer =  new  byte[fs.Length]; 
InBlock.gif                                fs.Read(_policyBuffer, 0, _policyBuffer.Length); 
InBlock.gif                        } 
InBlock.gif 
InBlock.gif                         // 初始化 socket , 然后与端口绑定, 然后对端口进行监听 
InBlock.gif                        _listener =  new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
InBlock.gif                        _listener.Bind( new IPEndPoint(IPAddress.Any, 943));  // socket 请求策略文件使用 943 端口 
InBlock.gif                        _listener.Listen(100); 
InBlock.gif 
InBlock.gif                         // 开始接受客户端传入的连接 
InBlock.gif                        _listener.BeginAccept( new AsyncCallback(OnClientConnect),  null); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 private  void OnClientConnect(IAsyncResult result) 
InBlock.gif                { 
InBlock.gif                         if (!_flag) 
InBlock.gif                        { 
InBlock.gif                                 // PolicyServer 停用的话,则不再处理传入的连接 
InBlock.gif                                _listener.BeginAccept( new AsyncCallback(OnClientConnect),  null); 
InBlock.gif                                 return
InBlock.gif                        } 
InBlock.gif                                    
InBlock.gif                        Socket client;  // 客户端发过来的 socket 
InBlock.gif 
InBlock.gif                         try 
InBlock.gif                        { 
InBlock.gif                                 // 完成接受客户端传入的连接的这个异步操作,并返回客户端连入的 socket 
InBlock.gif                                client = _listener.EndAccept(result); 
InBlock.gif                        } 
InBlock.gif                         catch (SocketException) 
InBlock.gif                        { 
InBlock.gif                                 return
InBlock.gif                        } 
InBlock.gif 
InBlock.gif                        _requestBuffer =  new  byte[_policyRequestString.Length]; 
InBlock.gif                        _received = 0; 
InBlock.gif 
InBlock.gif                         try 
InBlock.gif                        { 
InBlock.gif                                 // 开始接收客户端传入的数据 
InBlock.gif                                client.BeginReceive(_requestBuffer, 0, _policyRequestString.Length, SocketFlags.None,  new AsyncCallback(OnReceive), client); 
InBlock.gif                        } 
InBlock.gif                         catch (SocketException) 
InBlock.gif                        { 
InBlock.gif                                 // socket 出错则关闭客户端 socket 
InBlock.gif                                client.Close(); 
InBlock.gif                        } 
InBlock.gif 
InBlock.gif                         // 继续开始接受客户端传入的连接 
InBlock.gif                        _listener.BeginAccept( new AsyncCallback(OnClientConnect),  null); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif 
InBlock.gif                 private  void OnReceive(IAsyncResult result) 
InBlock.gif                { 
InBlock.gif                        Socket client = result.AsyncState  as Socket; 
InBlock.gif 
InBlock.gif                         try 
InBlock.gif                        { 
InBlock.gif                                 // 完成接收数据的这个异步操作,并计算累计接收的数据的字节数 
InBlock.gif                                _received += client.EndReceive(result); 
InBlock.gif 
InBlock.gif                                 if (_received < _policyRequestString.Length) 
InBlock.gif                                { 
InBlock.gif                                         // 没有接收到完整的数据,则继续开始接收 
InBlock.gif                                        client.BeginReceive(_requestBuffer, _received, _policyRequestString.Length - _received, SocketFlags.None,  new AsyncCallback(OnReceive), client); 
InBlock.gif                                         return
InBlock.gif                                } 
InBlock.gif 
InBlock.gif                                 // 把接收到的数据转换为字符串 
InBlock.gif                                 string request = System.Text.Encoding.UTF8.GetString(_requestBuffer, 0, _received); 
InBlock.gif 
InBlock.gif                                 if (StringComparer.InvariantCultureIgnoreCase.Compare(request, _policyRequestString) != 0) 
InBlock.gif                                { 
InBlock.gif                                         // 如果接收到的数据不是“<policy-file-request/>”,则关闭客户端 socket 
InBlock.gif                                        client.Close(); 
InBlock.gif                                         return
InBlock.gif                                } 
InBlock.gif 
InBlock.gif                                 // 开始向客户端发送策略文件的内容 
InBlock.gif                                client.BeginSend(_policyBuffer, 0, _policyBuffer.Length, SocketFlags.None,  new AsyncCallback(OnSend), client); 
InBlock.gif                        } 
InBlock.gif 
InBlock.gif                         catch (SocketException) 
InBlock.gif                        { 
InBlock.gif                                 // socket 出错则关闭客户端 socket 
InBlock.gif                                client.Close(); 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 private  void OnSend(IAsyncResult result) 
InBlock.gif                { 
InBlock.gif                        Socket client = result.AsyncState  as Socket; 
InBlock.gif 
InBlock.gif                         try 
InBlock.gif                        { 
InBlock.gif                                 // 完成将信息发送到客户端的这个异步操作 
InBlock.gif                                client.EndSend(result); 
InBlock.gif 
InBlock.gif                                 // 获取客户端的ip地址及端口号,并显示 
InBlock.gif                                _syncContext.Post(ResultCallback, client.LocalEndPoint.ToString()); 
InBlock.gif                        } 
InBlock.gif                         finally 
InBlock.gif                        { 
InBlock.gif                                 // 关闭客户端 socket 
InBlock.gif                                client.Close(); 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 void ResultCallback( object result) 
InBlock.gif                { 
InBlock.gif                         // 输出客户端的ip地址及端口号 
InBlock.gif                        txtMsg.Text += result.ToString() +  "\r\n"
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif}
 
 
2、Socket服务端(聊天室的服务端)
ClientSocketPacket.cs
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Linq; 
InBlock.gif using System.Text; 
InBlock.gif 
InBlock.gif namespace SocketServer 
InBlock.gif
InBlock.gif         /// <summary> 
InBlock.gif         /// 对客户端 Socket 及其他相关信息做一个封装 
InBlock.gif         /// </summary> 
InBlock.gif         public  class ClientSocketPacket 
InBlock.gif        { 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 客户端 Socket 
InBlock.gif                 /// </summary> 
InBlock.gif                 public System.Net.Sockets.Socket Socket { get; set; } 
InBlock.gif 
InBlock.gif                 private  byte[] _buffer; 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 为该客户端 Socket 开辟的缓冲区 
InBlock.gif                 /// </summary> 
InBlock.gif                 public  byte[] Buffer 
InBlock.gif                { 
InBlock.gif                        get 
InBlock.gif                        { 
InBlock.gif                                 if (_buffer ==  null
InBlock.gif                                        _buffer =  new  byte[32]; 
InBlock.gif 
InBlock.gif                                 return _buffer; 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 private List< byte> _receivedByte; 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 客户端 Socket 发过来的信息的字节集合 
InBlock.gif                 /// </summary> 
InBlock.gif                 public List< byte> ReceivedByte 
InBlock.gif                { 
InBlock.gif                        get 
InBlock.gif                        { 
InBlock.gif                                 if (_receivedByte ==  null
InBlock.gif                                        _receivedByte =  new List< byte>(); 
InBlock.gif 
InBlock.gif                                 return _receivedByte; 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif}
 
 
 
 


     本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/343813 ,如需转载请自行联系原作者
相关文章
|
1月前
|
Python
python socket 简单通信
python socket 简单通信
34 1
|
27天前
|
网络协议 安全 网络安全
网络编程:基于socket的TCP/IP通信。
网络编程:基于socket的TCP/IP通信。
129 0
|
6天前
|
网络协议 Linux 应用服务中间件
Socket通信之网络协议基本原理
【9月更文挑战第14天】网络协议是机器间交流的约定格式,确保信息准确传达。主要模型有OSI七层与TCP/IP模型,通过分层简化复杂网络环境。IP地址全局定位设备,MAC地址则在本地网络中定位。网络分层后,数据包层层封装,经由不同层次协议处理,最终通过Socket系统调用在应用层解析和响应。
|
24天前
|
网络协议 Linux 应用服务中间件
Socket通信之网络协议基本原理
【8月更文挑战第27天】网络协议定义了机器间通信的标准格式,确保信息准确无损地传输。主要分为两种模型:OSI七层模型与TCP/IP模型。
|
1月前
|
网络协议
socket编程(2) -- TCP通信
socket编程(2) -- TCP通信
31 0
|
3月前
|
Java API 开发者
Java网络编程基础与Socket通信实战
Java网络编程基础与Socket通信实战
|
2月前
|
Java API 开发者
Java网络编程基础与Socket通信实战
Java网络编程基础与Socket通信实战
|
2月前
|
Java 数据格式
Java面试题:简述Java Socket编程的基本流程,包括客户端和服务器的创建与通信。
Java面试题:简述Java Socket编程的基本流程,包括客户端和服务器的创建与通信。
37 0
|
2月前
|
网络协议 安全 Java
深入了解Java中的网络编程与Socket通信
深入了解Java中的网络编程与Socket通信
|
2月前
|
网络协议 安全 Java
深入了解Java中的网络编程与Socket通信
深入了解Java中的网络编程与Socket通信