• 关于Socket踩过的一些坑


    Socket学习文档   http://developer.51cto.com/developer/javabook/images/3.pdf

    1.socket.shutdownOutput();

    文档解释:

    Disables the output stream for this socket. For a TCP socket, any previously written data will be sent followed by TCP's normal connection termination sequence. If you write to a socket output stream after invoking shutdownOutput() on the socket, the stream will throw an IOException.
    if an I/O error occurs when shutting down this

    具体可以参考这个帖子  http://www.blogjava.net/xuechen0721/archive/2006/04/29/44040.html

    大致就是说,.shutdownOutput()这个方法是关闭输出流,而不是关闭Socket对象本身,把这个方法放到一个流的末尾,表示我已经给你(客户端或服务端)传完信息了,你不需要在等待接收信息了

    .shutdownInput()这个方法类似。

    不用socket.shutdownOutput()来做每段消息的结束标志时,还可以用下边的方法

    //pw.write("这是"+info+"包装后的返回结果
    ");   //注意
    是作为结束标志的
    pw.println("这是"+info+"包装后的返回结果");    //prinltn和prinlt,write比较,prinltn自带换行,也可以当做结束标志

    socket.shutdownOutput()虽然没有关闭该Socket对象但是不能后续用该Socket对象传输发送数据了,必须关闭后重新new一个新的Socket。

    2.Socket关闭问题

    之前写了个Socket做监听代理,用Executor起了线程池接收Socket请求,当时服务端的用 socket = serverSocket.accept() 得到的socket在用完后没有关闭,只在客户端使用Socket时关闭了,程序部署上去一段时间,发现服务器上这个端口状态都是CLOSE_WAIT,

    一直占满线程保持CLOSE_WAIT状态导致后续Socket客户端没法再“被接收”。后来在服务端加了一行代码,使用结束后服务端也关闭Socket对象。之后再测试,就是TIME_WAIT状态了,过段时间自己就关闭了。

    PS:以前一直以为客户端和服务端Socket用的是一条通信“线”路,就像打电话一样,A(客户端)和B(服务端)通话,A主动挂断了,B肯定也“被动”挂断了,其实不是这样的;真实情况是A主动挂断了,B肯定也会保持打电话的姿态。

    3. ServerSocket.setReuseAddress(true) 启动端口重用,这行代码一定要放到绑定端口前。

    serverSocket =new ServerSocket();
    serverSocket.setReuseAddress(true);//这个设置要放在绑定端口前
    serverSocket.bind(new InetSocketAddress(serverPort));
    pool = Executors.newFixedThreadPool(poolNum);
            
    logger.info("启动监听端口:"+serverPort);
    while(true){
         socket = serverSocket.accept();
         pool.execute(new HandleSocketSer(socket));
    }

     4.多线程Socket方案

    Threadpool   ---java自带

    Executor  ---java自带

    ForkJoin  ---java8自带

    Actor模型   ---scala库自带

  • 相关阅读:
    程序员要善于在工作中找到偷懒的办法
    关于count(1) 和 count(*)
    前端设计+程序开发那点事
    关于MySQL Connector/C++那点事儿
    windows下编译php5.2.17这是闹哪样?
    easyui使用时出现这个Uncaught TypeError: Cannot read property 'combo' of undefined
    视频文件自动转rtsp流
    Jenkins Pipeline如何动态的并行任务
    Jenkins的Dockerfile中如何批量迁移原Jenkins安装的插件
    Groovy中json的一些操作
  • 原文地址:https://www.cnblogs.com/yanghaolie/p/7274215.html
Copyright © 2020-2023  润新知