Android版 Sokect服务端和客户端

原创 2016年08月28日 22:13:16

服务端:

主页xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/textsss"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_margin="10dp"
        android:text="     连接情况"
        android:textSize="18sp" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="35dp"
        android:gravity="center"
        android:text="IP地址"
        android:textSize="18sp" />

</RelativeLayout>


主页代码:

import android.app.Activity;
import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;
import android.widget.TextView;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.Enumeration;

public class MainActivity extends Activity {

    public static ServerSocket serverSocket = null;
    public static TextView mTextView, textView1;
    private String IP = "";
    String buffer = "";
    public static Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 0x11) {
                Bundle bundle = msg.getData();
                mTextView.append("客户端:" + bundle.getString("msg") + "\n");
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        mTextView = (TextView) findViewById(R.id.textsss);
        textView1 = (TextView) findViewById(R.id.textView1);
        mTextView.append("\n");
        IP = getIp();
        textView1.setText("IP addresss:" + IP);
        new Thread() {
            public void run() {
                Bundle bundle = new Bundle();
                bundle.clear();
                OutputStream output;
                String str = "通信成功";
                try {
                    serverSocket = new ServerSocket(30000);
                    while (true) {
                        Message msg = new Message();
                        msg.what = 0x11;
                        try {
                            Socket socket = serverSocket.accept();
                            output = socket.getOutputStream();
//                          ps:注意数据流类型,避免乱码
//                          output.write(str.getBytes("UTF-8"));//客户端的数据流为UTF-8
//                          output.write(str.getBytes("gbk"));//客户端的数据流为gbk
                            output.write(str.getBytes());//服务端和客户端 数据流类型一致时
                            output.flush();
                            socket.shutdownOutput();
                            BufferedReader bff = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                            String line = null;
                            buffer = "";
                            while ((line = bff.readLine()) != null) {
                                if (!parseJsonMulti(line).equals(""))
                                    line = parseJsonMulti(line);
                                buffer = line + buffer;
                            }
                            bundle.putString("msg", buffer.toString());
                            msg.setData(bundle);
                            mHandler.sendMessage(msg);
                            bff.close();
                            output.close();
                            socket.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
        }.start();
    }

    private String parseJsonMulti(final String strResult) {
        String result = "";
        try {
            //解析JSON字符串
            //1.若字符串为JSON数组,则转为JSON数组,若不是,则转为JSON对象
            //2.根据JSON里数据的名称和类型,来获取想对应的值
            //JSON里数据,可能为单个JSON对象,JSON数组,或两者嵌套的
            //遇到嵌套时,只需对应JSON转换,再进行获取

            //获取字符串并转为JSONObject
            JSONObject json_data = new JSONObject(strResult);
            // 获取此次的数据类型。
            String Type = json_data.getString("Type");
            if (Type.equals("单个数据")) {
               /*{\"Type\":\"单个数据\"}*/
                result = Type;
            } else if (Type.equals("多个数据")) {
                /*{\"Type\":\"多个数据\",\"NUM\":\"号码\"}*/
                String NUM = json_data.getString("NUM");
                result = Type + "  " + NUM;
            } else if (Type.equals("嵌套JSON数组")) {
               /*{\"Type\":\"嵌套JSON数组\",\"Array\":[{\"one\":3},{\"two\":8}]}*/
                //获取JSON数组
                JSONArray Array = json_data.getJSONArray("Array");
                //获取JSON数组的JSON对象
//                JSONObject OneObject = (JSONObject) Array.opt(0);
//                JSONObject OneObject = Array.optJSONObject(0);
                //若有很多JSON对象 ,只需把0改为对象所属下标
                JSONObject OneObject = Array.getJSONObject(0);
                JSONObject TwoObject = Array.getJSONObject(1);
                int one = OneObject.getInt("one");
                int two = TwoObject.getInt("two");
                result = one + "  参数  " + two;
            }

        } catch (final JSONException e) {
            e.printStackTrace();
        } catch (final Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 当Server为本机时,获取本机IP(Wifi或非Wifi均适用)
     */
    public String getIp() {
        WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        //判断wifi是否开启
        if (!wifiManager.isWifiEnabled()) {
            return getLocalIpAddress();
        } else
            return intToIp(wifi_ip(wifiManager));
    }

    //Wifi
    private int wifi_ip(WifiManager wifiManager) {
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        int ipAddress = wifiInfo.getIpAddress();
        return ipAddress;
    }

    //非Wifi
    public String getLocalIpAddress() {
        try {
            for (Enumeration<NetworkInterface> en = NetworkInterface
                    .getNetworkInterfaces();
                 en.hasMoreElements(); ) {
                NetworkInterface intf = en.nextElement();
                for (Enumeration<InetAddress> enumIpAddr = intf
                        .getInetAddresses();
                     enumIpAddr.hasMoreElements(); ) {
                    InetAddress inetAddress = enumIpAddr.nextElement();
                    if (!inetAddress.isLoopbackAddress()) {
                        return inetAddress.getHostAddress().toString();
                    }
                }
            }
        } catch (SocketException ex) {
            return "";
        }
        return "";
    }

    /**
     * 转化获取的(16进制)IP地址
     */
    private String intToIp(int i) {
        return (i & 0xFF) + "." +
                ((i >> 8) & 0xFF) + "." +
                ((i >> 16) & 0xFF) + "." +
                (i >> 24 & 0xFF);
    }

}


客户端:

主页xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <EditText
        android:id="@+id/ed_msg"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="给服务器发送信息" />

    <Button
        android:id="@+id/send"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="发送" />

    <TextView
        android:id="@+id/msg"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <Button
        android:id="@+id/single"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="单个数据" />

    <Button
        android:id="@+id/multiple"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="多个数据  " />

    <Button
        android:id="@+id/nested"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="嵌套JSON数组" />

</LinearLayout>


主页代码:

import android.app.Activity;
import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.NetworkInterface;
import java.net.Socket;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.util.Enumeration;

public class MainActivity extends Activity implements OnClickListener {

    Socket socket = null;
    String buffer = "";
    TextView Msg;
    Button send, single, multiple, nested;
    EditText ed_msg;
    /**
     * 发送或接受的字符串
     */
    String io_msg;
    public Handler myHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 0x11) {
                Bundle bundle = msg.getData();
                Msg.append("server:" + bundle.getString("msg") + "\n");
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Msg = (TextView) findViewById(R.id.msg);
        send = (Button) findViewById(R.id.send);
        single = (Button) findViewById(R.id.single);
        multiple = (Button) findViewById(R.id.multiple);
        nested = (Button) findViewById(R.id.nested);
        ed_msg = (EditText) findViewById(R.id.ed_msg);

        new SendThread("建立连接", getIp()).start();

        send.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                String ip = getIp();
                if (!ip.equals("")) {
                    io_msg = ed_msg.getText().toString();
                    Msg.append("client:" + io_msg + "\n");
                    // 向服务器发送和接收信息
                    new SendThread(io_msg, ip).start();
                } else {
                    Toast.makeText(MainActivity.this, "ip地址获取出错!", Toast.LENGTH_SHORT).show();
                }
            }
        });

        single.setOnClickListener(this);
        multiple.setOnClickListener(this);
        nested.setOnClickListener(this);
    }

    private void Sendmsg(String json) {
        String ip = getIp();
        if (!ip.equals("")) {
            Msg.append("client:" + json + "\n");
            // 向服务器发送和接收信息
            new SendThread(json, ip).start();
        } else {
            Toast.makeText(MainActivity.this, "ip地址获取出错!", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.single:
                try {
                    JSONObject jsonObject = new JSONObject();
                    jsonObject.put("Type", "单个数据");
                    Sendmsg(jsonObject.toString());
                } catch (JSONException e) {
                    Toast.makeText(this, "发送失败!JSON异常", Toast.LENGTH_SHORT).show();
                }
                break;
            case R.id.multiple:
                try {
                    JSONObject jsonObject = new JSONObject();
                    jsonObject.put("Type", "多个数据");
                    jsonObject.put("NUM", "号码");
                    Sendmsg(jsonObject.toString());
                } catch (JSONException e) {
                    Toast.makeText(this, "发送失败!JSON异常", Toast.LENGTH_SHORT).show();
                }
                break;
            case R.id.nested:
                try {
                    JSONObject OneObject = new JSONObject();
                    OneObject.put("one", "3");

                    JSONObject TwoObject = new JSONObject();
                    TwoObject.put("two", "8");

                    JSONArray jsonArray = new JSONArray();
                    jsonArray.put(OneObject);
                    jsonArray.put(TwoObject);

                    JSONObject jsonObject = new JSONObject();
                    jsonObject.put("Type", "嵌套JSON数组");
                    jsonObject.put("Array", jsonArray);

                    Sendmsg(jsonObject.toString());
                } catch (JSONException e) {
                    Toast.makeText(this, "发送失败!JSON异常", Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }

    class SendThread extends Thread {
        public String Ip;
        public String str;

        public SendThread(String _str, String _Ip) {
            str = _str;
            Ip = _Ip;
        }

        @Override
        public void run() {
            // 定义消息
            Message msg = new Message();
            msg.what = 0x11;
            Bundle bundle = new Bundle();
            bundle.clear();
            try {
                // 连接服务器 并设置连接超时为5秒
                socket = new Socket();
                socket.connect(new InetSocketAddress(Ip, 30000), 5000);
                // 获取输入输出流
                OutputStream ou = socket.getOutputStream();
                BufferedReader bff = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                // 读取发来服务器信息
                String line = null;
                buffer = "";
                while ((line = bff.readLine()) != null) {
                    buffer = line + buffer;
                }
                // 向服务器发送信息
                // ps:注意数据流类型,避免乱码
                //ou.write(str.getBytes("UTF-8"));//服务端的数据流为UTF-8
                //ou.write(str.getBytes("gbk"));//服务端的数据流为gbk
//                ou.write(str.getBytes());//服务端和客户端 数据流类型一致时
                ou.write(str.getBytes());
                ou.flush();
                bundle.putString("msg", buffer.toString());
                msg.setData(bundle);
                // 发送消息 修改UI线程中的组件
                myHandler.sendMessage(msg);
                // 关闭各种输入输出流
                bff.close();
                ou.close();
                socket.close();
            } catch (SocketTimeoutException aa) {
                // 连接超时 在UI界面显示消息
                bundle.putString("msg", "服务器连接失败!请检查网络是否打开");
                msg.setData(bundle);
                // 发送消息 修改UI线程中的组件
                myHandler.sendMessage(msg);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 当Server为本机时,获取本机IP(Wifi或非Wifi均适用)
     */
    public String getIp() {
        WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        //判断wifi是否开启
        if (!wifiManager.isWifiEnabled()) {
            return getLocalIpAddress();
        } else
            return intToIp(wifi_ip(wifiManager));
    }

    //Wifi
    private int wifi_ip(WifiManager wifiManager) {
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        int ipAddress = wifiInfo.getIpAddress();
        return ipAddress;
    }

    //非Wifi
    public String getLocalIpAddress() {
        try {
            for (Enumeration<NetworkInterface> en = NetworkInterface
                    .getNetworkInterfaces();
                 en.hasMoreElements(); ) {
                NetworkInterface intf = en.nextElement();
                for (Enumeration<InetAddress> enumIpAddr = intf
                        .getInetAddresses();
                     enumIpAddr.hasMoreElements(); ) {
                    InetAddress inetAddress = enumIpAddr.nextElement();
                    if (!inetAddress.isLoopbackAddress()) {
                        return inetAddress.getHostAddress().toString();
                    }
                }
            }
        } catch (SocketException ex) {
            return "";
        }
        return "";
    }

    /**
     * 转化获取的(16进制)IP地址
     */
    private String intToIp(int i) {
        return (i & 0xFF) + "." +
                ((i >> 8) & 0xFF) + "." +
                ((i >> 16) & 0xFF) + "." +
                (i >> 24 & 0xFF);
    }

}


服务端及客户端的代码和xml,已全部贴出!已上传Demo,需要的请下载!参考博客:http://blog.csdn.net/u014388322/article/details/43016653

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android客户端 和 pc服务器 建立socket连接并发送数据

文章讲解了基本的 socket连接知识 提供了一个pc服务端和安卓客户端建立socket连接的例子 并简单的消息发送...
  • MR_D_j
  • MR_D_j
  • 2016年01月11日 17:15
  • 2807

Android 客户端与服务器端进行数据交互(一、登录服务器端)

概要安卓APP要实现很多功能(比如登录注册、发表评论等)时都必须要使用到网络数据交互。所以在学习了这部分内容后,就将其以最常见的登录过程为例整理出来,也方便跟我一样的新手能迅速学习上手。 预期效果图如...
  • u012145166
  • u012145166
  • 2016年05月06日 22:48
  • 26160

android客户端与服务端交互的三种方式

android客户端向服务器通信一般有以下选择: 1.传统的java.net.HttpURLConnection类 2.apache的httpClient框架(已纳入android.jar中,可直接使...
  • qq_33336155
  • qq_33336155
  • 2016年09月08日 15:46
  • 792

Android版 Sokect服务端和客户端

服务端: 主页xml:     android:layout_width="match_parent"     android:layout_height="match_parent">     ...
  • u014088486
  • u014088486
  • 2016年08月28日 22:13
  • 760

Android之发送接收服务器消息

一:什么是Socket         它实际上是网络通信的一种接口,基于不同的协议,有各种不同的Socket,比如有基于TCP协议的Socket和基于UDP协议的Socket以及基于蓝牙协议的Soc...
  • xueyuediana
  • xueyuediana
  • 2015年09月02日 18:35
  • 3086

sokect服务端与客户端的通信

package com.imooc; import java.io.BufferedReader; import java.io.IOException; import java.io.InputS...
  • wh1132633619
  • wh1132633619
  • 2017年10月24日 21:37
  • 183

linux下网络编程2:服务端和客户端进行TCP通信实例

问题:实现服务端和客户端之间的TCP通讯。 代码: 1)服务端代码: //服务端代码 #include #include #include #include #include #inclu...
  • ljp1919
  • ljp1919
  • 2015年08月13日 21:26
  • 1011

Android客户端与PC服务器通过socket进行交互实例

一直以来对Android socket通信都很模糊,今天终于研究了一个网上的例子,自己又修改了下,算是对Android socket通信有点了解了。 下面是具体的代码,说明都在注释中了。需要注意...
  • ilovezyr
  • ilovezyr
  • 2015年03月26日 10:32
  • 696

android socket简单编程(java在PC本地创建服务器)

笔者此文也不太详述socket的原理了,主要是给新手一个demo,能够更好地理解android上的socket。 主要内容: 1、在java上搭建一个简单服务器接收数据 2、在andro...
  • Double2hao
  • Double2hao
  • 2015年12月01日 19:40
  • 2050

android 蓝牙客户端与服务端通信

首先介绍基本类及方法 一,BlueboothAdapter这个就是代表本机,里面几个常用的方法如下。 1,getDefaultAdapter 这个是静态的方法,通过它可以获取BlueboothAdap...
  • lzjqcc
  • lzjqcc
  • 2016年12月04日 13:26
  • 582
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android版 Sokect服务端和客户端
举报原因:
原因补充:

(最多只允许输入30个字)