zoukankan      html  css  js  c++  java
  • .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

  • 相关阅读:
    使用电脑中发现的一些技巧
    容灾备份技术 (容灾备份的等级和技术 )
    网际风客户端版本更新历史 武胜
    判断用户是否在操作 武胜
    最大子段和 武胜
    金质打印通 示例 zt 武胜
    WCF中的集合类型 zt 武胜
    C# 批量插入Mysql zt 武胜
    程序算法与人生选择 zt 武胜
    网际风的通视接口 武胜
  • 原文地址:https://www.cnblogs.com/liqiao/p/2733667.html
Copyright © 2011-2022 走看看