Android简单Socket客户端编写

创作人 Leo


编辑时间 Wed Jan 1,2020 at 10:13


Android简单Socket客户端编写

使用网络通信需要申请权限

<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());
          }
     }
     
};

阅读:928
搜索
  • Linux 高性能网络编程库 Libevent 简介和示例 2578
  • web rtc 学习笔记(一) 2355
  • Mac系统编译PHP7【20190929更新】 2304
  • react 学习笔记(一) 2245
  • zksync 和 layer2 2237
  • Hadoop 高可用集群搭建 (Hadoop HA) 2182
  • Hadoop Map Reduce 案例:好友推荐 2151
  • 小白鼠问题 2085
  • Linux 常用命令 2082
  • 安徽黄山游 2058
简介
不定期分享软件开发经验,生活经验