现在网上已经有一些关于本例所用到的API的详细说明,所以在此就不加详细说明,本文会注重讲解用API时的一些注意事项,本例以symbian手机为客户端,以PC为服务端,服务端使用JAVA写的。
客户端代码如下:
RSocketServ ser;
RHostResolver Host;
RSocket socket;
TUint NumPro;
TSockAddr Addr;
TProtocolDesc ProInfo;
TRequestStatus Status;
TNameEntry Info;
User::LeaveIfError(ser.Connect());
User::LeaveIfError(ser.NumProtocols(NumPro));
TBuf8<KSocketDefaultBufferSize> test;
TSockXfrLength iLen = KSocketDefaultBufferSize;
Host.Open(ser, KAfInet, KProtocolInetTcp);
User::LeaveIfError(Host.GetByName(_L("jinxuxin-PC"), Info));
User::LeaveIfError(socket.Open(ser, KAfInet, KSockStream, KProtocolInetTcp));
Addr = Info().iAddr;
Addr.SetPort(20001);
socket.Connect(Addr, Status);
User::WaitForRequest(Status);
console->Printf(_L("connected...."));
socket.RecvOneOrMore(test, 0, Status, iLen);
User::WaitForRequest(Status);
console->(CnvUtfConverter::ConvertToUnicodeFromUtf8L(test)->Des());
RHostResolver Host:定义名字解析,因为我在帮助文档里没找到直接设置IP的方法(如果那位大侠知道如何直接设置IP的方法,希望不吝赐教),就只能用名字来取得IP地址,获得TSockAddr 对象:首先通过GenByName可以获得TNameEntry 对象(如果给入的主机名不存在的话,会出现system error -1的错误)通过Info().iAddr(TNameEntry 重载了括号操作符,返回一个TSockAddr 对象)可获得TSockAddr 对象。再调用Addr.SetPort(20001)设置端口。
两个User::WaitForRequest(Status)的作用:等待操作成功。
TSockXfrLength iLen = KSocketDefaultBufferSize:TSockXfrLength 重载了=号操作符,可以用一个整数去初始化TSockXfrLength 对象。
console->(CnvUtfConverter::ConvertToUnicodeFromUtf8L(test)->Des()):网络上传输的数据都是以UTF-8进行编码的,为了中文现实不会出现乱码,将UTF-8转换为Unicode以后进行打印。
服务器端代码:
private static final int BUFSIZE = 32; // Size of receive buffer
public static void main(String[] args) throws IOException {
int servPort = 20001;
ServerSocket servSock = new ServerSocket(servPort);
int recvMsgSize; // Size of received message
byte[] receiveBuf = new byte[BUFSIZE]; // Receive buffer
while (true) { // Run forever, accepting and servicing connections
Socket clntSock = servSock.accept(); // Get client connection
SocketAddress clientAddress = clntSock.getRemoteSocketAddress();
System.out.println("Handling client at " + clientAddress);
InputStream in = clntSock.getInputStream();
OutputStream out = clntSock.getOutputStream();
out.write(new String("Hello").getBytes());
clntSock.close();
}
本服务器接收到连接后在控制台打印出客户端的IP地址,然后传回一个Hello字符串,检测连接是否通畅。