看到有很多人问关于WM中使用Socket的问题,做个Demo来演示下。在这个Demo过程中遇到的一些问题和大家分享下。
Socket通信中的服务器端,采用TcpListener
在TcpListner实例化时,就指定好了监听的IP和Port
1
listener
=
new
TcpListener(IPAddress.Any,
4564
);
然后通过AcceptSocket方法获得Socket对象。
1
socket
=
listener.AcceptSocket();
2
if
(socket
!=
null
)
3
{
4
if
(socket.Connected)
5
{
6
int
length
=
socket.Receive(bContent);
7
this
.lstContent.Add(Encoding.Default.GetString(bContent,
0
, length));
8
socket.Send(Encoding.Default.GetBytes(
"
Receive OK!
"
));
9
socket.Disconnect(
false
);
10
}
11
}
在PC端测试中,创建TcpClient对象
同样实例化TcpClient对象后,通过Client属性来获得Socket对象。
1
TcpClient client
=
new
TcpClient();
2
client.Connect(
new
IPAddress(
new
byte
[] {
192
,
168
,
0
,
157
}),
4564
);
3
byte
[] bContent
=
new
byte
[
1024
];
4
if
(client.Connected)
5
{
6
Socket socket
=
client.Client;
7
socket.Send(Encoding.Default.GetBytes(
"
Client Send OK!
"
));
8
int
length
=
socket.Receive(bContent);
9
System.Console.WriteLine(Encoding.Default.GetString(bContent,
0
, length));
10
11
socket.Disconnect(
false
);
12
socket.Close();
13
client.Close();
14
}
测试通过后,在Mobile设备中进行测试
在Mobile中,直接创建Socket对象。
这里想说明的是,你可以直接在通信2端直接创建Socket对象来连接,当然也可以创建TcpListener和TcpClient对象。效果是一样的。
1
byte
[] bContent
=
new
byte
[
1024
];
2
string
tmpString
=
""
;
3
4
Socket socket
=
new
Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
5
IPEndPoint localEP
=
new
IPEndPoint(
new
IPAddress(
new
byte
[] {
192
,
168
,
0
,
157
}),
4564
);
6
socket.Connect(localEP);
7
if
(socket.Connected)
8
{
9
socket.Send(Encoding.Default.GetBytes(
"
Client Send OK!
"
));
10
int
length
=
socket.Receive(bContent);
11
tmpString
=
Encoding.Default.GetString(bContent,
0
, length);
12
13
socket.Close();
14
}
15
MessageBox.Show(tmpString);
效果如下:
服务器端:
Mobile端:
最后大家要注意的:
当在模拟器上测试时,服务器和客户端都在同一台机器上时,服务器的监听IP特别注意,一定要设为IPAddress.Any。否则指定了一个IP后,在Mobile设备进行Socket通讯时,会有问题,会报强制关闭一个连接的错误。
其实模拟器或实际设备都是通过DMA的方式访问网络资源,这样的话,访问速度会快很多。当然,你也可以设置模拟器或者实际设备通过TCP/IP方式连接。但这样做法不提倡。
如何实现通过TCP/IP方式连接:
在Tools->Options->Device Tools->Devices->选择一个设备->Properties->将Transport改成Tcp Connect Transport即可。
在部署到实际设备时,还需要拷贝Programs Files\Common Files\Microsoft Shared\CoreCon\1.0\Target\wce400\<CPU>文件夹下的dll和exe拷贝到设备的Windows目录
然后在设备中运行CommanClient2.exe
如果设备上的安全功能开启的话,还要运行设备上的CMAccept.exe
模拟器如何实现,暂时没有找到相关资料。
代码下载:MobileSocket.rar
Author:AppleSeeker
Date:2008-08-05