socket发送大量数据时如何接收?

问题描述

小弟在做一个项目是用java的socket发文件的同时也想发送聊天信息。1.对于socket的接收专门由一个线程A来处理,对于socket的发送也专门由一个线程B来处理2.发送和接收都有各自的缓冲区3.专门由一个线程使用监听来检测接收缓冲区的内容,并进行处理显示。问题出现在:当甲向乙发大量的连续的数据时(比如是文件,100M的文件我拆成1000片连续发送),若同时乙要发一条聊天消息则甲不能够即可收到该消息(该消息只能等到甲将文件发送完成后才能收到聊天消息),而若此时甲向乙发聊天消息则能够快速的收到。考虑了一下,问题是不是出现在:当甲向乙发送大量连续数据的时候,socket内在发送缓冲区一直都被甲占用着,若此时乙要发信息则根本信息无法写入到socket的发送缓冲区中,从而无法正确发送。但修改发送的缓冲都不起作用,不知如何修改,望老大告知

解决方案

解决方案二:
聊天消息换个端口发
解决方案三:
lastsweetop没有其他的解决方案么?必须采用另外的端口吗?
解决方案四:
或者发聊天消失的时候停止发送文件分片
解决方案五:
还有你发送消息的应该是另外一个线程发的吧别告诉我你是顺序执行的
解决方案六:
引用楼主asdf14422的帖子:

问题是不是出现在:当甲向乙发送大量连续数据的时候,socket内在发送缓冲区一直都被甲占用着,若此时乙要发信息则根本信息无法写入到socket的发送缓冲区中,从而无法正确发送。但修改发送的缓冲都不起作用,不知如何修改,望老大告知

因为Socket是一个流,所以当你发送大文件时,消息肯定被阻塞在文件之后了,你的机制是文件分成1000片连续发送,我建议如下:将要发送的聊天信息放到一个队列中,每发送一片文件都检查一下是否有聊天信息要发送,如果有,先把聊天信息发过去再发文件。
解决方案七:
如果这样延迟还是无法接受,就增加分片,比如:文件10K发送一次。
解决方案八:
使用多线程进行发送与接收。这样可以并发的发送与接受消息,速度也不会有影响。
解决方案九:
多线程发送和接受
解决方案十:
机器B监听一个端口,机器A向机器B建立连接,机器B接收到这个连接以后,会打开一个新的端口来处理这个连接,然后原来的监控端口仍然在等待下一个连接请求。如果机器A想向机器B发送消息,首先要向B建立一个连接。这个连接就看B监听哪个端口了。所以当B向A发大文件时,A可以向B建立连接,发送消息啊。
解决方案十一:
楼主在9L说的意思是:1.B作为传送文件的服务器2.A作为聊天的服务器是可以的,但要记住两者不可能使用相同的端口,这样就有了两个连接,一个用于传文件,一个用于聊天。如果是这样的话,我建议你还是把聊天服务器也在B端实现,即把服务器集中在B端。
解决方案十二:
..两种方式..一个发送过程开一条线程一个包开一条线程第一个需要在发送之前和之后加上开始发送和结束发送的标志包第二个需要在接收到以后再组包.相对来说.第一个比较简单点
解决方案十三:
开个线程..先从缓存区里把数据存到变量里..缓存里再有数据.就再开个线程这样..缓存就不存在被长时间占用的情况
解决方案十四:
给你点建议:可以去网上找点开源的线程滑动窗口机制源码。滑动窗口可以给线程数据包没置优先级。而且滑动窗口会对你的通信速度提高不少。

时间: 2024-10-10 15:25:08

socket发送大量数据时如何接收?的相关文章

发送tcp数据时,不同socket的数据及ACK有无优先级区别

问题描述 发送tcp数据时,不同socket的数据及ACK有无优先级区别 同时两个tcp流 一个正在发送数据,sendbuffer内还有多个包未发 另一个收到数据 需要发送ACK 那这个ACK是不是要等第一个流的sendbuffer被发完后再发送? 能不能插队? 谢谢

linux编程-往socket发送大量数据,接收方无法读取到完整数据

问题描述 往socket发送大量数据,接收方无法读取到完整数据 大家有没有遇到一种情况,客户端往服务器的socket发送了一个很大的数据(3万+byte),在服务器那边read socket的时候没有读到所有的数据,服务器用while去读但是都无法读到客户端发过来的所有数据,读取socket fd的代码如图 解决方案 建议你从如下角度检查或修改代码: 你是否使用循环send,并确定3W+字节都已经发送? TCP传输数据会受网络影响,如果网络发生拥塞,3W+字节可能不会一次性全部到达,这样仍然可能

ios-java 发送的数据使用PHP接收不到

问题描述 java 发送的数据使用PHP接收不到 IOS发送给php的数据可以接收到,java发送的不论是get还是post我都接收不到,是php的问题还是java的问题.求解 解决方案 使用php发送Http请求,抓取网页数据php 使用 curl 发送 post 数据php 使用 curl 发送 post 数据 解决方案二: 估计是你java代码写的不对,检查url,看ios端提交的什么,和你这边对一下 解决方案三: 用fiddler调试下.fiddler可以抓取http报文,可以清楚看到服

解决angular的$http.post()提交数据时后台接收不到参数值问题的方法_AngularJS

写此文的背景:在学习使用angular的$http.post()提交数据时,后台接收不到参数值,于是查阅了相关资料,寻找解决办法. 写此文的目的:通过上面提到的文章中的解决之道,结合自己的经验,总结了如下发现. 前端:html,jquery,angular 后端:java,springmvc一.平常使用的post提交和接收方式前端使用jquery提交数据. $.ajax({ url:'/carlt/loginForm', method: 'POST', data:{"name":&qu

编写Socket客户端和服务器程序,客户端读取本地文件的数据,发送到服务器,服务器接收并存储到文件中。

问题描述 2.编写Socket客户端和服务器程序,客户端读取本地文件的数据,发送到服务器,服务器接收并存储到文件中.消息格式:字段长度(单位字节)内容--------------------------------------------------------------------len8整个消息长度,不包括这4个字节,类型为longfile_name_length1文件名长度,bytefile_namefile_name_length文件名,Stringdata_length8文件数据长度

server-android采集图像并通过(Server端)socket发送时,只能发一次数据,为什么呢?

问题描述 android采集图像并通过(Server端)socket发送时,只能发一次数据,为什么呢? public class MainActivity extends ActionBarActivity { private EditText edOwnPort; private TextView tvOwnIP; SurfaceView sView; SurfaceHolder surfaceHolder; int screenWidth,screenHeight; Camera camer

send rgent ata-android socket 发送 sendUrgentData 后客户端接收不到数据

问题描述 android socket 发送 sendUrgentData 后客户端接收不到数据 我在pc上用java写的 socket服务端,在安卓模拟器上写的客户端,代码如下: 服务端: ServerSocket ss = new ServerSocket(9090); Socket socket = ss.accept(); ObjectOutputStream oos = new ObjectOutputStream( socket.getOutputStream()); oos.wri

急....拜....求...socket 发送数据时遇到的问题

问题描述 小弟在发送数据时出现异常异常内容为"目标计算机192.168.1.166:8000积极拒绝"如果把程序部署到192.168.1.166这台机之上,然后发送数据给自己,则不会出现异常请路过的神仙,土地,妖怪....指点一下,小弟第一次写个socket 解决方案 解决方案二:可能是被192.168.1.166这机器的防火墙挡住了关掉试试解决方案三:积极拒绝一般是服务端没有在监听解决方案四:Alvin709谢谢你的回答,我的防火墙已经关掉了解决方案五:谢谢anheizhizi的回答

“Socket”发送数据的疑问?

问题描述 socket.Send(buf,buf.Length,SocketFlags.None);//发送1W字节(嵌入式PC)socket.Receive(buf,100000,SocketFlags.None);//接收10W字节(PC)问题一:这里发送了1W字节,但是接收时候,虽然是接收10W字节.但是,第一次接收,缺只接收了4000字节,是因为客户端的问题,数据是分几次发送过来的吗???(这里是嵌入式PC上运行的时候,如果是PC的话,发送多少,一次就可以接收多少.)问题二:是不是应该给