<uses-permission android:name="android.permission.INTERNET" />
1 private Handler mainhandler=new Handler(){
2 @Override
3 public void handleMessage(Message msg) {
4 //获取到命令,进行命令分支
5 int handi=msg.arg1;
6 switch (handi){
7 case 0:
8 String ormsg=(String)msg.obj;
9 disSocket();断开网络
10 Toast.makeText(MainActivity.this,"发生错误=>:"+ormsg,Toast.LENGTH_SHORT).show();
11 break;
12 case 113 Toast.makeText(MainActivity.,1)">14 15 case 216 收到数据
17 String str1=18 main_rx.setText(str1);
19 20 default:21 }
22 }
23 };
连接按钮监听
2 main_conn.setOnClickListener( View.OnClickListener() {
3 @Override
4 onClick(View v) {
5 String strip=main_ip.getText().toString().trim();
6 if(strip.indexOf(":")>=0){
7
8 开始启动连接线程
9 Socket_thread(strip).start();
10
11 }
12
13 }
14 });
发送按钮监听
2 main_send.setOnClickListener( @Override
4 5 得到输入框内容
6 final String senddata=main_tx.getText().toString().trim();
7
8 if(!senddata.equals("")){
9 发送因为使用的是线程,所以先后顺序不一定
10 发送字符串数据
sendStrSocket(senddata);
发送十六进制数据
13 sendByteSocket(new byte[]{0x01,0x02,0x03});
14
15 }else Toast.makeText(MainActivity.16 }
17 });
class Socket_thread extends Thread
{
private String IP="";ip地址
4 private int PORT=0;端口号
5 public Socket_thread(String strip){
构造方法需要传递服务器的IP地址和端口号
7 如: 192.168.43.222:8099
进行字符串分隔,得到服务器IP地址和端口号
9 String[] stripx= strip.split(":");
10 this.IP=stripx[0];
11 this.PORT=Integer.parseInt(stripx[1]);
12 14 run() {
15 try {
16
17 disSocket();断开上次连接
18 if(sock !=null19 outx.close();
20 inx.close();
21 sock.close();关闭
22 sock=23 24 开始连接服务器,此处会一直处于阻塞,直到连接成功
25 sock=new Socket(this.IP,this.PORT);
26
27 阻塞停止,表示连接成功,发送连接成功消息
28 Message message= Message();
29 message.arg1=130 mainhandler.sendMessage(message);
31
32 }catch (Exception e) {
33 Message message=34 message.arg1=035 message.obj="连接服务器时异常"36 37
38 System.out.println("建立失败////////////////////////////////////////////"39 e.printStackTrace();
40 return41 42 43 获取到输入输出流
44 outx=sock.getOutputStream();
45 inx=sock.getInputStream();
46 } 47 发送连接失败异常
48 Message message=49 message.arg1=050 message.obj="获取输入输出流异常"51 52
53 System.out.println("流获取失败////////////////////////////////////////////"54 55 56 57
58 new Outx().start();
59 Inx().start();
60 61 }
disSocket(){
2 如果不为空,则断开socket
5 outx.close();
6 inx.close();
7 sock.close(); 8 sock = 9 } (Exception e){
11 Message message=12 message.arg1=013 message.obj="断开连接时发生错误"14 15
17 18
19 }
循环接收数据
class Inx Thread{
@Override
while(true 6
byte[] bu=byte[1024 9 得到-1表示服务器断开
10 int conut=inx.read(bu);设备重启,异常 将会一直停留在这
11 if(conut==-112 13 Message message=14 message.arg1=015 message.obj="服务器断开" mainhandler.sendMessage(message);
17 disSocket();断开连接
18 System.out.println("**********服务器异常*********:"+conut);
21
22 必须去掉前后空字符,不然有这个会有1024个字符每次
23 strread=new String(bu,"GBK").trim();
24 发送出收到的数据
25 Message message=26 message.arg1=227 message.obj=strread;
28 mainhandler.sendMessage(message);
29
30 } (IOException e) {
31 System.out.println(e);
32
33 }
34 } }}
发送字符串
void sendStrSocket(final String senddata){
new Thread( Runnable() {
4 6 7 可以经过编码发送字符串
8 outx.write(senddata.getBytes("gbk"));"utf-8"
9
10 } 11 12 Message message=13 message.arg1=014 message.obj="数据发送异常"15 mainhandler.sendMessage(message);
}).start();
19 }
发送十六进制
2 void sendByteSocket(final byte[] senddata){
5 6 8 outx.write(senddata);
10 } 12 Message message=13 message.arg1=014 message.obj="数据发送异常" mainhandler.sendMessage(message);
}).start();
19 }