关于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库自带
关于Socket踩过的一些坑的更多相关文章
- Jmeter Web 性能测试入门 (七):Performance 测试中踩过 Jmeter 的坑
脚本运行的过程中,大量request抛error,但没有地方能够查看request是因为什么error的. 原因:Jmeter默认禁掉了运行过程中每个request的具体response信息收集,只保 ...
- 三分之一的程序猿之社交类app踩过的那些坑
三分之一的程序猿之社交类app踩过的那些坑 万众创新,全民创业.哪怕去年陌生人社交不管融资与否都倒闭了不知道多少家,但是依然有很多陌生人社交应用层出不穷的冒出来.各种脑洞大开,让人拍案叫起. 下面我们 ...
- 【Fine原创】JMeter分布式测试中踩过的那些坑
最近因为项目需要,研究了性能测试的相关内容,并且最终选用了jmeter这一轻量级开源工具.因为一直使用jmeter的GUI模式进行脚本设计,到测试执行阶段工具本身对资源的过量消耗给性能测试带来了瓶颈, ...
- 与webview打交道中踩过的那些坑
随着HTML5被越来越多的用到web APP的开发当中,webview这一个神器便日渐凸显出重要地位.简要的说,webview能够在移动应用中开辟出一个窗口,在里面显示html页面,css以及js代码 ...
- 美团在Redis上踩过的一些坑-目录(本人非美团)(转)
来自:http://carlosfu.iteye.com/blog/2254154 分为5个部分: 一.周期性出现connect timeout 二.redis bgrewriteaof问 ...
- 安装python爬虫scrapy踩过的那些坑和编程外的思考
这些天应朋友的要求抓取某个论坛帖子的信息,网上搜索了一下开源的爬虫资料,看了许多对于开源爬虫的比较发现开源爬虫scrapy比较好用.但是以前一直用的java和php,对python不熟悉,于是花一天时 ...
- [原创]阿里云RocketMQ踩过的哪些坑
由于公司的最近开始使用RocketMQ来做支付业务处理, 便开启了学习阿里云RocketMQ的学习与实践之路, 其中踩了不少的坑, 大部份是由于没有仔细查看阿里云的技术文档而踩的坑. 但是有一个非常大 ...
- Spring Cloud 升级最新 Finchley 版本,踩了所有的坑!
Spring Boot 2.x 已经发布了很久,现在 Spring Cloud 也发布了 基于 Spring Boot 2.x 的 Finchley 版本,现在一起为项目做一次整体框架升级. 升级前 ...
- Redis上踩过的一些坑
来自: http://blog.csdn.net//chenleixing/article/details/50530419 上上周和同事(龙哥)参加了360组织的互联网技术训练营第三期,美团网的DB ...
随机推荐
- 动手学深度学习8-softmax分类pytorch简洁实现
定义和初始化模型 softamx和交叉熵损失函数 定义优化算法 训练模型 import torch from torch import nn from torch.nn import init imp ...
- 用cp命令拷贝文件,源目录后带不带斜杠的区别
当我还是Linux超级傻白的时候,需要拷贝一个很大的数据集,然后再拷贝源文件夹的后面跟了一个前倾斜杠,然后就发现居然拷贝的是整个文件夹里的东西,而不是文件夹本身.事儿倒是不大,我重新建一个文件夹,把这 ...
- RC4算法
RC4算法简介:https://baike.baidu.com/item/RC4%E7%AE%97%E6%B3%95/9686396?fr=aladdin RC4算法java实现: /** * RC4 ...
- 【UOJ#33】【UR #2】树上GCD(长链剖分,分块)
[UOJ#33][UR #2]树上GCD(长链剖分,分块) 题面 UOJ 题解 首先不求恰好,改为求\(i\)的倍数的个数,最后容斥一下就可以解决了. 那么我们考虑枚举一个\(LCA\)位置,在其两棵 ...
- 数据路由通信--ospf复习
数据路由通信--ospf 复习 ospf 复习 今天来回顾一下ospf ospf全名叫做开放式最短路径优先协议,它是一种基于链路状态的内部网关路由协议.ospf支持区域的划分,内部的路由器使用spf最 ...
- java设计模式结构型模式
结构型模式: – 核心作用:是从程序的结构上实现松耦合,从而可以扩大整体的类结 构,用来解决更大的问题 分类: • 适配器模式.代理模式.桥接模式. 装饰模式.组合模式.外观模式.享元模式 结构型模式 ...
- Jenkins的使用(三)-------Publish over SSH和Publish over FTP
七.构建后操作 1.使用Publish over SSH 1.左边菜单栏 Manage Jenkins --->ManagePlugins--->可选插件,然后搜索 Publish ...
- Git远程协作和分支
一.远程基本操作 基本的配置远程仓库有两个命令: git remote add origin git@github.com:ZXZxin/gitlearn.git : git push -u orig ...
- Spring事务源码解析(二)获取增强
在上一篇文章@EnableTransactionManagement注解解析中,我们搭建了源码阅读的环境,以及解析了开启Spring事务功能的注解@EnableTransactionManagemen ...
- i春秋——“百度杯”CTF比赛 十月场——EXEC(命令执行、带外通道传输数据)
查看源码得知由vim编写,所以查找备份以及交换文件 找到 /.index.php.swp ,下载后用vim -r恢复该文件即可得到源码 1 <html> 2 <head> 3 ...