Androidのソケット通信

Androidのソケット通信

接続ソケットサーバー通信を実現するためにソケットクライアント書かれアンドリュース。

ソケット接続を作成し、サーバーのデータを取得

いくつかのグローバル変数を作成し、それ

private BufferedWriter writer = null;
Socket socket;

ソケットを作成します。

                // 填好IPV4的IP地址和端口,服务端会提供,问服务端要
                socket = new Socket("192.168.1.156", 1234);
                // 下面三句照抄就行
                writer = new BufferedWriter(new OutputStreamWriter(
                        socket.getOutputStream()));
                InputStream inputStream = socket.getInputStream();
                DataInputStream input = new DataInputStream(inputStream);
                // 创建一个字节数组用来接收服务端发来的字节流,多大自己说了算
                byte[] b = new byte[100000];
                // 写一个死循环,不停的接收服务端发来的数据
                while (true) {
                    // 将数据读入字节数组,返回长度
                    int length = input.read(b);
                    // 如果服务端没发数据就return不在往下执行,继续读数据
                    if (length <= 0) return;
                    // 如果服务端发的数据不为空,则把字节数组转成字符串
                    msg = new String(b, 0, length, "gb2312");
                    // 后边就可以调用数据解析的方法
                    ....
                }

JSON形式は、一般に、オブジェクトコード値へのJSON JSON形式を変換した後に係るキー値を取得するチェックストリングに対応しています。

// 其中,data是json格式的字符串,转换成了jsonObject对象
JSONObject jsonObject = new JSONObject(data);
// 获取jsonObject对象的device_id值,当然device_id是String类型的,如果是int就用int
String i = jsonObject.getString("device_id");

サーバにデータを送ります

サーバーの前提にデータを送信すると、接続はソケットを完了したということです

// 首先判断一下socket是不是已经创建连接了,如果没有就不管它
if (socket == null) return;
// str是准备发给服务端的字符串
writer.write(str);
// 发出去(留坑,继续看完)
writer.flush();

これは、ソケットと、サーバは、Androidと通信書き込み機能を完了します。しかし、これはソケット、IPv4アドレス、IPV6私のアドレスは私は少し問題のように聞いて、試していないかもしれないが、あなたが本当にそれを使用する場合、そのIPV4、IPV6のほとんどは、その後、Baiduの!

補正

わずかに問題!
私はピットに遭遇しました!
私は上記の操作は問題の書き込みを開発していない前に長い時間!
しかし、私は発見を書いた昨日は文句を言うでしょう!writer.flushでエラーが発生しました()この場所。
発見後の百度:
アンドロイドの古いバージョンの問題ではないが、(上記のようなsdk10)アンドロイドの新バージョンでは、ネットワーク要求を開始することができ、かつNetWorkInUIThreadException UIスレッド(メインスレッド)でをスローされています。
だから、子スレッドへの書き込みにサーバーの必要性にデータを送信するとき。

        new Thread(new Runnable() {
            @Override
            public void run() {
                // 首先判断一下socket是不是已经创建连接了,如果没有就不管它
                if (socket == null) return;
                // str是准备发给服务端的字符串
                writer.write("我是Android客户端发的数据");
                // 发出去
                writer.flush();
            }
        }).start();

これは、サブスレッドを開き、書き込みサブスレッドで送信データにコードやデータを送信する方法を呼び出し、問題はありません!

滞在ピット!

人生はピット以上を残して、あるところ!
:我々は、送信データのカプセル化方法にコードを配置し、送信する場合のデータ転送方法は、次のようなパラメータを、必要

public void sendData(String str){
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 首先判断一下socket是不是已经创建连接了,如果没有就不管它
                if (socket == null) return;
                // str是准备发给服务端的字符串,会报错,传进来的参数子线程进不来
                writer.write(str);
                // 发出去
                writer.flush();
            }
        }).start();
}

パラメータに親スレッドのパスは、子スレッドを読むことができないことが判明し、私は彼が解決したクラスは、内部の書いたことを長い間落ち込んでいました。

    /**
     * 接口类,实现主线程向子线程传值
     */
    class sendData implements Runnable {
        String str;
        public sendValueToServer(String str) {
            this.str = str;
        }
        @Override
        public void run() {
            try {
                // 如果socket连接失败,则停止执行
                if (socket == null) return;
                // 发送传进来的值
                writer.write(str);
                // 发出去
                writer.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

その後、書き込みに送信する場所:

new Thread(new sendData ("传值数据")).start();

コンプリート!ハッハッハ、刺激!

おすすめ

転載: www.cnblogs.com/wjw1014/p/11804296.html