Android的Tcp网络通信 点击:115 | 回复:0



wqidjet

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:12帖 | 0回
  • 年度积分:0
  • 历史总积分:280
  • 注册:2015年6月04日
发表于:2018-08-02 14:24:13
楼主

在所有的通信中,网络通信是用到的比较多的一种,这一节我们主要是在广州微嵌安卓工业平板上学习是如何进行Tcp通信的。Tcp通信主要分为以下几个部分:建立服务器监听客户端的连接请求、建立客户端向服务器发送连接请求、服务器跟客户端建立连接后双方进行通信。
这里写图片描述

1、在安卓系统上使用网络需添加相应的权限:

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

2、获取本机的IP地址:

//获取本机IP
    public static String getIpAddressString() {        try {            for (Enumeration<NetworkInterface> enNetI = NetworkInterface
                    .getNetworkInterfaces(); enNetI.hasMoreElements(); ) {
                NetworkInterface netI = enNetI.nextElement();                for (Enumeration<InetAddress> enumIpAddr = netI
                        .getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
                    InetAddress inetAddress = enumIpAddr.nextElement();                    if (inetAddress instanceof Inet4Address && !inetAddress.isLoopbackAddress()) {                        return inetAddress.getHostAddress();
                    }
                }
            }
        } catch (SocketException e) {
            e.printStackTrace();
        }        return "";
    }

3、服务器:

//新建服务器,绑定IP跟端口ServerSocket server = new ServerSocket(port);//创建好服务器开启监听客户端连接的线程accept_thread = new accept_client();
accept_flag= true;
accept_thread.start();123456

监听客户端发来的连接请求线程:

private class accept_client extends Thread{
   @Override
   public void run() {       // TODO 自动生成的方法存根
       try {           while (!isInterrupted())
           {               if(server.isClosed()){                  return;
               }               //server.accept()用于监听客户端发来的请求,该方法是阻塞等待直到有客户端连接
               //返回值是一个用于跟客户端通信的Socket实例
               c_Socket = server.accept();               //获取连接的客户端的IP跟端口号
               InetAddress address = c_Socket.getInetAddress();
               String c_point = String.valueOf(c_Socket.getPort());  
               //在有客户端连接后,启动线程接收客户端发来的数据
               new ReadThread().start();    
           }
       } catch (IOException e) {           // TODO 自动生成的 catch 块
           e.printStackTrace();
       }       super.run();
   }
}

服务器用于不断地接收客户端发来的数据的线程:

 public class ReadThread extends Thread{

     @Override
     public void run() {
         ArrayList removeItem = new ArrayList();         if(c_Socket!=null){              //获取c_Socket的InputStream流,用于读取数据
              InputStream in = c_Socket.getInputStream();
          }         byte[] buff = new byte[100];         while (!isInterrupted())
         {             try{  
               int cnt = in.read(buff);               if (cnt >0) {
                   Log.d("ReceiveData",new String(buff,0,cnt);
               }
            }catch(Exception e) {
            }                  
        super.run();
     }
  }

服务器向客户端发送数据:

//获取c_Socket的OutputStream流,写入数据发送给客户端try {
    OutputStream out = c_Socket.getOutputStream();    //写入数据发送    
    out.write(data.getBytes());    out.flush();

} catch (IOException e) {    // TODO 自动生成的 catch 块
    e.printStackTrace();
}

//关闭服务器:server.close();//关闭Socket:c_Socket.close();1234

4、客户端:创建Socket实例,向服务器发送连接请求

private class connectToServer extends Thread{
 @Override
      public void run() {      try
      {   /*客户端向服务器发送连接请求
        *ip:服务器的IP地址
        *port:服务器创建时绑定监听的端口号
        */
          Socket mSocket = new Socket(ip,port);

      }catch(Exception ee)
      {
          ee.printStackTrace();          return;
      }      //判断是否连接成功
      if (mSocket.isConnected())
      {          //获取客户端的连接服务器所使用的端口号
          int port = mSocket.getLocalPort();          //启动接收线程读取服务器发来的数据,服务器跟客户端接收数据的线程除了使用的Socket实例不一样外,其它的操作都相同
          new ReadThread().start();
      }      super.run();
  }
}

客户端向服务器发送数据:

//获取mSocket的OutputStream流,写入数据发送给客户端try {
    OutputStream out = mSocket.getOutputStream();    //写入数据发送    
    out.write(data.getBytes());    out.flush();

} catch (IOException e) {    // TODO 自动生成的 catch 块
    e.printStackTrace();
}

关闭客户端:

mSocket.close();1

至此在安卓系统上是使用Tcp通信的最基本的功能就以实现,上述中的服务器可以监听多个客户端的连接请求,并可同时跟多个客户端通信。




热门招聘
相关主题

官方公众号

智造工程师