- 浏览: 1522249 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (525)
- SEO (16)
- JAVA-EE-Hibernate (6)
- JAVA-EE-Struts (29)
- JAVA-EE-Spring (15)
- Linux (37)
- JAVA-SE (29)
- NetWork (1)
- CMS (14)
- Semantic Research (3)
- RIA-Flex (0)
- Ajax-Extjs (4)
- Ajax-Jquery (1)
- www.godaddy.com (0)
- SSH (34)
- JavaScript (6)
- SoftwareEngineer (9)
- CMMI (0)
- IDE-Myeclipse (3)
- PHP (1)
- Algorithm (3)
- C/C++ (18)
- Concept&Items (2)
- Useful WebSite (1)
- ApacheServer (2)
- CodeReading (1)
- Socket (2)
- UML (10)
- PowerDesigner (1)
- Repository (19)
- MySQL (3)
- SqlServer (0)
- Society (1)
- Tomcat (7)
- WebService (5)
- JBoss (1)
- FCKeditor (1)
- PS/DW/CD/FW (0)
- DesignPattern (11)
- WebSite_Security (1)
- WordPress (5)
- WebConstruction (3)
- XML|XSD (7)
- Android (0)
- Project-In-Action (9)
- DatabaseDesign (3)
- taglib (7)
- DIV+CSS (10)
- Silverlight (52)
- JSON (7)
- VC++ (8)
- C# (8)
- LINQ (1)
- WCF&SOA (5)
- .NET (20)
- SOA (1)
- Mashup (2)
- RegEx (6)
- Psychology (5)
- Stock (1)
- Google (2)
- Interview (4)
- HTML5 (1)
- Marketing (4)
- Vaadin (2)
- Agile (2)
- Apache-common (6)
- ANTLR (0)
- REST (1)
- HtmlAnalysis (18)
- csv-export (3)
- Nucth (3)
- Xpath (1)
- Velocity (6)
- ASP.NET (9)
- Product (2)
- CSS (1)
最新评论
-
lt26w:
理解成门面模式应该比较容易明白吧
FacadePattern-Java代码实例讲解 -
lt26w:
看下面的例子比较明白.
FacadePattern-Java代码实例讲解 -
javaloverkehui:
这也叫文档,别逗我行吗,也就自己看看。
HtmlCleaner API -
SE_XiaoFeng:
至少也应该写个注释吧。
HtmlCleaner API -
jfzshandong:
...
org.springframework.web.filter.CharacterEncodingFilter 配置
一.
网络程序运行过程中的常见异常及处理
该异常发生在服务器端进行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方面客户端的代码实现
评论
发表评论
-
关于java.util.concurrent必须知道的5件事(一)
2010-08-10 18:34 1434本文原作者:Ted Neward ... -
Java盲点:双重检查锁定及单例模式
2010-06-17 11:11 3652Peter Haggar , 高级软件工程师, IBM 20 ... -
有关可读性
2010-05-13 15:31 1282Long operatorId = ( Long.val ... -
zzJAVA中用于处理字符串的“三兄弟”
2010-04-18 15:42 1123JAVA 中用于处理 字符 ... -
Java中可以使用 break/continue label 语句来控制多重嵌套循环的跳转
2010-04-16 16:40 3640在Java中可以使用 break/conti ... -
利用 Eclipse Visual Editor 项目构建 GUI
2010-02-05 13:51 1417一个用于构建图形接口的图形化工具 ... -
学JAVA必须知道:抽象类与接口的区别
2010-01-26 22:08 839abstract class和interface是Java语言 ... -
利 用xml,解析yahoo天气代码(java)
2010-01-06 15:46 5123利 用xml ... -
scanner
2009-12-30 02:32 1186import java.util.Scanner; publ ... -
java从键盘输入一些字符串,并将字符串保存到一个文件中
2009-12-30 02:23 5188import java.io.*; public class ... -
文件的操作。。。行数据封装
2009-12-30 00:43 1153140100171101 太原市公安局特警支队行政处 ... -
java获取当前目录:java中获取当前类所在的目录
2009-12-30 00:19 19051在学习工作中遇到路 ... -
JAVA中MAP的用法
2009-12-29 23:54 11492Map简介 将键映射到值的对象。一个映射不能包含 ... -
演示java中Map容器的常用功能:
2009-12-29 23:53 1883mport java.util.*; ... -
Map的用途
2009-12-29 23:52 1054Map以按键/数值对的形式存储数据,和数组非常相似,在数组中存 ... -
学生信息管理系统V0.2(使用文件存储数据)【MVC模式、DAO模式、Factory模式】
2009-12-07 10:02 21400.2版更新内容: 1.使用文件存储数据; 2.使用Has ... -
接口VS抽象类
2009-12-06 21:19 1176<!-- <rdf:RDF xmlns: ... -
应用java与flex轻松构建cs程序
2009-12-06 13:59 2614今天发现SmartInvoke这一好东西,拿过来与大家分享分享 ... -
JAVA中的equals()和hashCode()方法
2009-12-03 14:03 1079在 Java 语言中, equa ... -
获得系统时间 转换成字符串
2009-11-28 14:27 2871关键字: java 有时候经常用到JAVA 时间转换 如 ...
相关推荐
【Windows_SOCKET编程】是关于使用Java进行网络编程的专题,主要关注的是Socket接口在TCP/IP协议中的应用。网络编程的核心问题在于如何定位网络主机和如何可靠高效地传输数据。TCP/IP协议栈中,IP层负责主机定位,而...
9. **网络编程**:Socket编程是网络编程的基础,涉及TCP/IP协议、套接字连接、数据传输等内容。理解HTTPS、WebSocket等高级网络技术也是面试中的加分项。 10. **反射**:Java的反射机制允许在运行时动态访问类、...
Java编程语言作为一款广泛应用的软件开发工具,深受程序员的喜爱,尤其对于初学者而言,找到合适的教程和案例至关重要。"java培训案例及答案"这个资源集合,正如其标题所示,提供了丰富的学习材料,旨在帮助初学者...
【Java基础】 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现已被Oracle公司收购)于1995年发布。它以其"Write Once, Run Anywhere...通过系统学习和实践,可以逐步掌握Java编程并应用于实际工作。
这个名为"544个JAVA技术集合.txt"的压缩包文件包含了大量的Java编程相关的知识点,总计544个条目,涵盖了Java开发中的各个方面。下面我们将深入探讨其中可能涉及的一些关键知识点。 1. **基础语法**:Java的基础...
13. **网络编程**:理解TCP/IP协议,HTTP协议,以及Socket编程的基本概念。 14. **算法与数据结构**:虽然Java面试不一定直接考算法,但良好的算法基础对解决问题至关重要,例如排序、查找、图论、动态规划等。 15...
【Java编程基础】 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(后被Oracle公司收购)于1995年推出。它以其“一次编写,到处运行”的特性闻名,因为Java程序可以在任何支持Java虚拟机(JVM)的...
12. **网络编程**:TCP/IP协议基础,Socket编程,以及HTTP协议的理解。 13. **数据库操作**:JDBC基础,事务处理,预编译SQL(PreparedStatement),连接池(如C3P0、DBCP、HikariCP)。 14. **Spring框架**:IoC...
Java架构面试专题通常涵盖了许多核心领域,包括但不限于基础语法、面向对象编程、集合框架、多线程、JVM内存管理、异常处理、IO与NIO、网络编程、设计模式、数据库交互、Spring框架、微服务架构、分布式系统、性能...
本资源“JAVA期末复习试题”提供了三套完整的试题,旨在帮助学习者全面回顾Java编程的核心概念,提高应对期末考试的能力。 第一部分:Java基础 “JAVA复习题1.doc”可能涵盖了Java的基础知识,包括: 1. **Java...
- Socket编程,包括TCP和UDP通信的基本原理。 - HTTP协议的理解,以及基于HTTP的网络请求库的使用,如HttpURLConnection或OkHttp。 9. **设计模式** - 常见的设计模式:单例、工厂、装饰器、代理、适配器、策略...
在"Java实用100例(70-100)"这个专题中,我们可以预见到一系列关于Java编程的实践示例,涵盖了从第70个到第100个例子。这些实例旨在帮助开发者深化对Java语言的理解,提高编程技巧,并解决实际问题。以下是对这些...
Java架构面试专题是针对Java开发人员在面试过程中可能会遇到的核心技术与架构问题的集合,它涵盖了从基础到高级的各种知识点,旨在帮助求职者提升面试准备的全面性和深度。本资料包含学习笔记和答案,便于自我检验和...
Java作为世界上最受欢迎的编程语言之一,对于求职者来说,掌握好Java知识并能应对面试中的问题至关重要。"java面试试题2020"这个资源包含了2020年Java面试中可能出现的问题及其答案,旨在帮助求职者提升面试成功率。...
ACCP6.0是北大青鸟推出的一套全面的软件工程师培训课程,旨在帮助学员从基础到高级掌握Java编程技术。这个"ACCP6.0 S2~Y2转换课程(Java方向)(完整课件七)"是该课程体系中的一个部分,主要针对学员在学习过程中的第...
Java API部分涵盖了Java编程中非常重要的几个方面,包括输入输出操作、多线程编程、网络通信以及反射和注解等高级特性。 **详细知识点:** 1. **Java IO**:学习文件读写、字符流与字节流等输入输出操作。 2. **多...
Java面试题涵盖了许多核心知识点,包括多线程同步、...自定义的HTTP服务器则可能基于Java的Socket编程实现。 以上内容涵盖了Java面试中常见的技术点,深入理解和掌握这些知识对于成为一名合格的Java开发者至关重要。
### Java1000题基础百战程序员知识点详解 #### 一、JavaSE编程基础概述 ...通过以上知识点的学习,不仅可以掌握Java编程的基础知识,还能深入了解高级主题和技术框架,为成为一名年薪20万的专业程序员奠定坚实的基础。
- **Socket编程**:通过Socket建立客户端与服务器之间的连接。 - **TCP/IP协议**:传输控制协议/互联网协议,是Internet的基础协议之一。 #### 第十一章 反射专题 - **基本概念**:反射是Java中的一种强大的机制,...