今天阿里发来一封邮件说我的服务器CPU达到了90%!很是震惊啊,这台服务器仅仅跑了一个java写的app服务器而已,而且只有我一个人测试用。
于是好奇地登上后台,发现已经超高CPU(100%)好久了,都不知道是什么时候开始的。。。估计了一下,应该是我的java程序有什么漏洞,再加上最近没有做什么大的改动,估计两个月之前运行的时候就已经占满CPU了,一直被蒙在鼓里。
登上服务器,top一下,果然java进程独占CPU啊。。。
首先看了下程序输出,异常的正常。。。又检查了一遍源代码,没有头绪,看网上说用strace检查进程状态,但是看来看去只有futex一行,折腾来折腾去,查不出毛病,于是尝试还原BUG。
经过几次尝试,发现每次app上用户退出时,CPU就会瞬间飙升到100,于是检查socket部分。
我的代码大体是如此写的
8while(socket.isConnect())
String str = socket.readLine();
if(str==null)
continue;
//handle str and write
socket.close();
在readLine后加上输出调试代码,于是当我退出app时,服务器控制台的输出真的是如滔滔江水啊,结束之后日志文件大概写了1个G数据。。。密密麻麻全部是null,终于定位到错误点了,把continue改成break,至此,解决。
如何正确有效的判断socket连接是否还有效呢
首先,说一下我用来判断的那个坑爹的函数
isClosed() 字面上意思是判断是否socket已关闭,然而它的真正含义是判断己方的socket是否关闭,这个跟建立起来的链路没有半毛钱关系。也就是说,除非己方执行了soket.close()操作,否则这个就是一直返回false(从连接建立开始算)。真是个鸡肋的函数
还有这个,
isConnected() 实际上是告诉你是否执行了连接操作,只要不执行socket.close(),始终返回true
socket通信中,一方关闭连接并不会自动告知对方,另一方只有在read或者write的时候才能发现异常,并且write会抛出异常,而read一般不会
当一方结束通信时,另一方read的结果是:(JAVA)
read 返回 -1
readLine 返回 null
readXXX 抛出异常
write会抛出IOException
然后给出一个比较好一点的判断方法
通过read的结果判断连接是否已经中断,再加上try catch
10try{
String str = socket.readLine();
while(str != null)
//do something
str = socket.readLine();
}catch(IOException ex){
“喂,听得到我说话吗?”“喂?”“喂?”这是花费了两个小时换来的“血”的教训啊写在最前面的依旧是一大段废话来龙去脉今天阿里发来一封邮件说我的服务器CPU达到了90%!很是震惊啊,这台服务器仅仅跑了一个java写的app服务器而已,而且只有我一个人测试用。于是好奇地登上后台,发现已经超高CPU(100%)好久了,都不知道是什么时候开始的。。。估计了一下,应该是我的java程序有什么漏洞,再加上最近没...
/// By: Yi Dongliang
/// Date:2010-04-23
///
Socket
TCP
协议的服务类。引入
连接
会话超时概念,使用事件机制抛出服务产生的异常和接收到的数据。
/// 主要2个类:
///
Tcp
Server 服务类,要负责监听
连接
,并为每
一个
连接
创建Session后放置在Session列表中。
///
Socket
Session 客户端
Socket
连接
会话类,保存会话信息,接收处理数据,返回数据给客户端。
/// 主要2个线程:
/// 监听客户端
连接
的线程,监听所有客户端的链接创建并分配会话。
/// 会话遍历线程,遍历会话列表,清理会话超时,客户端断开
连接
的会话。遍历循环每次Sleep(600).
/// 注: 整个代码未经过严格测试!仅供参考!
下面来罗列一下
判断
远端已经断开的方法:
当recv()返回值小于等于0时,
socket
连接
断开。但是还需要
判断
errno
是否
等于 EINTR,如果errno == EINTR 则说明recv函数是由于程序接收到信号后返回的,
socket
连接
还是正常的,不应close掉
socket
连接
。
struct
tcp
_info info;
int len=size
以下实例演示了如何
检测
端口
是否
已经使用: 实例 import
java
. net .*;
import
java
. io .*;
public class Main {
public static void main ( String [ ] args ) {
Socket
Skt ;
String host = " localhost " ;
if ( args . length >
### 基于
TCP
的
socket
网络传输视频(C++, python)
可以实现C++ to C++、Python to python、C++ to Python的视频或图像传输。
### 一. 概述 ###
Socket
的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是
一个
通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开
一个
Socket
,并绑定到
一个
端口上,不同的端口对应于不同的服务。
Socket
正如其英文原意那样,像
一个
多孔插座。一台主机犹如布满各种插座的房间,每个插座有
一个
编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。网络上的两个程序通过
一个
双向的通信
连接
实现数据的交换,这个
连接
的一端称为
一个
socket
。
而
socket
与
socket
之间的
连接
以及数据传输需要一种规则,也就是我们通常所说的网络传输协议,最常用的有
TCP
和UDP,这两种协议的区别如下:
1.基于
连接
与无
连接
;
2.对系统资源的要求(
TCP
较多,UDP少);
3.UDP程序结构较简单;
4.流模式与数据报模式 ;
5.
TCP
保证数据
正确
性,UDP可能丢包,
TCP
保证数据顺序,UDP不保证。
接下来将以图片传输为例,用Python和C++实现服务端和客户端。这里不用语言得到的端口之间也可以互相
连接
。
### 二. 运行要求 ###
(1)OpenCV
(2)Python 2.7
(3)C++的源文件要求windows环境
### 三. 参考资料 ###
--------
该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用!
1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!
2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。
3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也
可用
于毕设、课设、作业等。
下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
--------
php
socket
Socket
位于
TCP
/IP协议的传输控制协议,提供客户-服务器模式的异步通信,即客户向服务器发出服务请求,服务器接收到请求后,提供相应的反馈或服务!我练习了
一个
最基本的例子:
使用并发起
一个
阻塞式(block)
连接
,即服务器如果不返回数据流,则一直保持
连接
状态,一旦有数据流传入,取得内容后就立即断开
连接
。代码如下:复制代码 代码如下:<?php$host = www.sohu.com; //这个地址随便,用新浪的也行,主要是测试用,哪个无所谓$page = “/index.html”;$port = 80;$request = “GET $page HTTP/1.1\r\n
/// By: Yi Dongliang
/// Date:2010-04-23
///
Socket
TCP
协议的服务类。引入
连接
会话超时概念,使用事件机制抛出服务产生的异常和接收到的数据。
/// 主要2个类:
///
Tcp
Server 服务类,要负责监听
连接
,并为每
一个
连接
创建Session后放置在Session列表中。
///
Socket
Session 客户端
Socket
连接
会话类,保存会话信息,接收处理数据,返回数据给客户端。
/// 主要2个线程:
/// 监听客户端
连接
的线程,监听所有客户端的链接创建并分配会话。
/// 会话遍历线程,遍历会话列表,清理会话超时,客户端断开
连接
的会话。遍历循环每次Sleep(600).
/// 注: 整个代码未经过严格测试!仅供参考!
2011/03/04 修正事件激发中的一些小BUG,以及
连接
意外断开时的
一个
错误。
2011/03/08 修正事件触发时未
判断
委托
是否
为空的错误,修正当客户端主动断开
连接
时 Session对象仍进行数据接收将产生的错误
此版本为最稳定版本
源码下载地址:
http://download.csdn.net/source/2768840
bin 目录:编译好的提供调用的程序集
ConsoleApplication1 :
Tcp
Server 调用实例
Tcp
Server :服务端
Socket
Client :客户端
源码有详细注释及说明。
如有任何BUG请反馈至 yidongliang123@163.com ,谢谢!
www.bugucn.com
/// By: Yi Dongliang
/// Date:2010-04-23
///
Socket
TCP
协议的服务类。引入
连接
会话超时概念,使用事件机制抛出服务产生的异常和接收到的数据。
/// 主要2个类:
///
Tcp
Server 服务类,要负责监听
连接
,并为每
一个
连接
创建Session后放置在Session列表中。
///
Socket
Session 客户端
Socket
连接
会话类,保存会话信息,接收处理数据,返回数据给客户端。
/// 主要2个线程:
/// 监听客户端
连接
的线程,监听所有客户端的链接创建并分配会话。
/// 会话遍历线程,遍历会话列表,清理会话超时,客户端断开
连接
的会话。遍历循环每次Sleep(600).
/// 注: 整个代码未经过严格测试!仅供参考!
2010/10/19 修正客户端断开状态不能及时
检测
的BUG,修正会话时间计算准确性。
一些其他小BUG修正
内附调用示例
请尊重他人的辛苦劳动,保留作者。
问题反馈:yidongliang123@163.com
www.bugucn.com