android的Tcp网络通信

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/WQFAE01/article/details/78875729

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

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

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

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

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

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

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

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

扫描二维码关注公众号,回复: 5031772 查看本文章

猜你喜欢

转载自blog.csdn.net/WQFAE01/article/details/78875729
今日推荐