在所有的通信中,网络通信是用到的比较多的一种,这一节我们主要是在广州微嵌安卓工业平板上学习是如何进行Tcp通信的。Tcp通信主要分为以下几个部分:建立服务器监听客户端的连接请求、建立客户端向服务器发送连接请求、服务器跟客户端建立连接后双方进行通信。
1、在安卓系统上使用网络需添加相应的权限:
<uses-permission android:name="android.permission.INTERNET" />12、获取本机的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();12344、客户端:创建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通信的最基本的功能就以实现,上述中的服务器可以监听多个客户端的连接请求,并可同时跟多个客户端通信。