socket并发问题?

问题描述

各位高人。。。关于socket并发的问题,求助。。。环境:假设有A、B两台主机,A上开启多个线程(500),每个线程均与B建立一个socket连接(TCP连接,同步方式,B采用同一个监听端口),然后A上的各个线程分别往B发送socket消息(每个线程发1000次)。B开启一个监听端口,一但Accept消息就丢给一个新开的线程去处理。观察:在A和B上分别输出发送与接收到的消息,发现A可以将所有消息发送出去,但是B并没有接收到所有A发送过来的消息,似乎产生了丢失。没有捕获异常,程序也并没有报错。ps:在异步方式下也试过,仍然出现这种现象。请问这是什么原因造成的呢?应该如何解决?只有这么些分了,全部献出,实在抱歉。。。感谢~

解决方案

解决方案二:
确定是B没有接收到还是接收到了没能创建更多的线程去处理?如果是前者,可能是程序漏洞如果是后者,可在B端创建一个队列,将接收到的消息存入队列中然后保证线程数不超过一定值得情况下不断地从队列中取消息进行处理
解决方案三:
自己多查查代码吧
解决方案四:
检查过代码了,仍然有问题。。。这种同步或者异步模式是可以保证数据全部被接收的么?
解决方案五:
IP协议中头有一个十分重要的参数:TTL,它决定了数据包在网络中转发的生存时间TCP传输是可以保证数据交换的可靠性的,但这是指一方的主机将数据正确的传输到目标机器中,目标机器的协议栈的堆栈是有一定限制的,如果在目标机器中不及时处理接收到的数据,有可能堆栈会溢出!而这种溢出并不是因为TCP协议本身,而是因为系统的IP协议栈的缓冲区溢出造成!我隐约记得计算机网络书上提到过TCP只能算得上是“尽最大限度服务的可靠连接”,一旦发生网络拥塞一样会出现丢包
解决方案六:
我也做过lz的实验,确实是有可能丢失的。我用的是局域网tcp发包。当你的发包线程很多的时候不是所有包接收端都能收到

时间: 2024-08-01 00:01:28

socket并发问题?的相关文章

用Java Socket开发支持上千个并发的小型服务器(下)

总结一下客户机 我们的类研究完了.在我们继续往前讨论服务器端的情况之前,让我们回顾一下创建和使用Socket的步骤: 1.用您想连接的机器的IP地址和端口实例化Socket(如有问题则抛出Exception). 2.获取Socket上的流以进行读写. 3.把流包装进BufferedReader/PrintWriter的实例,如果这样做能使事情更简单的话. 4.对Socket进行读写. 5.关闭打开的流. 5创建服务器Socket 创建RemoteFileServer类 1.import java

WAS性能测试工具的使用

WAS 的负载使用说明(一) 一.准备工作 为了测试数据的准备性,首先需要删除缓存和Cookies等临时文件.启动IE后打开"工具"菜单下的"Internet"选项命令,在打开的"Internet选项"窗口的"常规"选项卡中,单击"Internet临时文件"区域的"删除Cookies"和"删除文件"按钮将临时文件删除. WAS说明:WAS可以通过记录浏览器活动.导入服

教你修改Linux下高并发socket最大连接数所受的各种限制

1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄).可使用ulimit命令查看系统允许当前用户进程打开的文件数限制: [speng@as4 ~]$ ulimit -n 1024 这表示当前用户的每个进程最多允许同时打开1024个文件,这1024个文件中还得除去每个进

Linux下基于socket多线程并发通信的实现

pthread_server.c /*************************************************** * 文件名:pthread_server.c * 文件描述:创建子线程来接收客户端的数据 ***************************************************/ #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #in

linux网络编程之socket(十二) select函数的并发限制和poll函数应用举例

一.用select实现的并发服务器,能达到的并发数,受两方面限制 1.一个进程能打开的最大文件描述符限制. 这可以通过调整内核参数.可以通过ulimit -n来调整或者使用setrlimit函数设置, 但一个系统所能打开的最大数也是有 限的,跟内存大小有关,可以通过cat /proc/sys/fs/file-max 查看 2.select中的fd_set集合容量的限制 (FD_SETSIZE,一般为1024) ,这需要重新编译内核. 可以写个测试程序,只建立连接,看看最多能够建立多少个 连接,客

【Python之旅】第五篇(三):Python Socket多线程并发

 前面的几个例子都是单线程的,下面再来说说多线程的. 1.多线程模块     主要是socketserver模块,如下图示: 2.多线程原理     如下图示说明: 3.SockteServer例子说明 服务器端: 客户端: 4.演示     还是以前面例子,对代码进行修改,作如下的演示. Server端: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import SocketServer            #导入SocketServer,

socket跟TCP/IP 的关系,单台服务器上的并发TCP连接数可以有多少

常识一:文件句柄限制 在linux下编写网络服务器程序的朋友肯定都知道每一个tcp连接都要占一个文件描述符,一旦这个文件描述符使用完了,新的连接到来返回给我们的错误是"Socket/File:Can'topen so many files". 这时你需要明白操作系统对可以打开的最大文件数的限制. 进程限制 执行ulimit -n 输出1024,说明对于一个进程而言最多只能打开1024个文件,所以你要采用此默认配置最多也就可以并发上千个TCP连接. 临时修改:ulimit -n10000

socket.io并发数

问题描述 如何提高socket连接数量 解决方案 解决方案二:如果你只是这么问,那么基本上只能回你一句,这只跟机器的配置有关.但在实际应用中,往往更重要的是如何提示服务端的处理速度,从而提高吞吐率.因为就算你连接进来(连接数再大),处理不过来,一样只能排队解决方案三:如何提高服务端的处理速度,而这即与单纯的技术有关,更与实际的业务场景,流程设计有关解决方案四:引用楼主qq_24724465的回复: 如何提高socket连接数量 多花钱解决方案五:引用楼主qq_24724465的回复: 如何提高s

Linux下高并发socket最大连接数所受的各种限制(详解)_Linux

1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄).可使用ulimit命令查看系统允许当前用户进程打开的文件数限制: [speng@as4 ~]$ ulimit -n 1024 这表示当前用户的每个进程最多允许同时打开1024个文件,这1024个文件中还得除去每个进