silverlight   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在Silverlight中使用Socket进行通信(3)简单的文本聊天工具大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

在上一篇的基础上,晚上我又尝试了一下做个聊天工具,有个定时取消息的过程解决不好,明天再研究一下,在这个文本聊天的基础上,稍加扩展就可以进行视频聊天了,下一篇将会做silverlight视频聊天的DEMO. 整体效果是        还是从服务端说起,服务端做中转消息用,为了模拟聊天情景,服务端简单写了一个实体用来缓存聊天内容  代码 public   class  UserSocket      

上一篇的基础上,晚上我又尝试了一下做个聊天工具,有个定时取消息的过程解决不好,明天再研究一下,在这个文本聊天的基础上,稍加扩展就可以进行视频聊天了,下一篇将会做silverlight视频聊天的DEMO.

整体效果

 

在Silverlight中使用Socket进行通信(3)简单的文本聊天工具

   

在Silverlight中使用Socket进行通信(3)简单的文本聊天工具

在Silverlight中使用Socket进行通信(3)简单的文本聊天工具

 

还是从服务端说起,服务端做中转消息用,为了模拟聊天情景,服务端简单写了一个实体用来缓存聊天内容 

在Silverlight中使用Socket进行通信(3)简单的文本聊天工具

代码
public   class  UserSocket 
    { 
        
public   String  UserName {  set get ; } 
        
public   String  PartnerName {  set get ; }         
        
public   String  message {  set get ; } 
        
public  datetiR_893_11845@e StoreTime {  set get ; } 
@R_874_8787@

  

然后在主程序中声明一个List<UserSocket>对象存储聊天内容

static List<UserSocket> listuserSocket = new List<UserSocket>();

当聊天双方给对方发送消息时,可以通过预先设定的字符串格式,比如采用 - 来将发送者,接受者,聊天内容组合起来发送到服务器进行解析和存储。

 

在Silverlight中使用Socket进行通信(3)简单的文本聊天工具

代码

byte [] bytData  =   new   byte [ 1024 ]; 
                
int  receivedLength  =  client.Receive(bytData); 
                
String  strReceive  =  System.Text.Encoding.UTF8.GetString(bytData,  0 , receivedLength); 

                listuserSocket.Add(
new  UserSocket() 
                { UserName 
=  strReceive.Split( ' - ' )[ 0 ], 
                    PartnerName 
=  strReceive.Split( ' - ' )[ 1 ], 
                    message 
=  strReceive.Split( ' - ' )[ 2 ], 
                    StoreTime
= datetiR_893_11845@e.Now });

 

 当客户端A定时来服务器请求发给自己的消息时,服务器就会在listuserSocket中查找到发送给A的消息并清除此消息。

 

在Silverlight中使用Socket进行通信(3)简单的文本聊天工具

代码

UserSocket userSocket  =  listuserSocket.Where(m  =>  m.PartnerName  ==  strReceive.Split( ' - ' )[ 0 ]).FirstOrDefault(); 
                listuserSocket.RemoveAll(m 
=>  m.PartnerName  ==  strReceive.Split( ' - ' )[ 0 ]);

 

 关键代码

由于silverlight中没有提供监听socket请求的方法,只能作为客户端跟服务器进行交互,所以在客户端我们可以预先定义一个Socket

 

private   Socket clientSocket  =   null ;  

 及远程通信的IP和端口 

private   const   String  SERVER_IP  =   " 127.0.0.1 "
        
private   const   int  SERVER_PORT  =   4530 ;

 我们可以为这个clientSocket建立起连接 

在Silverlight中使用Socket进行通信(3)简单的文本聊天工具

代码
clientSocket  =   new  Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
            socketasynceventargs socketEventArg 
=   new  socketasynceventargs() 
            { 
                remoteEndPoint 
=   new  IPEndPoint(Ipaddress.Parse(SERVER_Ip), SERVER_PORT) 
        @R_874_8787@; 
            socketEventArg.Completed 
+= new  EventHandler < socketasynceventargs > (socketEventArg_Completed); 
            clientSocket.ConnectAsync(socketEventArg);

 

鉴于sl的事件处理是异步的,所以 

在Silverlight中使用Socket进行通信(3)简单的文本聊天工具

代码
//  连接成功后 开始发送 
         void  socketEventArg_Completed( object  sender, socketasynceventargs E) 
        { 
            
if  (e.socketError  ==  SocketError.success) 
            { 
                
// AddText("已连接服务器!"); 
                 String  strSend  =  USERNAME + " - " + PARTNERNAME + " - " + messaGE; 
                
byte [] bytSend  =  Encoding.UTF8.GetBytes(strSend); 
                socketasynceventargs socketArg 
=   new  socketasynceventargs(); 
                socketArg.Completed 
+=   new  EventHandler < socketasynceventargs > (socketArg_Completed); 
                socketArg.SetBuffer(bytSend, 
0 , bytSend.Length); 
                clientSocket.SendAsync(socketArg); 
                
// AddText("向服务器发送信息...");                
        @R_874_8787@            
        }

  

当发送成功后,就可以向服务器取消息啦 

在Silverlight中使用Socket进行通信(3)简单的文本聊天工具

代码
void  socketArg_Completed( object  sender, socketasynceventargs E) 
        { 
             
// 发送成功 
             if  (e.socketError  ==  SocketError.success) 
            { 
                AddText(
" 已经将自己的IP和聊天对象发送到服务器 " ); 
        @R_874_8787@ 
            timer 
=   new  Timer( new  TimerCallBACk(StartReceivE) null 500 1000 );            
        }

  

定时取消息的方法,也是异步的 

在Silverlight中使用Socket进行通信(3)简单的文本聊天工具

代码
void  StartReceive( object  o) 
        { 
            
byte [] byteReceive = new   byte [ 102400 ]; 
            socketasynceventargs socketReceiveArg 
=   new  socketasynceventargs(); 
            socketReceiveArg.Completed 
+=   new  EventHandler < socketasynceventargs > (socketReceiveArg_Completed); 
            socketReceiveArg.SetBuffer(byteReceive, byteReceive.Length); 
            clientSocket.ReceiveAsync(socketReceiveArg); 
        } 
        
void  socketReceiveArg_Completed( object  sender, socketasynceventargs E) 
        { 
            
if  (e.socketError  ==  SocketError.success) 
            { 
                
byte [] byteReceive  =  e.buffer; 
                
String  strText  =  System.Text.Encoding.UTF8.GetString(byteReceive, byteReceive.Length); 
                AddText(
" 成功接收到服务器回传的消息 "   +  strText); 
        @R_874_8787@ 
        } 

 可以看到,从连接到发送,再到接收,我们用的是一个socket实例来完成的,也就是说在silverlight中只需要连接一次socket就可以顺利进行后续操作了。

服务端的监听

服务端的监听socket 跟客户端的不同,监听是一个socket实例,发送和接收则是另外一个代表客户端的实例。

首先还是需要指定监听IP和端口及使用的Socket

 

private   const   String  SERVER_IP  =   " 127.0.0.1 "
        
private   const   int  SERVER_PORT  =   4530
        
static  Socket listener;

  

同样,也需要进行策略文件的验证 

在Silverlight中使用Socket进行通信(3)简单的文本聊天工具

代码
#region  Start The Policy Server 
                PolicySocketServer StartPolicyServer 
=   new  PolicySocketServer(); 
                Thread th 
=   new  Thread( new  ThreadStart(StartPolicyServer.StartSocketServer)); 
                th.IsBACkground 
=   true
                th.Start(); 
                
#endregion

 

 然后开始监听 

在Silverlight中使用Socket进行通信(3)简单的文本聊天工具

代码
IPEndPoint localEndPoint  =   new  IPEndPoint(Ipaddress.Parse(SERVER_Ip), SERVER_PORT); 
                listener 
=   new  Socket(AddressFamily.InterNetwork, ProtocolType.Tcp)
                listener.bind(localEndPoint)
                listener.Listen(
- 1 ); 
                console.WriteLine(
" 等待客户端连接... " ); 
                
while  ( true
                { 
                    Socket clientSocket 
=  listener.Accept(); 
                    
if  (clientSocket.Connected) 
                    {                     
                        Thread myThread 
=   new  Thread( new  ParameterizedThreadStart(SocketThread)); 
                        myThread.Start(clientSocket); 
                @R_874_8787@ 
                } 

 

 当监听到有客户端连接时,就另外开启线程进行处理,这个操作同时也确定了需要多个socket实例进行应答。 

@H_262_1119@

在Silverlight中使用Socket进行通信(3)简单的文本聊天工具

代码
static   void  SocketThread( object  clientSocket)   
        { 
            
try  
            { 
                Socket client 
=  (Socket)clientSocket; 
                IPEndPoint address 
=  (IPEndPoint)client.RemoteEndPoint; 

                
byte [] bytData  =   new   byte [ 1024 ]; 
                
int  receivedLength  =  client.Receive(bytData); 
                
String  strReceive  =  System.Text.Encoding.UTF8.GetString(bytData, receivedLength); 

                listuserSocket.Add(
new  UserSocket() 
                { UserName 
=  strReceive.Split( ' - ' )[ 0 ], 
                    PartnerName 
=  strReceive.Split( ' - ' )[ 1 ], 
                    message 
=  strReceive.Split( ' - ' )[ 2 ], 
                    StoreTime
= datetiR_893_11845@e.Now }); 
                console.WriteLine(
" "   +  strReceive.Split( ' - ' )[ 0 +   " 】通过【 "   +  address.Address.ToString()  +   " : "   +  address.Port.ToString()  +   " 登录了服务器,并给【 "   +  strReceive.Split( ' - ' )[ 1 +   " 】留言如下: " ); 
                console.WriteLine(strReceive.Split(
' - ' )[ 2 ] + " ,当前服务器消息数量【: " + listuserSocket.Count.ToString() + " " ); 

                UserSocket userSocket 
=  listuserSocket.Where(m  =>  m.PartnerName  ==  strReceive.Split( ' - ' )[ 0 ]).FirstOrDefault(); 
                listuserSocket.RemoveAll(m 
=>  m.PartnerName  ==  strReceive.Split( ' - ' )[ 0 ]); 
                
if  (userSocket  !=   null
                { 
                    client.Send(System.Text.Encoding.UTF8.GetBytes(userSocket.messagE)); 
                    console.WriteLine(
" "   +  userSocket.PartnerName  +   " 】取走了消息【 "   +  userSocket.message  +   " 】,当前服务器消息数量【: " + listuserSocket.Count.ToString() + " " ); 
                } 
        @R_874_8787@ 
            
catch               {   }          } 

大佬总结

以上是大佬教程为你收集整理的在Silverlight中使用Socket进行通信(3)简单的文本聊天工具全部内容,希望文章能够帮你解决在Silverlight中使用Socket进行通信(3)简单的文本聊天工具所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。