.net + Android 通信

上次实现了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服务分为四部:实例化、绑定、侦听、接收数据。代码如下:

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工具进行测试,可以点击下载,效果如下,显示已连接表示服务搭建成功。

  • 客户端:Android

首先,要设置可以通信的权限,在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

原文地址:https://www.cnblogs.com/liqiao/p/2733667.html