问题描述
小弟在做一个项目是用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端。
解决方案十二:
..两种方式..一个发送过程开一条线程一个包开一条线程第一个需要在发送之前和之后加上开始发送和结束发送的标志包第二个需要在接收到以后再组包.相对来说.第一个比较简单点
解决方案十三:
开个线程..先从缓存区里把数据存到变量里..缓存里再有数据.就再开个线程这样..缓存就不存在被长时间占用的情况
解决方案十四:
给你点建议:可以去网上找点开源的线程滑动窗口机制源码。滑动窗口可以给线程数据包没置优先级。而且滑动窗口会对你的通信速度提高不少。