大家有没有遇到一种情况,客户端往服务器的socket发送了一个很大的数据(3万+byte),在服务器那边read socket的时候没有读到所有的数据,服务器用while去读但是都无法读到客户端发过来的所有数据,读取socket fd的代码如图
3条回答 默认 最新
- 关注
码龄 粉丝数 原力等级 --
- 被采纳
- 被点赞
- 采纳率
开水 2015-04-26 09:28最佳回答 专家已采纳建议你从如下角度检查或修改代码:
- 你是否使用循环send,并确定3W+字节都已经发送?
- TCP传输数据会受网络影响,如果网络发生拥塞,3W+字节可能不会一次性全部到达,这样仍然可能在收完3W+字节数据前
read
返回EAGAIN,这种情况下,建议你在包头加4个字节的int值来标识整个数据包的长度,然后你的收包端代码先读取这个长度,然后再在多次循环中将数据收齐(如返回EAGAIN,那就等待下次再接收后续数据)
采纳该答案 已采纳该答案 专家已采纳评论解决 无用打赏举报微信扫一扫
分享评论登录 后可回复...
查看更多回答(2条)
报告相同问题?
提交
相关推荐 更多相似问题
- 2015-04-26 07:57回答 3 已采纳 建议你从如下角度检查或修改代码: 1. 你是否使用循环send,并确定3W+字节都已经发送? 2. TCP传输数据会受网络影响,如果网络发生拥塞,3W+字节可能不会一次性全部到达,这样仍然可
- 2016-08-19 13:32回答 4 已采纳 服务器代码 #include #include #include #include #include #include #include #include #include #
- 2015-07-01 01:18回答 3 已采纳 byte []data=new byte [1024]; int i=0; for(i=0;i<data.length;i++) textbox1.Text+=data[i].
- 2019-04-08 16:42socket 接收多个终端上传的数据 ,每个终端新建一个socket,超时的socket定时清理,防止连接过多影响服务器性能
- 2021-02-26 13:04ezarWu的博客 服务器上从数据库取得的数据,在for循环中的打印可以看到都有的,但是在接收的客户端那却只能取得第一条的数据或者是N条的第一条数据,应该如何写,才能在客户端取得这些不同的多条数据呢? 这个到底是服务器取得的...
- 2021-02-17 20:33Douzi1024的博客 客户端:(发送数据) import socket client = socket.socket() # 连接服务器 addr = ('192.168.126.181', 9999) client.connect(addr) data = '我爱你' # 发送数据 client.send(data.encode...服务器(接收数据):...
- 2011-09-27 13:58回答 4 已采纳 第一:Socket编程时,永远不要在关闭写(writer)之前关闭读(reader) 第二:不管是客户端还是服务端在通过Socket读取数据的时候,在你的数据传输完成后,发送一个结束标记(比如:
- 2018-12-29 16:54回答 2 已采纳 已经自己实现,生产者消费者模式
- 2017-08-30 02:33回答 9 已采纳 引起这个异常的原因有两个: 一、客户端和服务器端如果一端的Socket被关闭,另一端仍发送数据,发送的第一个数据包引发该异常; 二、客户端和服务器端一端退出,但退出时并未关闭该连接,另一端如果在从
- 2021-02-12 12:43诗与星空的博客 通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接受数据。对于Socket通信简述,服务端往Socket的输出流里面写东西,客户端就可以通过Socket的输入流读取对应的内容。Socket与Socket之间是...
- 2022-02-26 16:48幕尘枫的博客 } LogUtil.debug("socket接收到服务端返回的数据:" + data); } } } catch (IOException ex) { try { if (bufferedInputStream != null) bufferedInputStream.close(); if (inputStream != null) { inputStream....
- 2019-03-22 22:19应用技术分享的博客 服务端主动发送数据给客户端端,本代码在NioServer类中维护了个map集合用来存储连接的客户端;map的key为客户端发送过来报文中的id(这里你也可以使用ctx.channel().id()相关业务自己实现); 1.netty版本4.1.25 <...
- 2015-05-01 03:36回答 4 已采纳 Please Don't use "MSG_PEEK",If you use it ,you will recv the same message !!!
- 2018-06-11 00:51回答 7 已采纳 你这个很可能是ArrayList的线程安全问题造成的,多线程同时操作,没有进行同步就很容易出现异常。
- 2014-11-21 07:34回答 10 已采纳 关键是语音流. 对队列也比较赞同. 不过考虑并发多线程问题. 缓冲区 内部划分应该分: 发送区, 资源区, 接受区. 对消息进行编号. 例如2s一个语音段, 发送成功就成功, 不然丢弃. 编号
- 2021-10-01 17:47Archie_java的博客 java使用Socket类接收和发送数据 网络应用分为客户端和服务端两部分,而Socket类是负责处理客户端通信的Java类。通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接受数据。在本文及后面的...
- 2019-09-24 18:36小哈龙的博客 下文对计算机socket编程的讲解通俗易懂,对我自己...在 Linux 和 Windows 平台下,使用不同的函数发送和接收 socket 数据,下面我们分别讲解。 Linux下数据的接收和发送 Linux 不区分套接字文件和普通文件,使用...
- 2020-09-04 11:39主要介绍了java实现socket从服务器连续获取消息的示例,需要的朋友可以参考下
- 2018-11-08 04:47回答 2 已采纳 解决了,问题是服务器的外网访问被禁用了,服务器要向别的主机发送和接受web请求的时候必须保证在服务器上能访问接受web请求并对此做出相应的主机。这个可能是服务器禁用了外网访问的80接口或者443端口,
- 2019-09-23 15:12didanbei4549的博客 服务端: package com.thinkgem.wlw.modules.api.test.socket; /** * @Author: zhouhe * @Date: 2019/4/8 9:30 */ import java.io.*; import java.net.*;... * 负责发送数据 */ public ...
- 没有解决我的问题, 去提问