通过socket实现处理多个连接,send和resv都是有数量限制的
我们现在先来实现,跟一个人来来回回不停的讲电话。
客户端,通过循环来输入多次命令:
client.recv(1024)每次只接收1K的内容
服务端来改成多次接收:如果你写成如下的代码:
那么造成的结果,就是很多人连上来,但是每次只能跟服务端说一句话,然后第二句话卡住。
第二个客户端一样,每次只能跟服务端说一句话,然后第二句话卡住。
也就是服务端写成这种代码是不行的,会造成代码卡住。我们现在先来实现跟一个人可以来来往往的说话:暂时无法实现跟多个人
以上的服务端代码已经可以跟客户端实现完美的交换式通讯,但是产生一个新的问题,
当客户端断开的时候,服务端提示报错,然后也断开连接,结束代码了。
这个是win上的一个BUG,其中一个连接断开的时候,server也断开了,这个是不对的。
但是在linux上是可以正常执行的,客户端断开,服务端不会停止代码,也不会停止服务。
但是现在运行在linux依旧还是有BUG,我们发现当客户端断开的时候,服务端会进入一个死循环。
表示服务端不停的接收到了空字符的,造成了死循环。所以我们要修改服务端的代码,当接收到空字符串的时候,不要进入死循环,而重新接收状态:
修正后的服务端代码如下:
这样实现了,第一个人可以跟服务端不停的通讯,这个时候如果第二个人进来想通话,会卡住;直到第一个人跟服务端断开以后,第二个人可以立即接入进行跟服务端进行通讯~!
这边有个要注意的地方server.listen(5),这里的5表示最多允许有5个client挂起,等待中,排队中。。。不过这个必须在异步的情况下,才可以测试出来。
然后,我们又发现了一个bug,如果客户端client发送一个空,会造成程序卡死。
client.send不能发送空~!不能发送空~!不能发送空~!不能发送空~!所以我们客户端的代码要改进下:
我们现在来模拟客户端是ssh:
先来看看服务端的代码的修改:
客户端执行代码,可以正常返回。
但是现在有几个新问题:
不能执行top命令,因为top命令会一直执行刷新,不停变化:
但是我们可以执行top -bn 1,让top执行一次。但是由于top -bn 1返回的结果超过了1024字节,你后面再输入命令df依旧返回的是top -bn 1的命令结果,继续执行新命令还是返回top -bn 1的返回值:如下图
这个时候我们需要修改客户端接收信息的大小,我们原来是1024字节,修改为102K,如下图
这个时候,我们再执行top -bn 1,就 可以返回正常的所有值了。
如果我们这个时候发送一个超大文件,比如60M的文件:
我们来看看服务端的代码:(注意这里是py2的代码,到py3,必须先转换为二进制)
来看看客户端的代码修改:
执行上诉代码以后,我们发现服务端的conn.send也是有大小限制的,我们发现每次最多值发送32K大小的文件:
所以我们要修改服务端的代码,进行循环send,发送文件直到把文件发送出去。 我们需要用到conn.sendall方法
虽然我们使用了sendall的方法,但是我们要注意服务端第一次只发送32K的文件(第2,第3次依次增加,但是最大不超过客户端的recv(xxxx),xxxx设置的数值,上诉例子设置的是10M),所以你客户端需要多次send命令,让服务端不停的往客户端发送文件。
我们用f.flush的方法,来强制客户端写入文件,让我们可以看到文件的增加的大小。
下面我们来看看文件的传输过程:
第一次:
第二次:
第三次:
。。。。。。。。。。。
文件的传输最大不超过10M/次,客户端的recv的参数设置
通过socket实现处理多个连接,send和resv都是有数量限制的的更多相关文章
- Python socket实现处理多个连接
socket实现处理多个连接 实现处理多个连接 使用whlie循环实现多个客户端,排队请求服务端 循环监听端口发送信息(windos,Linux) 1.Linux 系统如果客户端断开连接,会循环 ...
- 运用JAVA的concurrent.ExecutorService线程池实现socket的TCP和UDP连接
运用JAVA的concurrent.ExecutorService线程池实现socket的TCP和UDP连接 最近在项目中可能要用到socket相关的东西来发送消息,所以初步研究了下socket的TC ...
- Socket编程中的长连接、短链接以及心跳包机制详解
参考:http://blog.csdn.net/zdwzzu2006/article/details/7723738 一.定义 1.TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,se ...
- 从Linux源码看Socket(TCP)的listen及连接队列
从Linux源码看Socket(TCP)的listen及连接队列 前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情. 今天笔者就来从Linux源码的角度看 ...
- socket使用TCP协议时,send、recv函数解析以及TCP连接关闭的问题
Tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据. 在阻塞模式下, send函数的过程是将应用程序请求发送的数 ...
- [转]socket使用TCP协议时,send、recv函数解析以及TCP连接关闭的问题
Tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据. 在阻塞模式下, send函数的过程是将应用程序请求发送的数 ...
- JAVA 判断Socket 远程端是否断开连接
最近在做项目的时候,遇到这样一个问题,如何判断 Socket 远程端连接是否关闭,如果关闭的话,就要重建连接Socket的类提供了一些已经封装好的方法, 如 isClosed().isConnect ...
- socket测试远程地址能否连接并为连接设置超时
public class TestConnect { string hostIp = ""; ; public string recMsg = ""; Sock ...
- .NET Socket服务编程之-高效连接接入编
在.NET上编写网络服务深入都有2,3年了,而这些时间时如何在.NET里实现网络服务积累了一些经验.在接下来的时间里会把这方面的经验通过博客的方式分享出来.而这一章主要是讲解在如果提高服务连接接入的效 ...
随机推荐
- 【转】netlink socket编程实例
[转]netlink socket编程实例 转自:http://blog.chinaunix.net/uid-14753126-id-2983915.html 关于Netlink IPC方式的介绍,请 ...
- 第8课:异常处理、面向对象编程、发送邮件、url编码
1. 异常处理 import traceback import pymysql import requests def calc(a, b): res = a / b return res def m ...
- 你离BAT之间,只差这一套Java面试题
最近,各大公司开始了春招,很多人已经开始在准备面试了,特地来总结下初中级程序员应该掌握的面试题目.这篇面试指南,只适用于初中级程序员,其中不涉及分布式等问题.关于中高级的程序员问题,我后面可能再出一篇 ...
- Git详解之六 Git工具
以下内容转载自:http://www.open-open.com/lib/view/open1328070367499.html Git 工具 现在,你已经学习了管理或者维护 Git 仓库,实现代码控 ...
- Sublime 笔记
1. 安装PackageControl 官网:https://packagecontrol.io/ v2: import urllib2,os,hashlib; h = '2915d1851351e5 ...
- Win10 Backup&Restore Start Menu(备份还原开始菜单)
Win10 的开始菜单,不是很稳定!系统装完4天,开始乱了3次,要知道我的开始菜单全屏并且进过尽心布局的,很是心酸! 连着找了几天备份开始菜单的方法,无果!后来发现了下边两个PowerShell命令, ...
- hiho 1612
emmmmm?A不了?90分是什么鬼 #include<cstdio> #include<cstdlib> #include<vector> #include< ...
- SpringDataJpa增删改查
资料来源网址:http://www.cnblogs.com/hawell/p/SpringDataJpa.html Repository(几个常用的例子) @Repository public int ...
- XMLHttpRequest cannot load file浏览器无法异步加载本地file文件
原因:Chrome不支持本地Ajax请求,在.html文件中访问.json文件时就会出现这个问题,就是说这个时候不能加载这个.html文件. 解决方式 打开Chrome快捷方式的属性中设置: 右击Ch ...
- 监听器(Listener)学习(二)在开发中的常见应用
监听器在JavaWeb开发中用得比较多,下面说一下监听器(Listener)在开发中的常见应用: 统计当前在线人数 自定义Session扫描器 一.统计当前在线人数 在JavaWeb应用开发中,有时候 ...