package com.rockchip.alexa.jacky.socket; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; /** * TCP Socket服务器端 * * @author Jacky * @since 2017-3-13 */ public class TcpServer implements Runnable, SocketListener { private int port; private boolean runFlag; private List clients = new ArrayList(); private SocketListener mSocketListener; /** * 实例化 * * @param port * 监听的端口 */ public TcpServer(int port) { this.port = port; } public void setSocketListener(SocketListener socketListener) { this.mSocketListener = socketListener; } /** * 启动服务器 *

* 如果启动失败,会回调{@code onServerStop()} */ public void start() { runFlag = true; new Thread(this).start(); } /** * 停止服务器 *

* 服务器停止后,会回调{@code onServerStop()} */ public void stop() { runFlag = false; } /** * 监听端口,接受客户端连接(新线程中运行) */ @Override public void run() { try { if (mSocketListener != null) { mSocketListener.onServerStart(); } else { onServerStart(); } final ServerSocket server = new ServerSocket(port); while (runFlag) { try { final Socket socket = server.accept(); startClient(socket); } catch (IOException e) { // 接受客户端连接出错 e.printStackTrace(); this.onConnectFail("127.0.0.1", port); } } // 停止服务器,断开与每个客户端的连接 try { for (SocketTransceiver client : clients) { client.stop(); } clients.clear(); server.close(); } catch (Exception e) { e.printStackTrace(); } } catch (IOException e) { // ServerSocket对象创建出错,服务器启动失败 e.printStackTrace(); } if (mSocketListener != null) { mSocketListener.onServerStop(); } else { onServerStop(); } } /** * 启动客户端收发 * * @param socket */ private void startClient(final Socket socket) { SocketTransceiver client = new SocketTransceiver(mSocketListener != null ? mSocketListener : this, socket); client.start(); clients.add(client); if (mSocketListener != null) { mSocketListener.onConnect(client); } else { onConnect(client); } } @Override public void onServerStart() { System.out.println("onServerStart"); } @Override public void onConnect(SocketTransceiver addr) { System.out.println("onConnect"); } @Override public void onConnectFail(String ip, int port) { System.out.println("onConnectFail"); } @Override public void onConnectTimeout(String ip, int port) { System.out.println("onConnectTimeout"); } @Override public void onReceive(SocketTransceiver addr, String msg) { System.out.println("onReceive. msg:" + msg); addr.send(msg); } @Override public void onDisconnect(SocketTransceiver addr) { System.out.println("onDisconnect"); } @Override public void onServerStop() { System.out.println("onServerStop"); } }