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

 2.根据上图,写出socket通信的伪代码
2.1.server端伪代码
#买手机
 
#买手机卡
#开机
#等待电话
#收消息
#发消息
#挂电话
2.2.client端伪代码
#买手机
#拨号
#发消息
#收消息
#挂电话
 
3.根据伪代码写出程序
server端收到client 发送的字母后,把字母转换成大写并发送给client端
3.1.server端代码
import socket
ip_port=('127.0.0.1',)
#买手机
s = socket.socket()
#买手机卡
s.bind(ip_port)
#开机
s.listen()
#等待电话
conn,addr = s.accept()
#conn 相当于一条通信线路
#收消息
recv_data = conn.recv()
#发消息
send_data = recv_data.upper()
conn.send(send_data)
#挂电话
conn.close()
 
3.2.client端代码
import socket
ip_port = ('127.0.0.1',)
#买手机
s = socket.socket()
#拨号
s.connect(ip_port)
#发送消息
send_data = input(">>>:").strip()
s.send(bytes(send_data,encoding='utf-8'))
#收消息
recv_data = s.recv()
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 socket
ip_port=('127.0.0.1',)
#买手机
s = socket.socket()
#买手机卡
s.bind(ip_port)
#开机
s.listen()
#等待电话
conn,addr = s.accept()
#conn 相当于一条通信线路
#收消息
while True:
recv_data = conn.recv()
if len(recv_data) == :break
#发消息
send_data = recv_data.upper()
conn.send(send_data) #挂电话
conn.close()
client端
#循环输入,exit退出,可以输入空字符
import socket
ip_port = ('127.0.0.1',)
#买手机
s = socket.socket()
#拨号
s.connect(ip_port)
#发送消息
while True:
send_data = input(">>>:").strip()
if send_data == 'exit': break # 输入exit 退出程序
if len(send_data) == : continue #如果输入是空字符,退出本次循环,继续下次循环
s.send(bytes(send_data,encoding='utf-8')) #收消息
recv_data = s.recv()
print("----------------",type(recv_data))
print(str(recv_data,encoding='utf-8'))
#挂电话
s.close()
 
 

三、

一个客户端断开连接后,服务端还可以接受新的连接
 
server端
#一个客户端断开连接后,服务端还可以接受新的连接
import socket
ip_port=('127.0.0.1',)
#买手机
s = socket.socket()
#买手机卡
s.bind(ip_port)
#开机
s.listen()
#等待电话
while True:
conn,addr = s.accept()
#conn 相当于一条通信线路
#收消息
while True:
try: #客户端强制断开(不是输入exit) 会出现异常。
recv_data = conn.recv()
if len(recv_data) == :break
#发消息
send_data = recv_data.upper()
conn.send(send_data)
except Exception:
break
#挂电话
conn.close()
client端
#一个客户端断开连接后,服务端还可以接受新的连接
import socket
ip_port = ('127.0.0.1',)
#买手机
s = socket.socket()
#拨号 s.connect(ip_port)
#发送消息
while True:
send_data = input(">>>:").strip()
if send_data == 'exit': break # 输入exit 退出程序
if len(send_data) == : continue #如果输入是空字符,退出本次循环,继续下次循环
s.send(bytes(send_data,encoding='utf-8')) #收消息
recv_data = s.recv()
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() #收到客户端发送过来的Start
feedback = str(feedback,encoding='utf-8') #把收到的feedback 转换为str
if feedback.startswith('Start'):
conn.send(send_data)
 
client端代码:
#解决粘包的问题
ready_tag = s.recv() # Ready|9999
ready_tag = str(ready_tag,encoding='utf-8')
if ready_tag.startswith('Ready'): # Ready|9999
msg_size = int(ready_tag.split('|')[-])
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()
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 socket
import subprocess
ip_port=('127.0.0.1',)
#买手机
s = socket.socket()
#买手机卡
s.bind(ip_port)
#开机
s.listen()
#等待电话
while True:
conn,addr = s.accept()
#conn 相当于一条通信线路
#收消息
while True:
try: #客户端强制断开(不是输入exit) 会出现异常。
recv_data = conn.recv()
if len(recv_data) == :break
#发消息
p=subprocess.Popen(str(recv_data,encoding='utf-8'),shell=True,stdout=subprocess.PIPE)
res = p.stdout.read()
if len(res) == : #处理输入的错误命令
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() #收到客户端发送过来的Start
feedback = str(feedback,encoding='utf-8') #把收到的feedback 转换为str
if feedback.startswith('Start'):
conn.send(send_data)
except Exception:
break
#挂电话
conn.close()
 
client端:
#一个客户端断开连接后,服务端还可以接受新的连接
import socket
ip_port = ('127.0.0.1',)
#买手机
s = socket.socket()
#拨号 s.connect(ip_port)
#发送消息
while True:
send_data = input(">>>:").strip()
if send_data == 'exit': break # 输入exit 退出程序
if len(send_data) == : continue #如果输入是空字符,退出本次循环,继续下次循环
s.send(bytes(send_data,encoding='utf-8')) #收消息
#解决粘包的问题
ready_tag = s.recv() # Ready|9999
ready_tag = str(ready_tag,encoding='utf-8')
if ready_tag.startswith('Ready'): # Ready|9999
msg_size = int(ready_tag.split('|')[-])
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()
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()
 
 
 

python - socket模块1的更多相关文章

  1. python——socket模块与列表映射

    从socket模块学习中的一段奇怪代码说起 前言:在学习python标准库中的Socket模块中,发现了一段奇怪的代码. import socket def get_constants(prefix) ...

  2. python --- socket模块详解

    socket常用功能函数: socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)                  ...

  3. 用python socket模块实现简单的文件下载

    server端: # ftp server端 import socket, os, time server = socket.socket() server.bind(("localhost ...

  4. 项目: 基于Python socket模块实现的简单 ftp 项目:

    需要 自己创建一个 info 文件 用来存储用户信息 服务器: import socket import pickle import struct import os import time ''.s ...

  5. Python socket 基础(Server) - Foundations of Python Socket

    Python socket 基础 Server - Foundations of Python Socket 通过 python socket 模块建立一个提供 TCP 链接服务的 server 可分 ...

  6. Python中的socket 模块

    Python 提供了两个基本的 socket 模块.第一个是 Socket,它提供了标准的 BSD Sockets API.第二个是 SocketServer, 它提供了服务器中心类,可以简化网络服务 ...

  7. Python网络编程(2)——socket模块(2)

    目录: 1. 异常 2. 地址族 3. 套接字类型 4. 模块方法 5. Socket对象与实例方法 socket模块提供了Python中的低层网络连接接口,用于操作套接字操作. 异常 socket模 ...

  8. 老李分享:使用 Python 的 Socket 模块开发 UDP 扫描工具

    老李分享:使用 Python 的 Socket 模块开发 UDP 扫描工具 poptest是业内唯一的测试开发工程师培训机构,测试开发工程师主要是为测试服务开发测试工具,在工作中要求你做网络级别的安全 ...

  9. python实战第一天-socket模块练习

    操作系统 Ubuntu 15.10 IDE & editor JetBrains PyCharm 5.0.2 ipython3 Python版本 python-3.4.3 导入socket模块 ...

随机推荐

  1. mybatis之特殊查询

    在mybatis查询的过程中,某个字段是经过计算得到的,这时,在设计数据表的时候,就不 必在增加此对应的字段 那么,在查询的时候,页面有需要展示这个字段时,怎么办呢? 举个例子: 在查询微信团商品时, ...

  2. 任务栈 启动模式 Flag taskAffinity

    关于任务栈Task 栈的概念 栈(Stack)是一种常用的数据结构,栈只允许访问栈顶的元素,栈就像一个杯子,每次都只能取杯子顶上的东西,而对于栈就只能每次访问它的栈顶元素,从而可以达到保护栈顶元素以下 ...

  3. .net对文件的操作之文件读写

    读写文件的步骤一般需要5步: 创建文件流 创建读写器 执行读或写的操作 关闭读写器 关闭文件流 需要引用:System.IO这个命名空间 代码演示: string path = @"F:\a ...

  4. 使用ICallbackEventHandler接口更高效实现Ajax

    使用ICallbackEventHandler接口可以方便地高效地实现Ajax功能 1.处理页面需实现ICallbackEventHandler接口,此接口有两个方法 a.GetCallbackRes ...

  5. 如何读懂SQL Server的事务日志

    简介 本文将介绍SQL Server的事务日志中记录了哪一些信息,如何来读懂这些事务日志中信息.首先介绍一个微软没有公开的函数fn_dblog,在文章的接下来的部分主要用到这个函数来读取事务日志. f ...

  6. PHP学习系列(1)——字符串处理函数(1)

    从09年开始使用JAVA到现在差不多5年多了,然后由于即将要去的公司(研究僧终于要毕业了!)是使用PHP,Python作为后台开发语言的,所以要开始一段双P的学习旅程.用过PHP的都说这是很简单的一门 ...

  7. dedecms 织梦ping服务插件 最新破解可用版

    dedecms 织梦ping服务插件 最新破解可用版  ping_gbk.xml <module> <baseinfo> name=ping服务 team=井哥 time=20 ...

  8. CM源码同步编译教程

    一.操作系统 准备一个ubuntu安装镜像,我用的是12.10. 安装系统时请安装到30g以上的盘,最好就50g以上啦 安装教程不多说,网上很多教程,这里我推荐用自带的wubi工具安装,比较方便 用虚 ...

  9. JVM JMM

  10. Android SQLite简介

    SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能.此外它还是开源的,任何人都可以使用它.许多开源项目((Mozilla, PHP, Python)都使 ...