socket 的一个案例,注意要判断socket是否断开连接,断开连接后要自动停止监听循环和线程,不然cpu会很高

 

主要判断

try {
                            // System.out.println("判断用户是否断开");
                            // 判断用户是否断开
                            socket.sendUrgentData(0xFF);
                        } catch (Exception e) {
                            System.out.println("message断开连接");
                            // 关闭socket
                            socket.close();
                            // 释放进程 -释放cpu
                            Thread.yield();
                            // 退出循环 -释放cpu
                            break;
                        }

案例代码 

package com.fridge.socket;

import java.io.DataInputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.json.JSONArray;
import org.json.JSONObject;

import com.fridge.units.DateUtil;
import com.fridge.units.SimpleToof;

public class SocketService {
    private static final int PORT = 7625;
    private List<Socket> mList = new ArrayList<Socket>();
    private ServerSocket server = null;
    private ExecutorService mExecutorService = null;

    public static void main(String[] args) {
        new SocketService();
    }

    public SocketService() {
        try {
            server = new ServerSocket(PORT);
            mExecutorService = Executors.newCachedThreadPool();
            System.out.println("Socket服务器已启动...");
            Socket client = null;
            while (true) {
                client = server.accept();
                if (!SimpleToof.checkNotNull(client)) {
                    continue;
                }
                mList.add(client);
                mExecutorService.execute(new Service(client));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static class Service implements Runnable {

        // 用于保存用户的Socket
        public static Map<String, Socket> map = new LinkedHashMap<String, Socket>();
        private Socket socket;
        // private static DataInputStream dataInputStream = null;
        // private static PrintStream printStream = null;

        // 连接成功
        public Service(Socket socket) {
            this.socket = socket;
            try {
                // PrintStream printStream = new PrintStream(socket.getOutputStream());
                // String message = "成功连接服务器";
                // sendMessage(socket, message);

            } catch (Exception e) {
                e.printStackTrace();
            }

        }

        /**
         * 发送消息 给客户端
         * 
         * @param socketServiceUtil
         * @param message
         *            消息
         */
        public static boolean sendMessage(Socket socket, String message) {

            try {
                PrintStream printStream = new PrintStream(socket.getOutputStream());
                byte[] responseBuffer = message.getBytes("GBK");
                printStream.write(responseBuffer, 0, responseBuffer.length);
                printStream.flush();

                // System.out.println(DateUtil.getTypeDate_2(new Date()) + "服务器发送1:" + message);
            } catch (Exception e) {
                System.out.println(DateUtil.getTypeDate_2(new Date()) + "发送消息给当前用户错误!3");
                return true;
            }
            return true;
        }

        /**
         * 发送给指定的设备
         * 
         * @param message
         * @return
         */
        public static Boolean sendByDev_id(String dev_id, String message) {
            boolean bl = false;
            try {
                Socket socket = map.get(dev_id);
                if (!SimpleToof.checkNotNull(socket)) {
                    return bl;
                }
                bl = sendMessage(socket, message);
            } catch (Exception e) {
                e.printStackTrace();
                bl = false;
            }
            return bl;
        }

        public void run() {
            try {
                String message = "";
                DataInputStream dataInputStream = null;
                while (true) {
                    // 获取接收流
                    dataInputStream = new DataInputStream(socket.getInputStream());

                    byte[] buffer = new byte[1024 * 1]; // 缓冲区的大小1M
                    dataInputStream.read(buffer); // 处理接收到的报文,转换成字符串

                    message = new String(buffer, "GBK");
                    // System.out.println("message(" + message.trim() + ")");

                    // 判断是否断开连接 start 连接中会一直读取流直到有消息才会进行下一个循环,断开后会很快就读取到空的流,会一直循环占用cpu
                    if (!SimpleToof.checkNotNull(message) || !SimpleToof.checkNotNull(message.trim())) {
                        // System.out.println("message(为空" + message.trim() + ")");
                        try {
                            // System.out.println("判断用户是否断开");
                            // 判断用户是否断开
                            socket.sendUrgentData(0xFF);
                        } catch (Exception e) {
                            System.out.println("message断开连接");
                            // 关闭socket
                            socket.close();
                            // 释放进程 -释放cpu
                            Thread.yield();
                            // 退出循环 -释放cpu
                            break;
                        }
                    }
                    // 判断是否断开连接 end

                    if (SimpleToof.checkNotNull(message) && SimpleToof.checkNotNull(message.trim())) {
                        try {

                            JSONObject object = new JSONObject(message.trim());
                            String dev_id = object.optString("dev_id", "");
                            String category = object.optString("category", "");

                            // System.out.println(
                            // DateUtil.getTypeDate_2(new Date()) + "--" + dev_id + ":客户端发送" +
                            // message.trim());

                            // 添加到map中
                            if (SimpleToof.checkNotNull(dev_id)) {
                                map.put(dev_id, socket);
                            }

                            // sendByDev_id(dev_id, message);

                            // 开门或关门
                            // {"dev_id":"869696043774525","category":"71","open":"0","errno":"0"}
                            if (SimpleToof.checkNotNull(category) && "71".equals(category)) {
                                String open = object.optString("open", "");
                                String errno = object.optString("errno", "");
                                if (SimpleToof.checkNotNull(open) && SimpleToof.checkNotNull(errno)) {
                                    // System.out.println("开门或关门1");
                                    WSJsonUtil.lockStart(object);
                                }
                            }

                            // 设备开机信号
                            if (SimpleToof.checkNotNull(category) && "72".equals(category)) {
                                JSONObject obj = new JSONObject();
                                obj.put("category", "1");
                                sendMessage(socket, obj.toString());
                            }

                            // 心跳包
                            if (SimpleToof.checkNotNull(category) && "73".equals(category)) {

                            }

                            // 服务器查询锁状态
                            if (SimpleToof.checkNotNull(category) && "74".equals(category)) {
                                // System.out.println("服务器查询锁状态1");
                                WSJsonUtil.setDevLockStart(object);
                            }

                        } catch (Exception e) {
                            System.out.println("读取出错");
                            // sendMessage(socket, "读取出错");
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        /**
         * 发送给所有
         * 
         * @param message
         * @return
         */
        public static String sendAll(String message) {
            // System.out.println("map.size():" + map.size());
            // System.out.println(message + "服务器发送给全部:" + string);
            for (String string : map.keySet()) {
                Socket socket = map.get(string);
                boolean bl = sendMessage(socket, message);

                if (!bl) {
                    map.remove(string);
                }
            }
            return message;
        }

        /**
         * 判断是否已经断开连接
         * 
         * @param socketServiceUtil
         */
        public static void isReconnect() {
            try {
                // 判断用户是否断开
                for (String string : map.keySet()) {
                    Socket socket = map.get(string);
                    try {
                        // System.out.println("判断用户是否断开");
                        // 判断用户是否断开
                        socket.sendUrgentData(0xFF);
                    } catch (Exception e) {
                        map.remove(string);
                        socket.close();
                        System.out.println("isReconnect断开连接");
                    }
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        /**
         * 获取连上的信息
         * 
         * @return
         */
        public static JSONObject getMessage() {
            JSONObject object = new JSONObject();
            try {
                JSONArray array = new JSONArray();
                for (String string : map.keySet()) {
                    JSONObject object2 = new JSONObject();
                    object2.put("dev_id", string);
                    array.put(object2);
                }
                object.put("dev_ids", array);

                // JSONArray array2 = new JSONArray();
                // for (String string : ips) {
                // JSONObject obj = new JSONObject();
                // obj.put("ip", string);
                // array2.put(obj);
                // }
                // object.put("ips", array2);

            } catch (Exception e) {
                e.printStackTrace();
            }
            return object;

        }
    }
}