安卓之必须了解的实时通信(Socket)

移动开发 作者: 2024-08-20 01:25:02
Socket: 有服务器和客户端之分,其是对TCP/IP的封装,使用IP地址加端口,确定一个唯一的点。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket
<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 }

原创声明
本站部分文章基于互联网的整理,我们会把真正“有用/优质”的文章整理提供给各位开发者。本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
本文链接:http://www.jiecseo.com/news/show_65247.html