1.使用生活中的接打电话,解释socket通信流程

2.根据上图,写出socket通信的伪代码
2.1.server端伪代码
#买手机
#买手机卡
#开机
#等待电话
#收消息
#发消息
#挂电话
2.2.client端伪代码
#买手机
#拨号
#发消息
#收消息
#挂电话
3.根据伪代码写出程序
server端收到client 发送的字母后,把字母转换成大写并发送给client端
3.1.server端代码
import socketip_port=('127.0.0.1',9999)#买手机s = socket.socket()#买手机卡s.bind(ip_port)#开机s.listen(5)#等待电话conn,addr = s.accept()#conn 相当于一条通信线路#收消息recv_data = conn.recv(1024)#发消息send_data = recv_data.upper()conn.send(send_data)#挂电话conn.close()

3.2.client端代码
import socketip_port = ('127.0.0.1',9999)#买手机s = socket.socket()#拨号s.connect(ip_port)#发送消息send_data = input(">>>:").strip()s.send(bytes(send_data,encoding='utf-8'))#收消息recv_data = s.recv(1024)print(str(recv_data,encoding='utf-8'))#挂电话s.close()

运行:
先运行server端程序,然后运行client端程序
out:
>>>:hello
HELLO

注意点:
1.server和client 通信传输的是bytes流,在2.7以前是str流
二、socket简单交互
1.基于python3.5.2版本的socket只能收发字节(python2.7可以发送str)
2.退出只在客户端退出就OK了
3.s.accept()和s.recv()是阻塞的,前提是已经建立了连接

server端:
#循环输入,exit退出,可以输入空字符import socketip_port=('127.0.0.1',9999)#买手机s = socket.socket()#买手机卡s.bind(ip_port)#开机s.listen(5)#等待电话conn,addr = s.accept()#conn 相当于一条通信线路#收消息while True:    recv_data = conn.recv(1024)if len(recv_data) == 0:break#发消息send_data = recv_data.upper()    conn.send(send_data)

#挂电话conn.close()

client端
#循环输入,exit退出,可以输入空字符import socketip_port = ('127.0.0.1',9999)#买手机s = socket.socket()#拨号s.connect(ip_port)#发送消息while True:    send_data = input(">>>:").strip()if send_data == 'exit': break  # 输入exit 退出程序if len(send_data) == 0: continue   #如果输入是空字符,退出本次循环,继续下次循环s.send(bytes(send_data,encoding='utf-8'))

#收消息recv_data = s.recv(1024)print("----------------",type(recv_data))print(str(recv_data,encoding='utf-8'))#挂电话s.close()

三、

一个客户端断开连接后,服务端还可以接受新的连接
server端
#一个客户端断开连接后,服务端还可以接受新的连接import socketip_port=('127.0.0.1',9999)#买手机s = socket.socket()#买手机卡s.bind(ip_port)#开机s.listen(5)#等待电话while True:    conn,addr = s.accept()#conn 相当于一条通信线路    #收消息while True:try:  #客户端强制断开(不是输入exit) 会出现异常。recv_data = conn.recv(1024)if len(recv_data) == 0:break#发消息send_data = recv_data.upper()            conn.send(send_data)except Exception:break#挂电话conn.close()

client端
#一个客户端断开连接后,服务端还可以接受新的连接import socketip_port = ('127.0.0.1',9999)#买手机s = socket.socket()#拨号

s.connect(ip_port)#发送消息while True:    send_data = input(">>>:").strip()if send_data == 'exit': break  # 输入exit 退出程序if len(send_data) == 0: continue   #如果输入是空字符,退出本次循环,继续下次循环s.send(bytes(send_data,encoding='utf-8'))

#收消息recv_data = s.recv(1024)print("----------------",type(recv_data))print(str(recv_data,encoding='utf-8'))#挂电话s.close()

关于s.listen(n) n代表:能挂起的链接数,如果n=1 ,代表可以连接一个,挂起一个,第三个拒绝
表示可以处理一个请求连接,并且挂起一个请求连接。如果再有连接过来会报错。
如下是我设置s.listen(2)测试的结果:
s.listen(2)表示只能挂起两个请求连接,第3个请求就会报错。
 
解决粘包的问题:
1.服务端在发送数据之前,先把发送数据的长度告诉客户端,要发送多少数据,然后客户端根据这个数据的长度循环接收就OK
传输过程:
服务端:
1.send  #数据长度
4.recv  #收到确认信息,开始下一步发送
send  #发送数据
客户端 :
2.recv #获取数据长度
3.send #发送确认信息
recv #循环接收
server端代码:
#解决粘包问题send_data = bytes(send_data,encoding='utf-8')  #编码成utf-8,字节,并把str转换为字节ready_tag = 'Ready|%s' %len(send_data)conn.send(bytes(ready_tag,encoding='utf-8'))feedback = conn.recv(1024)  #收到客户端发送过来的Startfeedback = str(feedback,encoding='utf-8')  #把收到的feedback 转换为strif feedback.startswith('Start'):    conn.send(send_data)

client端代码:
#解决粘包的问题ready_tag = s.recv(1024) # Ready|9999ready_tag = str(ready_tag,encoding='utf-8')if ready_tag.startswith('Ready'):  # Ready|9999msg_size = int(ready_tag.split('|')[-1])start_tag = 'Start's.send(bytes(start_tag,encoding='utf-8')) #给server发送Start,告诉server可以准备发送数据了recv_size = 0  #初始化数据大小recv_msg =b''

while recv_size < msg_size:    recv_data = s.recv(1024)    recv_msg += recv_data    recv_size += len(recv_data)print('MSG SIZE %s RECE SIZE %s' % (msg_size, recv_size))

print(str(recv_msg,encoding='utf-8'))

四、socket简单ssh

server端:
#一个客户端断开连接后,服务端还可以接受新的连接import socketimport subprocessip_port=('127.0.0.1',9999)#买手机s = socket.socket()#买手机卡s.bind(ip_port)#开机s.listen(2)#等待电话while True:    conn,addr = s.accept()#conn 相当于一条通信线路    #收消息while True:try:  #客户端强制断开(不是输入exit) 会出现异常。recv_data = conn.recv(1024)if len(recv_data) == 0:break#发消息p=subprocess.Popen(str(recv_data,encoding='utf-8'),shell=True,stdout=subprocess.PIPE)            res = p.stdout.read()if len(res) == 0:   #处理输入的错误命令send_data = 'cmd err'else:                send_data = str(res,encoding='gbk')   #windows平台下解码成gbk,并且gbk转换为str            #解决粘包问题send_data = bytes(send_data,encoding='utf-8')  #编码成utf-8,字节,并把str转换为字节ready_tag = 'Ready|%s' %len(send_data)            conn.send(bytes(ready_tag,encoding='utf-8'))            feedback = conn.recv(1024)  #收到客户端发送过来的Startfeedback = str(feedback,encoding='utf-8')  #把收到的feedback 转换为strif feedback.startswith('Start'):                conn.send(send_data)except Exception:break#挂电话conn.close()

client端:
#一个客户端断开连接后,服务端还可以接受新的连接import socketip_port = ('127.0.0.1',9999)#买手机s = socket.socket()#拨号

s.connect(ip_port)#发送消息while True:    send_data = input(">>>:").strip()if send_data == 'exit': break  # 输入exit 退出程序if len(send_data) == 0: continue   #如果输入是空字符,退出本次循环,继续下次循环s.send(bytes(send_data,encoding='utf-8'))

#收消息    #解决粘包的问题ready_tag = s.recv(1024) # Ready|9999ready_tag = str(ready_tag,encoding='utf-8')if ready_tag.startswith('Ready'):  # Ready|9999msg_size = int(ready_tag.split('|')[-1])    start_tag = 'Start's.send(bytes(start_tag,encoding='utf-8')) #给server发送Start,告诉server可以准备发送数据了recv_size = 0  #初始化数据大小recv_msg =b''

while recv_size < msg_size:        recv_data = s.recv(1024)        recv_msg += recv_data        recv_size += len(recv_data)print('MSG SIZE %s RECE SIZE %s' % (msg_size, recv_size))

print(str(recv_msg,encoding='utf-8'))#挂电话s.close()

来自为知笔记(Wiz)

转载于:https://www.cnblogs.com/pangguoping/p/5675715.html

python - socket模块1相关推荐

  1. python socket模块实现udp通信_Python基于socket模块实现UDP通信功能示例

    Python基于socket模块实现UDP通信功能示例 本文实例讲述了Python基于socket模块实现UDP通信功能.分享给大家供大家参考,具体如下: 一 代码 1.接收端 import sock ...

  2. python socket模块作用_python之socket模块详解--小白博客

    主要是创建一个服务端,在创建服务端的时候,主要步骤如下: 创建socket对象socket-->绑定IP地址和端口bind-->监听listen-->得到请求accept--> ...

  3. python socket模块[errno 113_error:

    一 问题出现背景supervisorctl update error: , [Errno 113] No route to host: file: /usr/lib64/python2.7/socke ...

  4. Python socket模块

    Socket(套接字) = IP地址:端口号,在网络层通过IP地址找到主机,在传输层通过端口号找到应用进程.每一个传输层连接唯一的被通信两端的两个套接字所确定. python中,通过socket()函 ...

  5. python socket模块 和pyqt_使用PyQt和Socket进行聊天编程[标准库]

    我编写了一个程序,在客户端部分经常出现错误,我认为错误来自于client.py中的socket函数.我该怎么办? 服务器.py:# This is my server code , this code ...

  6. python socket模块recv函数_python socket 函数 模块

    欢迎指正和留言讨论哦 import socket socket()函数 1,语法格式 socket.socket([family[, type[, proto]]]) family: 套接字家族可以使 ...

  7. python的socket模块_Python socket模块方法实现详解

    这篇文章主要介绍了python socket模块方法实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 socket ssh (不带防止粘包的方 ...

  8. python转换函数使用_Python Socket模块中的IP转换函数

    Python Socket模块中包含一些有用IP转换函数,说明如下: socket.ntohl(x) // 类似于C语言的ntohl(x) 把32位正整数从网络序转换成主机字节序. socket.nt ...

  9. python共享内存通信mapofview_python map eval strPython socket模块实现的udp通信功能示例...

    本文实例讲述了Python socket模块实现的udp通信功能.分享给大家供大家参考,具体如下: socket介绍 socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要 ...

最新文章

  1. DotNetTextBox V3.0 所见即所得编辑器控件 For Asp.Net2.0(ver 3.0.9Beta)
  2. Java获取当前类名的两种方法
  3. JAVA学习之路 不走弯路,就是捷径
  4. git 入门教程之协同开发
  5. MongoDB入门及 c# .netcore客户端MongoDB.Driver2.9.1使用
  6. [云炬创业基础笔记] 第四章测试17
  7. 用C#实现仿Ruby的XML Builder
  8. Java NIO使用及原理分析
  9. SQL_server_2000安装过程指导
  10. 算法模板-广度优先遍历
  11. 使用Java 8在地图上流式传输
  12. kotlin编写后台_在Kotlin编写图书馆的提示
  13. oracle根据多个条件分别修改符合条件的记录
  14. diy 扫地机器人 滚刷_扫地机器人无法完成的使命,莱克吉米W7智能洗地机帮你完成...
  15. 深度学习之Image captioning的评分指标篇(BLEU、CIDEr)
  16. 如何卸载zabbix且删除
  17. 网络工程师还要学linux吗,网络工程师要学什么
  18. Skype国际版下载方法
  19. 爱奇艺2018届C++校招笔试
  20. python练习题---矩阵求和

热门文章

  1. servlet学习--Cookie小应用
  2. 选择问题(求第k个最小元素)
  3. IAR6.1的工程迁移到IAR6.5不能用的解决方法
  4. java怎么把大小写转换_JAVA 如何将String进行大小写转换
  5. Android Telephony分析(五) ---- TelephonyRegistry详解
  6. 红茶一杯话Binder(传输机制篇_中)
  7. Alibaba-Dexposed Bug框架原理及源码解析
  8. 基于uml的系统分析的网上商城_UML建模工具Enterprise Architect最新版有哪些新功能呢?立即查看...
  9. Social network Social computing(社会网络和社会计算)
  10. matlab绘制立体图