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();
コンプリート!ハッハッハ、刺激!