Android Socket Client

本文介绍了如何在Android中实现Socket长连接,通过新建线程进行连接操作,详细展示了客户端如何与服务器建立连接、发送和接收16进制字节数据的过程,并强调了权限设置的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不知不觉做安卓已经快两年了,主要接触的底层硬件之间的传输会多点,WIFI  我们用的是有人公司的,话不多说socket,长连接方式,代码走起:这边做的是客户端,首先得拿到服务端的IP和端口号。

     private static DataOutputStream   dos   =   null; 
     private static DataInputStream   dis   =   null; 
     private static  InetAddress serverAddr;  
     private  Socket socket; 

ok,在onCreate里面写链接操作了,一般主线程UI不做耗时操作,那么久new一个子线程。

     new Thread(new Runnable() {
             // @Override
              public void run() {    
              {  
          
              try { 
          
              System.out.println("服务器qidong...");
              serverAddr = InetAddress.getByName("192.168.1.102");//这边上服务器的地址
              socket = new Socket(serverAddr, 8899);    //服务器的端口
              System.out.println("服务器已启动...");
            handler.obtainMessage(0x07).sendToTarget();    
              
            // receive();//接收函数
             // Log.v("socket", "dealException: " + "success");
              } 
               catch (IOException e) {  
              e.printStackTrace();      
            
              }
               }
              }
              }).start();    

到这边我们就建立和服务器的socket链接了,下面接收两个重要的:发送和接收

 

首先发送;

这边做的是发送的16进制字节,也可以定义成字符串 dos.writeBytes(str);这个可以按照项目选择。

    byte[] ledclose = {0x7b,0x11,0x7d};//关          
                 try {
                    dos =new   DataOutputStream(socket.getOutputStream());
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }           
                 try {
                    dos.write(ledclose);//写入
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } 
               
                 try {
                    dos.flush();//释放
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

下面就是接收是数据处理,这边也做个子线程处理接收服务器发送过来的数据。

new Thread() {
            @Override
            public void run() {
            
                // 执行完毕后给handler发送一个空消息     
            try {
            if (socket != null && socket.isConnected()) {//判断是否链接
                
            dis =new  DataInputStream(socket.getInputStream());     //输入流
            while(strar)//strar为true
            {    
            byte[] buf = new byte[1024*4]; //这边没有做缓存,一般拿取到的数据还是做下拼接(缓存),防止拿到的数据不完整              
              int length = dis.read(buf);     
        
              if(length>0){
                  
                  for(int i=0;i<length;i++){
                       if((buf[i]==0x7B)&&(buf[i+3]==0x7B)){
                           if(buf[i+1]==0x0C){
                           
                          // int cod=Integer.parseInt(buf[i+2]+"",10);                         
                           datastr1=String.format("%d",buf[i+2]);//wendu
 
                           }
                   
                         }
                  
                       }
              }
             }
            
           }    
            dis.close();
        } catch (UnknownHostException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }    
            }
        }.start();
      
      哦哦,下班了,写的有点草率,但是基本就这些,蓝牙链接也差不多,多了个地址,下次有机会再写,如有问题望见谅

最后权限也要加一下,不然会报错的,

<uses-permission android:name="android.permission.INTERNET" />

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值