silverlight
发布时间:2022-05-03 发布网站:大佬教程 code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在Silverlight中使用Socket进行通信(3)简单的文本聊天工具,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
概述
在上一篇的基础上,晚上我又尝试了一下做个聊天工具,有个定时取消息的过程解决不好,明天再研究一下,在这个文本聊天的基础上,稍加扩展就可以进行视频聊天了,下一篇将会做silverlight视频聊天的DEMO. 整体效果是 还是从服务端说起,服务端做中转消息用,为了模拟聊天情景,服务端简单写了一个实体用来缓存聊天内容 代码 public class UserSocket
在上一篇的基础上,晚上我又尝试了一下做个聊天工具,有个定时取消息的过程解决不好,明天再研究一下,在这个文本聊天的基础上,稍加扩展就可以进行视频聊天了,下一篇将会做silverlight视频聊天的DEMO.
整体效果是
还是从服务端说起,服务端做中转消息用,为了模拟聊天情景,服务端简单写了一个实体用来缓存聊天内容
代码
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>();
当聊天双方给对方发送消息时,可以通过预先设定的字符串格式,比如采用 - 来将发送者,接受者,聊天内容组合起来发送到服务器进行解析和存储。
代码
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的消息并清除此消息。
代码
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建立起连接
鉴于sl的事件处理是异步的,所以
当发送成功后,就可以向服务器取消息啦
代码
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
);
}
定时取消息的方法,也是异步的
代码
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;
同样,也需要进行策略文件的验证
代码
#region
Start The Policy Server
PolicySocketServer StartPolicyServer
=
new
PolicySocketServer();
Thread th
=
new
Thread(
new
ThreadStart(StartPolicyServer.StartSocketServer));
th.IsBACkground
=
true
;
th.Start();
#endregion
然后开始监听
代码
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@
代码
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,请注明来意。