java socket server一问

wyplay 2013-07-06 11:10:03
最近在优化一个系统。情况如下
1、服务器端采用java开发,serversocket接收客户端的业务请求,业务受理完成后回包给客户端
2、客户端由delphi开发。有N个客户端
3、发送的业务报文大概会600字节
4、终端会有同时向服务器端发包的情况
5、服务器端采用多线程serversocket,但有同步锁

目前发现故障点如下
偶尔客户端发送的包服务器端会收不到(大概20000个业务包,会有80个丢包),但是客户端socket发送返回值,是正常发送的状态。就是意味着发送端应该没有问题。

刚开始以为是服务器端缓冲区过小的问题。服务器端改到100k的缓冲区但问题未得到解决。

目前怀疑
1、是否是因为服务器的同步锁引起丢包?
2、是否发送的报文过大引起?

serversocket代码片断如下:
public void run() {
try {
sSocket = new ServerSocket(port, 30);
sSocket.setReceiveBufferSize(100*1024);
while (!exit) {
try {
while (!exit) {

Socket socket = sSocket.accept();
socket.setReceiveBufferSize(100*1024);

synchronized (sList) {
if (sList.size() >= maxConnections) {
socket.close();
System.out.println("List out of bound");
} else {
socket.setSoTimeout(300 * 1000);

TradeProc pthread = new TradeProc(
socket, stList);
Thread thread = new Thread(pthread);
thread.start();

}
}
}
} catch (Exception e) {
sSocket.close();
}
sSocket = new ServerSocket(port, maxConnections);
synchronized (sList) {
sList.clear();
}
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
...全文
90 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
oh_Maxy 版主 2013-07-07
  • 打赏
  • 举报
回复
LZ的服务端都是System.out.println方式打印的日志么? 嗯,看LZ的业务量挺大的,有没有出现日志“List out of bound”?感觉synchronized (sList) 这里还是很容易出现堆积的。
发扬光大 2013-07-07
  • 打赏
  • 举报
回复
哈,丢包的问题,算是问对人了。 我开发QQ程序时,也碰到过这个问题。因为我也是客户端所有消息通过服务器先收下,再中转。 C-S-C模式通讯,服务器经常没收完数据包,或收不尽,(即粘包)我的解决办法很笨: 先拟定一个数据格式协议:比如:x-n-n-n,x表示消息类别,第1个消息类别,第2个n指消息总长,第3个n指消息头长,第4个n可能是消息内容体。呵,有需要的朋友直接与qq 26638719交流
wyplay 2013-07-07
  • 打赏
  • 举报
回复
system.out.print这个是我调试时加上去的 没有出现list out of bound过。

50,550

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧