上次实现了WCF与Android端的通信,这次参考网友的Demo实现聊天功能,使用Socket实现。当前使用的是Tcp,后面有时间再使用udp.

此例子用json实现,大致格式如下:{Method:"Login",Message:{username:"kevin",message="hello world"},time:"2012-10-22 11:41:32"}

  • 服务端:.net 控制台应用程序

服务器端思路是利用Socket接收数据,然后根据请求信息做相应处理

.net + Android 通信_第1张图片

首先,搭建Socket服务分为四部:实例化、绑定、侦听、接收数据。代码如下:

View Code
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来判断请求方法,然后根据请求方法作相应处理,代码如下:

View Code
 //序列化反序列化帮助类            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工具进行测试,可以点击下载,效果如下,显示已连接表示服务搭建成功。

.net + Android 通信_第2张图片

  • 客户端:Android

.net + Android 通信_第3张图片

首先,要设置可以通信的权限,在AndroidManifest.xml文件里加上<uses-permission android:name="android.permission.INTERNET" />。

Android 的Socket通信可以参考http://wenku.baidu.com/view/c788653c87c24028915fc311.html,对于客户端来说,请求和接收数据分别使用getOutputStream()和getInputStream(),

参考代码:

View Code
//接收数据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

更多相关文章

  1. 使用Java代码在应用层获取Android系统属性
  2. adb shell 命令查看android 应用程序 创建的 sqlite 数据库
  3. Android数据持久化
  4. android源代码分布结构
  5. Android提交数据到服务器的两种方式四种方法
  6. 《Android开发艺术探索》读书笔记--part2 IPC进程间通信机制
  7. Android数据解析出错com.android.volley.NoConnectionError: jav

随机推荐

  1. android 水平进度对话框
  2. Android之NetworkOnMainThreadException
  3. android 关于gallery 的平滑代码滚动
  4. android WebView结合javascript相互调用
  5. 文件读写
  6. Android(安卓)跳转Activity并通过Bundle
  7. android 实现圆形进度条
  8. Android解析微博小尾巴
  9. RecyclerView竖直和水平的瀑布流布局
  10. Android通知工具类,含8.0通知适配,打开通知