Socket可以进行长连接通讯,分为客户端和服务端。
1、客户端
//①定义IP地址及端口号 private final String dstAddress_ecg = "192.168.1.107"; private final int dstPort = 8001;
//②打开socket privateSocket mSocket; private OutputStream mOutputStream; //连接socket时,不能直接在UI主线程中,不然会包:android.os.NetworkOnMainThreadException错误 private void initSocket() { try { mSocket = new Socket(dstAddress_ecg, dstPort); // mOutputStream = mSocket.getOutputStream(); } catch (UnknownHostException e) { e.printStackTrace(); Log.e(TAG, "网络异常"); } catch (IOException e) { e.printStackTrace(); Log.e(TAG, "网络异常"); } }
//③向服务端发送数据 //注意事项:在使用OutputStream.write()后,需要在写入“\r\n”,不然,服务端不会直接得到写入的数据。 private void sendData2Server(final byte[] datas) { new Thread() { public void run() { try { if(mSocket == null || mSocket.isClosed()) { initSocket(); } mOutputStream.write(datas); //发送完一条数据后,需要再写入“\r\n”,否则可能服务端不能实时收到数据。 mOutputStream.write("\r\n".getBytes());
mOutputStream.flush(); } catch (IOException e) { e.printStackTrace(); Log.e(TAG, "e=" + e); closeScoket(); } }; }.start(); }
//④关闭Socket连接 private void closeScoket() { try { if(mOutputStream != null) { mOutputStream.close(); } } catch (IOException e1) { e1.printStackTrace(); } finally { mOutputStream = null; } // try { if(mSocket != null) { mSocket.close(); } } catch (IOException e1) { e1.printStackTrace(); } finally { mSocket = null; } } |
2、服务端
public class SocketService { private static final int SOCKET_PORT = 8001; public static ArrayList<Socket> socketList = new ArrayList<Socket>();
ServerSocket serverSocket = null;
private void openSocket() { new Thread() { public void run() { try { //打开socket监听端口 serverSocket = new ServerSocket(SOCKET_PORT); // while (true) { // 每当接收到客户端的Socket请求,服务器端也相应的创建一个Socket Socket socket = serverSocket.accept(); socketList.add(socket); // new Thread(new ServerThread(socket)).start(); } } catch (IOException e) { e.printStackTrace(); System.out.println(e); return; } }; }.start(); } class ServerThread implements Runnable { private Socket socket = null; private BufferedReader bufferedReader = null;
public ServerThread(Socket socket) throws IOException { this.socket = socket; bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); } @Override public void run() { try { String content = null; while ((content = bufferedReader.readLine()) != null) { System.out.println(content); } } catch (IOException e) { e.printStackTrace(); System.out.println(e); } } }
public static void main(String[] args) { final SocketService socketService = new SocketService(); socketService.openSocket(); } } |