socket应该是由客户端来完成关闭操作的,这个c server设计显然不合理.
好比一个ftp,你正在下载,如果这时候ftp server shutdown了,我想你的下载是立即停止的.
ftp就是一个最好的例证,没有ftp会由server端主动关闭客户端连接吧.
好比ftp shutdown的时候,会提示在用户下在完成后自动shutdown,但是这个时候ftp server会等待客户端发送接受完毕的通知,接到通知后才会关闭,而不是传了最后一个包就关闭.我也做过c和java或其他的的通信问题
至于socket的连接关闭问题一直都是由客户端完成的,服务器只有在超时、异常的情况下才会关闭一句话,解玲还需系玲人,谁请求的连接谁关闭。
有力的资料倒是没有,感觉这是一个常理问题
好比一个ftp,你正在下载,如果这时候ftp server shutdown了,我想你的下载是立即停止的.
ftp就是一个最好的例证,没有ftp会由server端主动关闭客户端连接吧.
好比ftp shutdown的时候,会提示在用户下在完成后自动shutdown,但是这个时候ftp server会等待客户端发送接受完毕的通知,接到通知后才会关闭,而不是传了最后一个包就关闭.我也做过c和java或其他的的通信问题
至于socket的连接关闭问题一直都是由客户端完成的,服务器只有在超时、异常的情况下才会关闭一句话,解玲还需系玲人,谁请求的连接谁关闭。
有力的资料倒是没有,感觉这是一个常理问题
另一方面由于有两个可以运行的client,(我分析他们的源代码是存在bug的,但是目前很难模拟出来),所以Server端很难更改。
除非能找出rfc这样的资料。
在返回串比较大的时候是没有问题的,但是返回串比较小的时候,read的时候会发生IOException,并且没有读完。
------
从这句话来看,服务器端会有问题吗?如果有问题,为什么数据量大的时候会没事呢?
我想问楼主,客户端是单线程的吗?另有多少个客户端?
还有请把异常信息贴上来。
大数据量的时候,由于需要阻赛,于是client端的两次读取的短暂间隙显得微不足道。于是在Server端closesocket()的时候,client端读取已经结束了。
先不要建议改server部分,需要做进一步的测试,确认问题是由于什么引起的。
socket会把要发送的先放入缓冲,但还不会发送,只有缓存满了或程序中做了强制发送代码才会真正发到客户端。
为什么会引起你那样的情况,原因不知道是不是这个引起的,需要进一步测试。
建议
1、看看你s端是否有强制发送的代码。
2、一般再发送协议里还有表示结束的标识,只有发送和收到了这个标识,才断socket。
3、问题究竟如何引起,需要再测试定位。
1、服务器端接收请求建立一个线程。
2、服务器发送信息。
3、客户端接收完毕,发送请求关闭消息。
4、服务器接收到请求后,关闭socket,并接受线程。
不用什么强有力的资料了,你的程序就是强有力的证据嘛!
你客户端扑获的异常信息呢?
====================================== 客户端的异常信息是“服务器端关闭了一个现有的连接”,谢谢参与。
如果c客户端与c server在同一太机器上的时候,它们之间的通信并不是纯网络连接的关系,他们实际上是个本地copy的,在我与我一个同事的c server时发现了这样一个问题,曾经导致过我们一直没有找到c server的问题,将c client放置于其它机器上作多次测试看看那个时候c client会不会出现java client的问题,我想应该会发生的,最好是不在局域网上且,多用户测试,这样更准确
如果楼上的愿意,可以到
http://community.csdn.net/Expert/topic/3179/3179652.xml?temp=.2920496
继续。
楼主的需求和我现在做的项目惊人的相似啊!!!我也是c++和java的通信
================================================================
用java和c++通信最大的心得是:怎么去应付那些看不起java的c程序员。 *_*
顺便问个问题
如果C++(server端)主动断开连接,java(client端,也可以看作一个小的server端)这边怎么实时得到socket的连接状态,用socket本身的方法判断肯定是不行的,大家都是用write方法发数据包来确认的吗???