- 浏览: 244728 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
Wangwei86609:
非常好的规则引擎框架,支持决策树和多线程运行规则https:/ ...
规则引擎 -
xl6861989:
2 楼正确
Maven中<dependencies>节点和<dependencyManagement>节点的区别 -
cuitengfei2006x:
抄别人的有意思吗
hadoop MapReduce join -
rainbow_小春:
写的真心赞,向你学习,学着自己写一些东西
hadoop MapReduce join -
zsx0321:
outputStreamReader 应改为OutputStr ...
从装饰者模式的理解说JAVA的IO包
一.
网络程序运行过程中的常见异常及处理
该异常发生在服务器端进行new
ServerSocket(port)(port是一个0,65536的整型值)操作时。异常的原因是以为与port一样的一个端口已经被启动,并进行监
听。此时用netstat –an命令,可以看到一个Listending状态的端口。只需要找一个没有被占用的端口就能解决这个问题。
该异常发生在客户端进行
new Socket(ip,
port)操作时,该异常发生的原因是或者具有ip地址的机器不能找到(也就是说从当前机器不存在到指定ip路由),或者是该ip存在,但找不到指定的端
口进行监听。出现该问题,首先检查客户端的ip和port是否写错了,如果正确则从客户端ping一下服务器看是否能ping通,如果能ping通(服务
服务器端把ping禁掉则需要另外的办法),则看在服务器端的监听指定端口的程序是否启动,这个肯定能解决这个问题。
该异常在客户端和服务器均可能发生。异常的原因是
己方主动关闭了连接后(调用了Socket的close方法)再对网络连接进行读写操作。
该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个,第一个就是如果一端的Socket被关闭
(或主动关闭或者因为异常退出而引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。另一个是一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常
(Connection reset)。简单的说就是在连接断开后的读和写操作引起的。
该异常在客户端和服务器均有可能发生。在第4个异常的第一种情况中(也就是抛出
SocketExcepton:Connect reset by peer:Socket write
error后),如果再继续写数据则抛出该异常。前两个异常的解决方法是首先确保程序退出前关闭所有的网络连接,其次是要检测对方的关闭连接操作,发现对
方关闭连接后自己也要关闭该连接。
第3个问题是处理效率问题。不管是客户端还是服务器,如果是长连接一个程序至少需要两个线程,一个用于接
收数据,一个用于发送心跳,写数据不需要专门的线程,当然另外还需要一类线程(俗称Worker线程)用于进行消息的处理,也就是说接收线程仅仅负责接收
数据,然后再分发给Worker进行数据的处理。如果是短连接,则不需要发送心跳的线程,如果是服务器还需要一个专门的线程负责进行连接请求的监听。这些
是一个通信程序的整体要求,具体怎么设计你的程序,就看你自己的设计水平了。
第1个异常是
java.net.BindException:Address already in use: JVM_Bind。
第2个异常是java.net.ConnectException: Connection
refused: connect。
第3个异常是java.net.SocketException: Socket is
closed,
第4个异常是java.net.SocketException: (Connection
reset或者Connect reset by peer:Socket write error)。
第5个异常是java.net.SocketException: Broken pipe。
二.编写网络程序时需
要注意的问题
第1个问题是要正确区分长、短连接。所谓的长连接是一经建立就永久保持。短连接就是在以下场景下,准备数据—>建立连接—
>发送数据—>关闭连接。很多的程序员写了多年的网络程序,居然不知道什么是长连接,什么是短连接。
第2个问题是对长连接的维护。所谓的维护包括两个方面,首先是检测对方的主动断连(既调用
Socket的close方法),其次是检测对方的宕机、异常退出及网络不通。这是一个健壮的通信程序必须具备的。检测对方的主动断连很简单,主要一方主
动断连,另一方如果在进行读操作,则此时的返回值只-1,一旦检测到对方断连,则应该主动关闭己方的连接(调用Socket的close方法)。而检测对
方的宕机、异常退出及网络不通常用方法是用“心跳”,也就是双方周期性的发送数据给对方,同时也从对方接收“心跳”,如果连续几个周期都没有收到对方心
跳,则可以判断对方或者宕机或者异常推出或者网络不通,此时也需要主动关闭己方连接,如果是客户端可在延迟一定时间后重新发起连接。虽然Socket有一
个keep alive选项来维护连接,如果用该选项,一般需要两个小时才能发现对方的宕机、异常退出及网络不通。
4 和zxccss的交互.因为开始短连接的话,不用考虑到线程的同步问题.现在做长连接,如果多个线程访问同一个
socket,这个全局的socket就需要进行资源保护,因为算法库是由zxccss的线程调用的,他的线程的运行机制我也不熟悉,发了邮件给
zxccss以前的作者李伟华,在深圳的李伟华虽然现在不做这个东西了,但是他很热情的帮我联系到了现在负责这个东西的同事,这里对他赞一个.后来问清了
zxccss的线程机制 ,用信号量的方法对全局长连接socket进行保护.修改代码.
5 和华为的交流问题,我不知道华为的态度是什么,反
正感觉是他们对这个项目不是很重视,投入的人力精力都不够,还好在各位同事的帮忙督促下,他们也在一点一点的做东西,其实中兴华为人家外面的人和称"中华
为兴",如果这个东西他们合作一些,至少可以在一半的时间内做好。我们做底层开发的还能做什么?不过是把手头的工作做好罢了.
6 这周和用服的
三个同事同吃同住同劳动,感觉到这这边的辛苦,没有一天是2点前岁的,早上9点过又去了.通过和他们交流,我越来越感觉到个东西.大家都觉得现在的版本管
理啊,项目升级啊有诸多的问题.我没有接触,感觉不深,但是这次这个zxcomsvr搞的我是很是郁闷的.从开发的角度来说,除了平时大家负责一点,多想
想自己的代码,少出点bug外,我们这边能不能建立一个bug数据库这样类似的东西,把开发,现场的bug想办法放到数据库中,以后遇到了,好去重现,或
去修改,或者大家把自己遇到的问题,解决方法都放到里面去,做个有效的搜索机制供别人使用,这自己虽然花的时间多了一点点,但是能为后来的人节省很多的时
间,这是我的一点不成熟的想法,只有个大概的概念。不过这种东西如果推广,应该可以受到大家,特别是前方用服的欢迎的。
Socket
通信(发送&接收)
import java.net.*;
import java.io.*;
public class SocketClient {
private String
hostName;
private int portNum;
private int delaySecond;
//
发文接收返回报文延时
this.hostName =
"192.168.0.1";
this.portNum = 7000;
this.delaySecond =
50000;
pFileOp = null;
}
Socket socket =
null;
try {
socket = new Socket(hostName,
portNum);
} catch (UnknownHostException e) {
System.out.println("-->未知的主机名:" + hostName + " 异常");
}
catch
(IOException e) {
System.out.println("-hostName=" +
hostName +
" portNum="
+ portNum + "---->IO异常错误" +
e.getMessage());
}
return socket;
}
public
String sendMessage(String strMessage) {
String str = "";
String serverString = "";
Socket socket;
try
{
socket = getSocket();
//
socket.setKeepAlive(true);
if (socket == null) { //
未能得到指定的Socket对象,Socket通讯为空
return "0001";
}
PrintWriter out = new
PrintWriter(socket.getOutputStream());
//log.info("---->发送报文="+strMessage);
out.println(strMessage);
out.flush();
BufferedReader in = new BufferedReader(new
InputStreamReader(
socket.getInputStream()));
long sendTime =
System.currentTimeMillis();
long receiveTime =
System.currentTimeMillis();
boolean received = false; //
成功接收报文
boolean delayTooLong = false;
serverString
= null;
while (!received && !delayTooLong)
{
if (socket.getInputStream().available() > 0)
{
// serverString = in.readLine();
char tagChar[];
tagChar = new
char[1024];
int len;
String
temp;
String rev = "";
if
((len =
in.read(tagChar)) != -1) {
temp = new
String(tagChar,
0, len);
rev += temp;
temp
= null;
}
serverString =
rev;
}
receiveTime =
System.currentTimeMillis();
if (serverString !=
null)
received =
true; // 字符串不为空,接收成功
if ((receiveTime - sendTime) > delaySecond)
delayTooLong = true; //
接收等待时间过长,超时
}
in.close();
out.close();
if (delayTooLong)
str="2190"; //超时标志为真,返回超时码
if
(!received) str ="2190";
socket.close();
}
catch
(UnknownHostException e) {
log.error("---->出现未知主机错误!
主机信息=" +
this.hostName + " 端口号="
+ this.portNum + "
出错信息=" +
e.getMessage());
str = "2191";
//
System.exit(1);
} catch (IOException e) {
log.error("---->出现IO异常! 主机信息=" + this.hostName + "
端口号="
+ this.portNum + " 出错信息=" +
e.getMessage());
e.printStackTrace();
str =
"2191";
} catch (Exception e) {
str="2177";
log.error("---->出现未知异常" +
e.getMessage());
} finally {
socket =
null;
str.trim();
//log.info("--->返回的socket通讯字符串="+str);
return str;
}
}
A,B
连接得到服务器确认后
A承担工作,发送接受命令与服务端通讯,同时每隔6秒发送心跳包到服务端
B承担工作,接受服务端返回心跳
包,30秒接受不到心跳包,判断出连接断开
网上很多写自定义心跳实现长连接,却没有Java方面客户端的代码实现
发表评论
-
bash脚本
2012-02-01 15:27 928#!/bin/bash source /etc/profil ... -
sql。导出数据
2011-06-29 16:32 913group by为了统计 LOAD DATA L ... -
java NAN
2011-02-18 16:01 1573今天调试程序时,意外的发现java的浮点数中也有NaN,留 ... -
mysql5 unsigned 相减出现补数 溢出 解决办法
2011-01-11 14:35 18832010-08-17 17:36 在网上查 ... -
HashMap
2010-12-30 21:12 939Iterator<Ent ... -
sed grep
2010-12-30 12:52 949[admin@consign020090 12]$ grep ... -
SQL统计
2010-12-29 14:32 998select cooperate_id,count(*) f ... -
sed grep
2010-12-10 13:16 980tail -fn 1000 20 ... -
JAVA内存模型和多线程
2010-11-29 16:23 1161先了解一下java内存模型 IBM:http://www.i ... -
文件,流
2010-11-11 13:08 987public String getFullFileNa ... -
关于Interger和Long的hashCode
2010-11-03 15:08 2077/** * Returns a hash ... -
java配置文件
2010-10-18 14:22 1132(2010-03-04 20:53:29) 转 ... -
1111
2010-10-18 13:30 0http://blog.chinaunix.net/u2/73 ... -
性能研究
2010-10-15 16:40 1055import java.util.Arrays; im ... -
<![CDATA[...]]>的用法 转载
2010-10-08 16:17 1690关于xml中的<![CDATA[...]]>的 ... -
java beanUtils 转载
2010-09-03 17:53 56281. 概述 c ... -
转载:性能调优
2010-07-16 14:46 926性能测试过程中,我 ... -
前端json数据生成
2010-06-08 16:15 1417TB.BBC.MyApplication.in ... -
String内部实现
2010-03-28 01:20 1335import java.applet.Applet; imp ... -
JNI java本地接口
2010-03-01 10:09 1006学习了一下JNI,发 ...
相关推荐
- 每个可执行的Java程序都应包含一个`main`方法作为入口点。 - 避免删除源代码中的`main`方法,即使在调试过程中也不应该移除,因为这有助于保持代码的完整性。 #### 三、资源管理与异常处理 **3.1 资源管理** - ...
redis是单线程异步网络编程的范例: nginx是多进程网络编程的巅峰,模块化: memcached虽然是C++,但是C style的,多线程网络编程的巅峰数据结构: 数据库:SQLite,数据理论的范例。注意要去读非合并源文件版的(为了...
Dojo 是一个强大的JavaScript工具库,它采用了面向对象的编程方式,对于熟悉JavaScript面向对象编程的开发者来说尤其有用。在开始学习Dojo之前,建议先掌握JavaScript的基础知识,特别是面向对象的概念,这将有助于...
MINA的目标是简化网络编程,让开发者能够专注于业务逻辑,而不是底层网络通信的细节。 MINA的核心设计原则是事件驱动和非阻塞I/O,这使得它在处理大量并发连接时表现出色。其API设计简洁,易于理解和使用,支持多种...
因为很多人没有注意到这点,学完 Java 基础语言就直接去学 J2EE,有的甚至鸭子赶架,直接使用起 Weblogic 等具体 J2EE 软 件,一段时间下来,发现不过如此,挺简单好用,但是你真正理解 J2EE 了吗?你在具体案例中的...
值得注意的是,对于电子版本的分发,文档采取了较为宽松的态度,允许出于学习目的进行传播,但在线转载仍需获得官方许可。 #### 4. 目录概览 文档分为四个主要部分,分别是: - **新手报道版** - **用户界面与...
网络上一些小伙伴写的一些关于Android版OpenCV的博客,大部分都模糊不清,基本就复制粘贴的,有些甚至没有实践就直接贴上去了,这样不仅误导初学的一些小伙伴,而且被其他小伙伴转载或者复制之后,会造成更大的影响...
网络上一些小伙伴写的一些关于Android版OpenCV的博客,大部分都模糊不清,基本就复制粘贴的,有些甚至没有实践就直接贴上去了,这样不仅误导初学的一些小伙伴,而且被其他小伙伴转载或者复制之后,会造成更大的影响...
网络上一些小伙伴写的一些关于Android版OpenCV的博客,大部分都模糊不清,基本就复制粘贴的,有些甚至没有实践就直接贴上去了,这样不仅误导初学的一些小伙伴,而且被其他小伙伴转载或者复制之后,会造成更大的影响...
网络上一些小伙伴写的一些关于Android版OpenCV的博客,大部分都模糊不清,基本就复制粘贴的,有些甚至没有实践就直接贴上去了,这样不仅误导初学的一些小伙伴,而且被其他小伙伴转载或者复制之后,会造成更大的影响...
网络上一些小伙伴写的一些关于Android版OpenCV的博客,大部分都模糊不清,基本就复制粘贴的,有些甚至没有实践就直接贴上去了,这样不仅误导初学的一些小伙伴,而且被其他小伙伴转载或者复制之后,会造成更大的影响...
网络上一些小伙伴写的一些关于Android版OpenCV的博客,大部分都模糊不清,基本就复制粘贴的,有些甚至没有实践就直接贴上去了,这样不仅误导初学的一些小伙伴,而且被其他小伙伴转载或者复制之后,会造成更大的影响...
网络上一些小伙伴写的一些关于Android版OpenCV的博客,大部分都模糊不清,基本就复制粘贴的,有些甚至没有实践就直接贴上去了,这样不仅误导初学的一些小伙伴,而且被其他小伙伴转载或者复制之后,会造成更大的影响...
网络上一些小伙伴写的一些关于Android版OpenCV的博客,大部分都模糊不清,基本就复制粘贴的,有些甚至没有实践就直接贴上去了,这样不仅误导初学的一些小伙伴,而且被其他小伙伴转载或者复制之后,会造成更大的影响...
网络上一些小伙伴写的一些关于Android版OpenCV的博客,大部分都模糊不清,基本就复制粘贴的,有些甚至没有实践就直接贴上去了,这样不仅误导初学的一些小伙伴,而且被其他小伙伴转载或者复制之后,会造成更大的影响...
网络上一些小伙伴写的一些关于Android版OpenCV的博客,大部分都模糊不清,基本就复制粘贴的,有些甚至没有实践就直接贴上去了,这样不仅误导初学的一些小伙伴,而且被其他小伙伴转载或者复制之后,会造成更大的影响...
网络上一些小伙伴写的一些关于Android版OpenCV的博客,大部分都模糊不清,基本就复制粘贴的,有些甚至没有实践就直接贴上去了,这样不仅误导初学的一些小伙伴,而且被其他小伙伴转载或者复制之后,会造成更大的影响...
网络上一些小伙伴写的一些关于Android版OpenCV的博客,大部分都模糊不清,基本就复制粘贴的,有些甚至没有实践就直接贴上去了,这样不仅误导初学的一些小伙伴,而且被其他小伙伴转载或者复制之后,会造成更大的影响...