??xml version="1.0" encoding="utf-8" standalone="yes"?>天天综合亚洲,re久久精品视频,国产成人精品免费视频网站http://www.aygfsteel.com/zhvfeng/&nbsp;&nbsp;&nbsp;&nbsp;<i>分n知识、分享快?lt;/i>zh-cnFri, 04 Jul 2025 01:55:27 GMTFri, 04 Jul 2025 01:55:27 GMT60谁能解决多个MDBdJBoss Topic上的BytesMessage出现的奇怪问?/title><link>http://www.aygfsteel.com/zhvfeng/archive/2010/08/24/329795.html</link><dc:creator>天快黑了</dc:creator><author>天快黑了</author><pubDate>Tue, 24 Aug 2010 07:54:00 GMT</pubDate><guid>http://www.aygfsteel.com/zhvfeng/archive/2010/08/24/329795.html</guid><wfw:comment>http://www.aygfsteel.com/zhvfeng/comments/329795.html</wfw:comment><comments>http://www.aygfsteel.com/zhvfeng/archive/2010/08/24/329795.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/zhvfeng/comments/commentRss/329795.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/zhvfeng/services/trackbacks/329795.html</trackback:ping><description><![CDATA[2个不同的MDB监听JBoss 4.2.3 上的同一个Topic (集成JBoss Messaging 1.4.2 SP1)QTopic上的消息是BytesMessage。发一个消息到Topic上,2个MDB都会收到q个消息?br /> <br /> 但奇怪的是只有一个MDB能正常读取BytesMesageQ另一个MDBdBytesMessage.<font style="background-color: #c0c0c0">readBytes</font>()始终q回-1<br /> <br /> 同样的测试程序,在WebLogic上就正常?br /> <br /> JBoss怎么会发送同一个BytesMessage对象到所有的subscriberQ有册同样的问题吗Q?<br /> <br /> <br /> google了很长时_也尝试了很多ҎQ似乎没什么好的办法。一U方法是避免使用BytesMessage, q有一U方法就是用反,直接复制JBoss的BytesMessage实现?br /> <br /> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img id="Codehighlighter1_35_358_Open_Image" onclick="this.style.display='none'; Codehighlighter1_35_358_Open_Text.style.display='none'; Codehighlighter1_35_358_Closed_Image.style.display='inline'; Codehighlighter1_35_358_Closed_Text.style.display='inline';" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" alt="" /><img style="display: none" id="Codehighlighter1_35_358_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_35_358_Closed_Text.style.display='none'; Codehighlighter1_35_358_Open_Image.style.display='inline'; Codehighlighter1_35_358_Open_Text.style.display='inline';" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" alt="" /><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> onMessage(Message msg) </span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_35_358_Closed_Text"><img src="http://www.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_35_358_Open_Text"><span style="color: #000000">{<br /> <img align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" alt="" /><br /> <img align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" alt="" />  BytesMessageProxy msgProxy </span><span style="color: #000000">=</span><span style="color: #000000"> (BytesMessageProxy)msg;<br /> <img align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" alt="" />        <br /> <img align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" alt="" />        Class clazz </span><span style="color: #000000">=</span><span style="color: #000000"> MessageProxy.</span><span style="color: #0000ff">class</span><span style="color: #000000">;<br /> <img align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" alt="" />        Field field </span><span style="color: #000000">=</span><span style="color: #000000"> clazz.getDeclaredField(</span><span style="color: #000000">"</span><span style="color: #000000">message</span><span style="color: #000000">"</span><span style="color: #000000">);<br /> <img align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" alt="" />        field.setAccessible(</span><span style="color: #0000ff">true</span><span style="color: #000000">);<br /> <img align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" alt="" />        JBossMessage rawMsg </span><span style="color: #000000">=</span><span style="color: #000000"> (JBossMessage)field.get(msgProxy);<br /> <img align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" alt="" />        <br /> <img align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" alt="" />        BytesMessage newMsg </span><span style="color: #000000">=</span><span style="color: #000000"> (BytesMessage)rawMsg.doCopy();<br /> <img align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" alt="" /><br /> <img align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" alt="" />       </span><span style="color: #008000">//</span><span style="color: #008000"> read data from newMsg</span><span style="color: #008000"><br /> <img align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" /></span><span style="color: #000000">}</span></span></div> <img src ="http://www.aygfsteel.com/zhvfeng/aggbug/329795.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/zhvfeng/" target="_blank">天快黑了</a> 2010-08-24 15:54 <a href="http://www.aygfsteel.com/zhvfeng/archive/2010/08/24/329795.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java虚拟机探险之Class Loaderhttp://www.aygfsteel.com/zhvfeng/archive/2010/08/17/329078.html天快黑了天快黑了Tue, 17 Aug 2010 02:47:00 GMThttp://www.aygfsteel.com/zhvfeng/archive/2010/08/17/329078.htmlhttp://www.aygfsteel.com/zhvfeng/comments/329078.htmlhttp://www.aygfsteel.com/zhvfeng/archive/2010/08/17/329078.html#Feedback0http://www.aygfsteel.com/zhvfeng/comments/commentRss/329078.htmlhttp://www.aygfsteel.com/zhvfeng/services/trackbacks/329078.html众所周知Q所有的Java class文g都是?/span>JVMQ虚拟机Q加载ƈ执行的?/span>深入理解JVM对于我们提高Java技术和解决Java问题都有非常大的帮助?/span>

JVM内部主要包括内存理?/span>Class LoaderQ类加蝲器)两个部分。熟悉了内存理Q我们就会清楚程序在内存中是怎么分配和执行的Q就能解x有和对象相关的问题(比如Memory LeakQ。理解了Class LoaderQ就能解x有类找不刎ͼ比如遇到NoClassDefFoundError?/span>ClassNotFoundExceptionQ或配置文g找不到问题?/span>

q次我们只讨?/span>JVM?/span>Class LoaderQ下ơ再讨论JVM的内存管理?/span>

Class Loader的主要作用就是负责查扄q将其加载到内存中。有的是,Java中的Class Loader也是?/span>Java所写,和普通的class一栗这׃生了一个是鸡生蛋还是蛋生鸡的问题,到底W一?/span>classp来加载呢Q我们稍后会来讨个问题?/span>

先来看一?/span>Class Loader所h的特炏V?/span>

1.       l承关系

虽然Class Loader也是一?/span>Java classQ但q里的承不是指定义class时用的extends关键字来实现的承,而是指由属性来l持的承关pR即通过Class Loader的构造方法或其它Ҏ昑ּ的设|一个父Class Loader?/span>

2.       代理关系

每一?/span>Class Loader在接到请求去加蝲一个类之前Q默认,讉K一个类的时候,׃由加载当前类?/span>Class Loaderd载被讉K的类Q,它会首先h它的?/span>Class Loader来尝试加载,依次往上,如果?/span>Class Loader加蝲成功Q则直接q回Q子Class Loader不再查找?/span>

否则依次往下查扑ƈ加蝲。如果直到被h?/span>Class Loader也没有找到要加蝲的类Q则会出?/span>NoClassDefFoundError?/span>ClassNotFoundException

当然如果被请求的cdl加载到了内存中Q就不会触发q个查找q程了,而是直接q回已经加蝲的类?/span>

我们来看一个例子,假设有图1中的Class Loader层次Q?/span>


如果我们h
Class Loader Ed?/span>Test.classQ首先它会请求父Class Loader Dd试加载。同?/span>Class Loader D会先h它的?/span>Class Loader Cd试加?/span>Test.class。当然这?/span>Class Loader C找不?/span>Test.classQ于是{回由Class Loader Dd载。最l?/span>Class Loader D成功扑ֈ?/span>D:"Test.classQƈ其加蝲到内存中?/span>

同样Q如果我们请?/span>Class Loader Fd?/span>Test3.class?/span>Class Loader C?/span>Class Loader D在各自的搜烦范围内都找不?/span>Test3.class。最l会?/span>Class Loader F自己加蝲F:"Test3.class到内存中?/span>

如果我们hClass Loader Dd?/span>Test3.classQ最l就会出?/span>NoClassDefFoundError?/span>ClassNotFoundException

3.       同一l承铑֏见?/span>

在同一?/span>Class Loader对象的扉K中,下面被加载的cd以访问上面被加蝲的类Q反之则不可以?/span>

同样以图1ZQ?/span>Test4.class可以讉K?/span>D:"Test.class?/span>C:"Test2.class

而如?/span>D:"Test.class?/span>C:"Test2.class试讉KTest4.classQ就会出?/span>NoClassDefFoundError?/span>ClassNotFoundException

4.       多个l承链不可见?/span>

多个l承链之间彼此看不到ҎQ不能相互访问?/span>

q以?/span>1ZQ如?/span>Test4.class讉KTest3.classQ或反过?/span>Test3.class讉KTest4.classQ都会引?/span>NoClassDefFoundError?/span>ClassNotFoundException

理解?/span>Class Loader所h的特点,我们来看?/span>JDK中都预置了哪?/span>Class Loader。也?/span>JVM启动旉认创建的Class Loader。如?/span>2


通过?/span>2Q我们可以看?/span>Bootstrap Class Loader?/span>JVM中的先Class Loader。它?/span>JDK中唯一一个由C++所写的Class LoaderQ它负责加蝲JDK的核心类?/span>(rt.jar)以及另外两个?/span>Java所写的Class LoaderQ?/span>Ext Class Loader?/span>App Class LoaderQ。之后就功成w退Q{?/span>Ext Class Loader?/span>App Class Loader加蝲所有应用中用到的类?/span>

一般我们的应用都是通过讄CLASSPATHQ最l由App Class Loader来加载。根?/span>Class Loader的承关p,我们应用中的cd以访?/span>JDK的核心类库。反之则会出错?/span>

我们再来看看WebLogic?/span>Class Loader的层ơ关p(如图4Q。如果需要,大家可以参考一?/span>WebLogic?/span>WAR?/span>EAR的文件结构(如图3Q?/span>




WLS
中自定义了很多新?/span>Class LoaderQ当然他们的先Class Loader都是JDK中的App (or System) Class Loader。我们来看一下每?/span>Class Loader的职责?/span>

1.       JDK App (or System) Class Loader

l       负责加蝲WLS启动脚本?/span>CLASSPATH中设|的c?/span>

l       所有的c都会最先由它尝试加?/span>

l       因ؓCLASSPATH的值在q行期不允许修改Q所以由?/span>Class Loader加蝲的类在运行期不能被动态卸载(替换Q?/span>

2.       EJB Class Loader (1)

l       负责加蝲单独?/span>EJB jar里的cR?/span>

l       不同?/span>EJB jar文g会被不同实例?/span>Class Loader加蝲Q因?/span>EJB jar彼此之间互相看不到对?/span>

3.       WAR Class Loader (1)

l       负责加蝲单独?/span>WAR里的c?/span>

l       不同?/span>WAR文g会被不同实例?/span>Class Loader加蝲Q因?/span>WAR彼此之间互相看不到对?/span>

4.       EAR Class Loader

l       负责加蝲EAR里面?/span>APP-INF下的c?/span>

l       不同?/span>EAR文g会被不同实例?/span>EAR Class Loader加蝲Q因?/span>EAR彼此之间互相看不到对?/span>

l       它下面有一?/span>EJB Class Loader (2) 实例,负责加蝲EAR里面所有的EJB jar。因此,EAR中的EJB彼此之间可以看到Ҏ

l       EJB Class Loader (2) 下有多个WAR Class Loader (2) 实例。每个实例负责加?/span>EAR里面的一?/span>WAR。所以,EAR中的WAR彼此之间看不到对?/span>

l       Ҏl承链规则,WAR可以看到所有的EJB?/span>APP-INF下的所有类?/span> EJB可以看到APP-INF下的所有类Q但反之则不可以

Class Loader虽然UCؓcd载器Q但q不意味着只能用来加蝲ClassQ我们还可以利用它来查找囄和配|文件等资源。比如,我们l常使用getClass().getResourceAsStream(name)来查N|文件。同P查找其它资源文g的方式和上面一P也会先请求父Class Loader来负责查找?/span>

q里Q我们只单介l了Class Loader对于cȝ查找Q而关?/span>Class Loader的具体加载、校验和初始化的q程Q感兴趣的朋友可以参考《深?/span>Java虚拟机?/span>



天快黑了 2010-08-17 10:47 发表评论
]]>
谁能帮忙解释一下ؓ什么这个程序会死锁Q?/title><link>http://www.aygfsteel.com/zhvfeng/archive/2010/08/04/327956.html</link><dc:creator>天快黑了</dc:creator><author>天快黑了</author><pubDate>Wed, 04 Aug 2010 09:40:00 GMT</pubDate><guid>http://www.aygfsteel.com/zhvfeng/archive/2010/08/04/327956.html</guid><wfw:comment>http://www.aygfsteel.com/zhvfeng/comments/327956.html</wfw:comment><comments>http://www.aygfsteel.com/zhvfeng/archive/2010/08/04/327956.html#Feedback</comments><slash:comments>23</slash:comments><wfw:commentRss>http://www.aygfsteel.com/zhvfeng/comments/commentRss/327956.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/zhvfeng/services/trackbacks/327956.html</trackback:ping><description><![CDATA[<p> 大家不用兛_E序实际逻辑是否正确Q只是好奇,Z么这个程序会hang住不q行了?而且CPU会占?00%</p> <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.HashMap;<br /> <br /> </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> TestLock {<br /> <br /> </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> HashMap map </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> HashMap();<br /> <br /> </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> TestLock() {<br /> Thread t1 </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Thread() {<br /> </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> run() {<br /> </span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">; i</span><span style="color: #000000; "><</span><span style="color: #000000; ">50000</span><span style="color: #000000; ">; i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">) {<br /> map.put(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Integer(i), i);<br /> }<br /> System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">t1 over</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /> }<br /> };<br /> <br /> Thread t2 </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Thread() {<br /> </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> run() {<br /> </span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">; i</span><span style="color: #000000; "><</span><span style="color: #000000; ">50000</span><span style="color: #000000; ">; i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">) {<br /> map.put(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Integer(i), i);<br /> }<br /> <br /> System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">t2 over</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /> }<br /> };<br /> <br /> <br /> t1.start();<br /> t2.start();<br /> <br /> }<br /> <br /> <br /> </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> main(String[] args) {    <br /> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> TestLock();<br /> }<br /> }<br /> </span></div> <br /> <br /> Dump thread会看刎ͼE序hang刎ͼ<br /> <br /> <p><font style="background-color: #c0c0c0">"Thread-1" prio=6 tid=0x00c70bd8 nid=0x914 runnable [0x02ebf000..0x02ebfc68]<br /> at java.util.HashMap.put(HashMap.java:420)<br /> at TestLock$2.run(TestLock.java:20)</font></p> <p><font style="background-color: #c0c0c0">"Thread-0" prio=6 tid=0x00c70a50 nid=0x578 runnable [0x02e7f000..0x02e7fb68]<br /> at java.util.HashMap.put(HashMap.java:420)<br /> at TestLock$1.run(TestLock.java:11)<br /> </font></p> <img src ="http://www.aygfsteel.com/zhvfeng/aggbug/327956.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/zhvfeng/" target="_blank">天快黑了</a> 2010-08-04 17:40 <a href="http://www.aygfsteel.com/zhvfeng/archive/2010/08/04/327956.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>另类NoClassDefFoundErrorhttp://www.aygfsteel.com/zhvfeng/archive/2010/07/29/327446.html天快黑了天快黑了Thu, 29 Jul 2010 07:54:00 GMThttp://www.aygfsteel.com/zhvfeng/archive/2010/07/29/327446.htmlhttp://www.aygfsteel.com/zhvfeng/comments/327446.htmlhttp://www.aygfsteel.com/zhvfeng/archive/2010/07/29/327446.html#Feedback0http://www.aygfsteel.com/zhvfeng/comments/commentRss/327446.htmlhttp://www.aygfsteel.com/zhvfeng/services/trackbacks/327446.html
q有下面一U另cȝNoClassDefFoundErrorQ?br /> 1. Class A 调用 Class B
2. JVM试加蝲Class BQƈ执行Class B的静态块
3. Class B的静态块内抛出RuntimeExceptionQ从而导致JVM加蝲Class Bp|
4. 之后QQ何类只要调用Class BQ就会出现NoClassDefFoundError

大家可以q行下面的例子试一?

1 public class B 
2 {
3     static {
4         String s = null;
5         s.substring(0);
6     }
7 }

 1 public class A 
 2 {
 3     public static void main(String[] args) 
 4     {
 5         try
 6         {
 7             B b = new B();    
 8         }
 9         catch (Throwable e)
10         {
11             e.printStackTrace();
12         }
13 
14         try
15         {
16             B b = new B();    
17         }
18         catch (Throwable e)
19         {
20             e.printStackTrace();
21         }
22     }
23 }


天快黑了 2010-07-29 15:54 发表评论
]]>
Socket Programming Considerations (2)http://www.aygfsteel.com/zhvfeng/archive/2010/07/28/327281.html天快黑了天快黑了Wed, 28 Jul 2010 01:23:00 GMThttp://www.aygfsteel.com/zhvfeng/archive/2010/07/28/327281.htmlhttp://www.aygfsteel.com/zhvfeng/comments/327281.htmlhttp://www.aygfsteel.com/zhvfeng/archive/2010/07/28/327281.html#Feedback1http://www.aygfsteel.com/zhvfeng/comments/commentRss/327281.htmlhttp://www.aygfsteel.com/zhvfeng/services/trackbacks/327281.html1.       Socket ack (acknowledgement)

Socket ack是指?/span>socket接收到数据之后,发送一?/span>ack字符?/span>(比如$ACK)l?/span>socket发送方。这Psocket发送方可以Ҏ是否收到?/span>ack判断Ҏ是否收到了数据?/span>

Socket ack是显C的在应用程序中加入的一U通讯协议。如果不使用ackQ在socket通讯中,可能会丢失数据?/span>

比如Q?/span>socket client要连l的l?/span>socket server发?/span>100条消息。如果我们在server收到W?/span>50条消息的时候,kill?/span>server。那么查?/span>client端发送的logQ可?/span>client端成功发送了51条。只有当client端发送第52条消息的时候才遇到异常。这L51条消息就丢失了?/span>

所以ؓ了确保数据传输的准确性,我们可以引入ack协议。有时我们不仅要保server不但收到了数据,而且q要保证server成功处理了数据。这Ӟ可以{?/span>server成功处理完数据之后,再给client?/span>ack?/span>

2.       Socket Keep Alive

Socketq接像数据库q接一P属于重量型资源。如果我们频J的创徏socket、发?/span>/接收数据、关?/span>socketQ那么会有很大一部分旉费?/span>socket的创建和关闭上?/span>

所以,如果我们l常需要与同一?/span>socket地址发?/span>/接收数据Ӟ应该考虑只创Z?/span>socketQ然后一直用这?/span>socket对象发?/span>/接收数据?/span>

3.       Heartbeat

通常Q我们会讄socket?/span>receive timeout。这P如果我们一直打开着socket (keep alive)Q?/span> 而很长时间又没有数据通讯Q?/span>socket接收方就?/span>timeoutQ最l导致打开的连接坏掉?/span>

如果很长旉没有数据通讯Q防火墙或代理服务器也可能会关闭打开?/span>socketq接?/span>

所以ؓ了保证打开?/span>socketq接一直可用,如果一D|间没有数据进行通讯Q或指定一个时间间隔)Q我们可以显C的发送一?/span>heartbeat消息(比如: $HRT)l对方,从而保证连接不会被异常关闭?/span>

4.       Socket Close

每一个socket对象会持有一个socket descriptor (其实是file descriptor)Q操作系l对于socket descriptor有一个最大限?/span>。因此当socket不再使用Ӟ一定要记得关闭Q即?/span>socketq接p|或出现异常,只要socket对象不ؓnullQ一定要记得关闭?/span>

下面图显CZQ当socket关闭Ӟsocket的状态变?/span>(socket状态可以通过netstat命o查看)。更详细的解释,可以google一下?br />

当主动一方调?/span>close(先调?/span>close)时的状态变?/span>:

ESTABLISHED -> FIN_WAIT_1-> FIN_WAIT_2 -> TIME_WAIT -> CLOSED

当被动一方调?/span>close(后调?/span>close)时的状态变?/span>:

ESTABLISHED -> CLOSE_WAIT -> LAST_ACK -> CLOSED

通常Q?/span>TIME_WAIT 是正常状态,q一D|?/span>(2MSL, 1?/span>4分钟)׃自动消失.

我们需要特别注?/span>CLOSE_WAIT 状态:

1Q?span style="font: 7pt 'Times New Roman'">   如果很长旉才消失,表明socket server处理太慢Q很?/span>client已经q接?/span>serverQ发送完数据q?/span>close了?/span>

2Q?span style="font: 7pt 'Times New Roman'">   如果一直也不消失,表明?/span>socket没有正常close (Ҏ已经close?/span>)

5.       SO_REUSEADDR Option

?/span>socketd调用close的时候,从上面可以知道,它最l会q入TIME_WAIT 状态,需要过1?/span>4分钟Q才能完?/span>close?/span>

?/span>socket处于TIME_WAIT 状态时Q它仍然占用正在使用?/span>IP/PORT。这P如果我们的程?/span>(比如socket server)使用了一个固定的IP/PORTQ当socket处于TIME_WAIT 状态时Q程序将不能立即重启Q会出现端口占用错误?/span>

Socket提供了一?/span>setReuseAddress()ҎQ可以设|当socket处于TIME_WAIT 状态时Q是否允许其它进E绑定这个端口?/span>

如果我们正在开?/span>socket serverQ一定要记得调用ServerSocket.setReuseAddress(true).

Client socket也有q个ҎQ而且有时可能需要指?/span>clientq接server时所使用的本?/span>IP/PORT(一般不用指明,pȝ会随机选择一?/span>PORT)。但实际试Q在client socket上设|这个方法在Windows?/span>Solaris下ƈ不v作用。当socket处于TIME_WAIT 状态时Q重?/span>client仍然出现端口占用错误。上|搜索了很长旉Q很多h都碰Cq个问题Q可能是操作pȝ底层socket实现问题。因为测试?/span>C语言开发的socket clientQ同样也有这个错误。有LINUX下好用,q有是可以试修改tcp_time_wait_interval来减?/span>TIME_WAIT{待旉



天快黑了 2010-07-28 09:23 发表评论
]]>
Socket Programming Considerations (1)http://www.aygfsteel.com/zhvfeng/archive/2010/07/26/327114.html天快黑了天快黑了Mon, 26 Jul 2010 01:31:00 GMThttp://www.aygfsteel.com/zhvfeng/archive/2010/07/26/327114.htmlhttp://www.aygfsteel.com/zhvfeng/comments/327114.htmlhttp://www.aygfsteel.com/zhvfeng/archive/2010/07/26/327114.html#Feedback1http://www.aygfsteel.com/zhvfeng/comments/commentRss/327114.htmlhttp://www.aygfsteel.com/zhvfeng/services/trackbacks/327114.html
最q一直在做SocketE序Q这里把一些SocketE序的注意事Ҏȝ一下。今天先说说Socket中的TimeoutQ其它的下次补全?br />

1.       Socket Timeout

?/span>SocketE序的时候需要注意设|下面的timeoutQ避免对Ҏ有响应的时候,DSocketE序挂v或等待时间过?/span>

1.1         Accept Timeout

Accept timeout 仅对ServerSocket有用?/span>ServerSocket 使用accept()Ҏ来监听客LSocket的连接?/span>

默认Q?/span>ServerSocket.accept() Ҏ会一直阻塞直到有客户端来q接。通常Q我们不需要设|?/span>accept timeout.

但有时候特D情况,q是要考虑讄accept timeout.

比如: E序Al程?/span>B发了一?/span>JMS消息Q然后程?/span>A启动一?/span>Socket ServerQ想通过socket{待接收E序B的返回消息。如果不讄accept timeout, q且E序B因ؓ某些原因一直不能连?/span>Socket ServerQ最l会DE序A挂v?/span>

Accept Timeout可以q样讄Q?/span>

ServerSocket serverSocket = new ServerSocket(5555);

serverSocket.setSoTimeout(5000); // in milliseconds

while (true) {

    Socket socket = serverSocket.accept();

        …

}

1.2         Connect Timeout

?/span>Client端连?/span>Server端的时候,可以指定Connect Timeout

如果没有指定Q会使用操作pȝ的默认?/span>:

OS

Default TCP timeout

BSD

75 seconds

Linux

189 seconds

Solaris

225 seconds

Windows XP

21 seconds

Connect Timeout可以q样讄Q?/span>

SocketAddress socketAddress = new InetSocketAddress(host, port);

socket = new Socket();

socket.connect(socketAddress, connectTimeout);

1.3         Receive Timeout

?/span>socket从另一Ҏ收数据时Q可以设|?/span>Receive Timeout

默认没有timeoutQ?/span>socket会一直阻塞直到有数据可读取?/span>

Receive Timeout可以q样讄Q?/span>

Socket socket = new Socket(host, port);

socket.setSoTimeout(timeout);

1.4         Send Timeout

Send Timeout?/span>socketl另一方发送数据时使用的?/span>

不过Java里没有办法设|?/span>Send Timeout.

当然Q?/span>socket发送数据的时候,会首先发送到本机OS的一?/span>buffer内。一般只要一ơ发送的数据不是很大Q即使对Ҏh暂时不能接收数据Q也不会D发送方挂v?/span>




天快黑了 2010-07-26 09:31 发表评论
]]>
վ֩ģ壺 º| лͨ| ʡ| â| Ѩ| | | Ȫ| | ɽ| α| | Ʊ| | | ຣʡ| | | | | Զ| | Ӧ| | | »| | | | ʵ| | | | Ϸ| | ɽ| ˷| | Ƥɽ| | |