创作人 Leo
编辑时间 Wed Jan 1,2020 at 10:13
使用网络通信需要申请权限
<uses-permission android:name="android.permission.INTERNET" /><!-- 开启网络通信权限 -->
不能在主线程调用阻塞socket
会获得 NetworkOnMainThreadException
应该使用多线程方法
例:
Runnable sockThread=new Runnable(){
@Override
public void run() {
// 在线程开启socket 不阻塞UI
// 构建socket client对象
Log.i("lixin","1");
try {
Socket sock=new Socket(InetAddress.getByName("192.168.102.91"), 10011);
//Log.i("lixin",sock.toString());
OutputStream ops=sock.getOutputStream();
ops.write("Hello world".getBytes());
InputStream ins=sock.getInputStream();
byte[] buff=new byte[1024];
int len=ins.read(buff);
Log.i("lixin","recv:: "+(new String(buff, 0, len, "UTF-8")));
//recvEditText.setText(buff.toString());
sock.close();
} catch (UnknownHostException e) {
Log.w("lixin",e.getMessage());
} catch (IOException e) {
Log.w("lixin",e.getMessage());
}
}
};
//增加click事件
doSendButton.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
//sockThread.run();
(new Thread(sockThread)).start();
}
});
UI对象只能在主线程使用
否则会获取异常 CalledFromWrongThreadException
可以使用 Message+Handle 对象处理
例:
Handler myHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
recvEditText.append(recvMsg+"");
break;
}
super.handleMessage(msg);
}
};
Runnable sockThread=new Runnable(){
@Override
public void run() {
Log.i("lixin","1");
try {
Socket sock=new Socket(InetAddress.getByName("192.168.102.91"), 10011);
OutputStream ops=sock.getOutputStream();
ops.write(sendMsg.getBytes());
InputStream ins=sock.getInputStream();
byte[] buff=new byte[1024];
int len=ins.read(buff);
//Log.i("lixin","recv:: "+(new String(buff, 0, len, "UTF-8")));
recvMsg=new String(buff, 0, len, "UTF-8");
Message mess=new Message();
mess.what=1;
MainActivity.this.myHandler.sendMessage(mess);
sock.close();
} catch (UnknownHostException e) {
Log.w("lixin",e.getMessage());
} catch (IOException e) {
Log.w("lixin",e.getMessage());
}
}
};