关于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+"包装后的返回结果\r\n"); //注意\r\n是作为结束标志的 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库自带
转载于:https://www.cnblogs.com/yanghaolie/p/7274215.html
关于Socket踩过的一些坑相关推荐
- python iocp_记对协程增加IOCP支持时候踩过的一些坑
之前在对tbox的协程库中增加了基于IOCP的io处理,期间踩了不少的坑,这边就做个简单记录吧,省的到时候忘记了,自己看不懂自己这个代码 (= =) 坑点一 WSARecv/WSASend在lpNum ...
- 那些年我们踩过的Hive坑
原文地址:https://blog.csdn.net/sunnyyoona/article/details/51648871 1. 缺少MySQL驱动包 1.1 问题描述 Caused by: org ...
- [Hive]那些年我们踩过的Hive坑
1. 缺少MySQL驱动包 1.1 问题描述 Caused by: org.datanucleus.store.rdbms.connectionpool.DatastoreDriverNotFound ...
- 安装python爬虫scrapy踩过的那些坑和编程外的思考
'转载地址:http://www.cnblogs.com/rwxwsblog/p/4557123.html' 这些天应朋友的要求抓取某个论坛帖子的信息,网上搜索了一下开源的爬虫资料,看了许多对于开源爬 ...
- Vue2.0配置mint-ui踩过的那些坑
Vue2.0配置mint-ui踩过的那些坑 最近开发项目的时候逐渐采用vue.js+mint-ui的技术栈,但是昨天开始配置开发环境的时候,遇到了各种报错,即使是按照两家的官方文档配置,也还是会报错, ...
- 与webview打交道中踩过的那些坑
随着HTML5被越来越多的用到web APP的开发当中,webview这一个神器便日渐凸显出重要地位.简要的说,webview能够在移动应用中开辟出一个窗口,在里面显示html页面,css以及js代码 ...
- charles都踩过哪些坑_开水果店的你,踩过了哪些坑?
我们认为,开水果店遇到的大小问题,很多时候是有共性的.不论是开店新手还是老手,看看这里的案例,是否可以避免走一些弯路呢? 案例1 刘大飞第1次创业开水果踩过的那些坑.创业开水果店之前,刘大飞和合伙人一 ...
- 美团在Redis上踩过的一些坑-5.redis cluster遇到的一些问题
转载请注明出处哈:http://carlosfu.iteye.com/blog/2254154 由于演讲时间有限,有关Redis-Cluster,演讲者没做太多介绍,简单的介绍了一些Redis-Clu ...
- Spring Cloud 升级最新 Finchley 版本,踩了所有的坑
转载自 Spring Cloud 升级最新 Finchley 版本,踩了所有的坑 Spring Boot 2.x 已经发布了很久,现在 Spring Cloud 也发布了 基于 Spring Bo ...
- (转)Redis上踩过的一些坑-美团
上上周和同事(龙哥)参加了360组织的互联网技术训练营第三期,美团网的DBA负责人侯军伟给大家介绍了美团网在redis上踩得一些坑,讲的都是干货和坑. 分为5个部分: 一.周期性出现connect t ...
最新文章
- 简单探讨TypeScript 枚举类型
- 学界 | 量化深度强化学习算法的泛化能力
- PMSM的FOC 矢量控制算法调试流程,新手上手流程
- gpio 树莓派3a+_树莓派4正式发布!硬件性能大提升:CPU提升3倍,支持USB3.0、蓝牙5.0、千兆以太网、4G LPDDR4、H.265...
- C++:函数参数不确定时用cstdarg(stdarg.h)
- Python笔记-windows平台中Flask打包成exe
- python飞机大战跟随鼠标移动_用Python写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动...
- 知乎热议!学完 Python 之后,我的编程能力竟然退化了!
- 全员编程的时代下,软件测试如何转渗透测试?
- 数据库和数据库管理系统的区别
- 身份证号实名认证标准版API开发文档
- 您选择的不是数据库安装目录_您不是您的数据,但您的数据仍然是您
- 99道python测试题
- 【LOJ574】「LibreOJ NOI Round #2」黄金矿工
- HTML5期末大作业:电影在线网站设计——漫威电影(2页) 免费大学生网页设计制作作业作品下载dreamweaver制作静态html网页设计作业作
- Windows 自启动文件夹
- Spring Integration基本用法
- 各大门户调查:鄙视新浪,将博士伦的广告挂在热点新闻中间好几天了,把大众当傻瓜...
- 2021年起重机司机(限桥式起重机)考试题库及起重机司机(限桥式起重机)模拟考试题
- x38和x48是服务器芯片吗,主板芯片组 p35 p43 和 p45 有什么不同??????