上次实现了WCF与Android端的通信,这次参考网友的Demo实现聊天功能,使用Socket实现。当前使用的是Tcp,后面有时间再使用udp.
此例子用json实现,大致格式如下:{Method:"Login",Message:{username:"kevin",message="hello world"},time:"2012-10-22 11:41:32"}
- 服务端:.net 控制台应用程序
服务器端思路是利用Socket接收数据,然后根据请求信息做相应处理
首先,搭建Socket服务分为四部:实例化、绑定、侦听、接收数据。代码如下:

public void Start() { Thread socketThread = new Thread(() => { //实例化Socket Socket host = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint point = new IPEndPoint(IPAddress.Any, Port); //绑定 host.Bind(point); //侦听 host.Listen(20); //开始异步连接 host.BeginAccept(new AsyncCallback(Accept), host); }); socketThread.Start(); }
以上使用了线程,并实现异步连接。
这里通过接收数据中的Method来判断请求方法,然后根据请求方法作相应处理,代码如下:

//序列化反序列化帮助类 JavaScriptSerializer Serializer = new JavaScriptSerializer(); SocketData requestdata = Serializer.ConvertToType(request, typeof(SocketType)) as SocketData; if (request != null) { SocketData response; string context; Dictionary<string, object> param = requestdata.Message as Dictionary<string, object>; if (requestdata.Message.Equals("Login"))//响应登录请求 { response = new SocketData() { Method = "Login", Message = new { UserName = param["UserName"] }, Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") }; context = Serializer.Serialize(response); sender.Send(Encoding.UTF8.GetBytes(context)); } else if (requestdata.Message.Equals("Send"))//响应聊天请求 { string Message = param["Message"] as string; response = new SocketData() { Method = "Send", Message = new { UserName = param["UserName"], Message = Message }, Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") }; context = Serializer.Serialize(response); //将聊天信息群发 Parallel.ForEach(SocketCache.Select(e => e.Key).ToArray(), (temp) => { temp.Send(Encoding.UTF8.GetBytes(context)); }); } }
服务建好后,可以使用SocketTool工具进行测试,可以点击下载,效果如下,显示已连接表示服务搭建成功。
- 客户端:Android
首先,要设置可以通信的权限,在AndroidManifest.xml文件里加上<uses-permission android:name="android.permission.INTERNET" />。
Android 的Socket通信可以参考http://wenku.baidu.com/view/c788653c87c24028915fc311.html,对于客户端来说,请求和接收数据分别使用getOutputStream()和getInputStream(),
参考代码:

//接收数据 Socket client = new Socket("IP","端口号"); BufferedReader reader; try { reader = new BufferedReader(new InputStreamReader( client.getInputStream())); String line = reader.readLine(); JSONObject json = new JSONObject(line); } catch (IOException e) { } catch (JSONException e) { } //发送数据 Socket client = new Socket("IP","端口号"); try { OutputStreamWriter osw = new OutputStreamWriter(client .getOutputStream()); BufferedWriter writer = new BufferedWriter(osw); JSONObject json = new JSONObject(); json .put("Message", "fs"); json .put("UserName", "fds"); writer.write(json.toString()); writer.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); }
在此感谢网友的代码,原文地址如下:http://www.cnblogs.com/GoodHelper/archive/2011/07/08/android_socket_chart.html