解决方案 »

  1.   

    不明白你为什么要使用synchronized,我在写程序时不用synchronized直接写没有出现过这样的问题。另外为什么要每次开这么大的buffer呢?
      

  2.   

    客户端每个线程都是独立的 一般不需要加 synchronized  关键字。 楼主设置的buffer实在是太大了,
    一般1024或者512就可以了。你设置的居然有8K。
      

  3.   

    buffer 本身就是byte数组为什么要转来转去的
      

  4.   

    /**
     * 运行Socket通信的线程
     * @author TCK-001
     * @version 1.0
     */
    @SuppressLint("HandlerLeak")
    public final class SocketThread extends Thread { public void run() {
    try {
    while (true) {
    if (!SocketManager.get().isStart()) {
    return;
    }
    ServerSocket sever = SocketManager.get().getSocket();
    if (null == sever || sever.isClosed()) {
    return;
    }
    new ReadSocket(sever.accept()).start();
    }
    } catch (Exception e) {
    Log.e("AbstractActivity", "Socket已经被回收");
    }
    }

    /**
     * 读取Socket并解析
     * @author TCK-001
     * @version 1.0
     */
    public class ReadSocket extends Thread {

    private Socket socket;

    public ReadSocket(Socket socket) {
    this.socket = socket;
    }

    public void run() {
    try {
    String jsonStr = FileUtil.get().readFile(socket.getInputStream(), HTTP.UTF_8, 1, false);
    socket.close();
    JSONObject json = new JSONObject(jsonStr);
    if (json.getLong("memberId") == Container.member.getId() && Container.socketKey.equals(json.getString("socketKey"))
    && SettingService.get().getSetting(SettingService.RECEIVE_MSG)) {
    Bundle bundle = new Bundle();
    bundle.putInt("type", json.getInt("type"));
    bundle.putString("data", json.getJSONObject("data").toString());
    Message message = new Message();
    message.setData(bundle);
    TckApp.get().getLastAct(null).socketHandler.sendMessage(message);
    }
    } catch (Exception e) {
    Log.e("AbstractActivity", "接收Socket消息,解析json", e);
    }
    }

    }}
      

  5.   

    /**
     * Socket的管理器
     * @author TCK-001
     * @version 1.0
     */
    public final class SocketManager {

    private SocketManager() {}
    private static SocketManager bean = new SocketManager();
    private boolean start = false;
    private ServerSocket socket;

    /**
     * 单例模式获得bean
     * @return
     */
    public static SocketManager get() {
    return bean;
    }

    /**
     * 启动所有的Socket
     * */
    public void start() {
    if (null == Container.member || !ViewUtil.get().isNet() || start) {
    return;
    }
    getStartThread().start();
    }

    /**
     * 结束Socket
     * */
    public void end() {
    start = false;
    try {
    if (null != socket) {
    socket.close();
    socket = null;
    }
    } catch (Exception e) {
    Log.e("AbstractActivity", "关闭Socket", e);
    }
    }

    private Thread getStartThread() {
    return new Thread() {
    public void run() {
    try {
    Container.socketPort = getPort();
    ToolUtil tool = new ToolUtil(Domain.LONG_REQUEST_TIME, TckUrls.POINT_SET_SOCKET_URL);
    Container.socketKey = tool.md5(tool.getRandom(4));
    Map<String, Object> param = tool.createMap(new String[] { "ip", "port", "socketKey" }, 
    new Object[] { tool.getLocalIp(), Container.socketPort, Container.socketKey });
    tool.requestTck(param, false);
    start = true;
    new SocketThread().start();
    Log.e("AbstractActivity", "Socket已经开启");
    } catch (Exception e) {
    Log.e("AbstractActivity", "开启Socket", e);
    }
    }
    };
    }

    // 获得一个随机端口
    private int getPort() {
    int port = 0;
    while (true) {
    port = 10000 + Integer.parseInt(ToolUtil.get().getRandom(4));
    try {
    socket = new ServerSocket(port);
    break;
    } catch (Exception e) {
    Log.e("AbstractActivity", "端口[" + port + "]已被占用", e);
    }
    }
    return port;
    } /**
     * 是否正在运行socket
     * @return
     */
    public boolean isStart() {
    return start;
    } /**
     * 获得socket监听
     * @return
     */
    public ServerSocket getSocket() {
    return socket;
    }}
      

  6.   

    8K不是个问题吧
    他写8,可能是考虑字节与bit的转换关系。不过byte本身就是字节了。