Python网络通信
day26
网络通信
参考:
http://www.cnblogs.com/yuanchenqi/articles/5692716.html

男生是client端,字条是socket(sk),通过sk通信。
socket属于客户端。应用程序两端通过“套接字”向网络发出请求或者应答网络请求。可以把socket理解为通信的把手(hand)。
确定对端IP地址→ 确定应用程序端口 → 确定通讯协议

server下的方法
bind()
listen()
accept()
recv()
send()#传送内容必须为bytes类型
sendall()
close()
client下的方法
connect()
recv()
send()
aendall()
close()
client发送,serve接收

serve.py
import socket
sk = socket.socket()#创建socket
print(sk)
address = ('127.0.0.1', 8000)#本机地址
sk.bind(address)#为socket绑定IP和端口号
sk.listen(3)#限制排队的个数
print('waiting......')
conn, addr = sk.accept()#conn为客户端socket对象
#
# inp = input('>>>')
# conn.send(bytes(inp, 'utf8'))
data = conn.recv(1024)#为什么用conn,而不用sk
print(str(data, 'utf8'))
# conn.close()#关具体对象
# sk.close()#全关
client.py
import socket sk = socket.socket() print(sk)
address = ('127.0.0.1', 8000) sk.connect(address) #data = sk.recv(1024)#收到的为bytes类型
data = sk.send(bytes('hah', 'utf8')) #print(str(data, 'utf8'))
运行serve.py
<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)>
waiting......
waiting,accept()阻塞。
运行client.py
<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)>
Process finished with exit code 0
serve收到数据“hah”
<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)>
waiting......
hah
Process finished with exit code 0
client接收,serve发送
serve.py
import socket
sk = socket.socket()#创建socket
print(sk)
address = ('127.0.0.1', 8000)#本机地址
sk.bind(address)#为socket绑定IP和端口号
sk.listen(3)#限制排队的个数
print('waiting......')
conn, addr = sk.accept()#conn为客户端socket对象
inp = input('>>>')
conn.send(bytes(inp, 'utf8'))
# data = conn.recv(1024)#为什么用conn,而不用sk
# print(str(data, 'utf8'))
# conn.close()#关具体对象
# sk.close()#全关
client.py
import socket sk = socket.socket() print(sk)
address = ('127.0.0.1', 8000) sk.connect(address) data = sk.recv(1024)#收到的为bytes类型
#data = sk.send(bytes('hah', 'utf8')) print(str(data, 'utf8'))
运行serve.py
<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)>
waiting......
运行client.py
<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)>
在serve命令行输入hello
<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)>
waiting......
>>>hello
Process finished with exit code 0
client命令行收到数据。
<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)>
hello
Process finished with exit code 0
不间断聊天
client.py
import socket sk = socket.socket() print(sk)
address = ('127.0.0.1', 8000)
sk.connect(address) while True:
inp = input('>>>')
if inp == 'exit':
break
sk.send(bytes(inp, 'utf8')) data = sk.recv(1024)
print(str(data, 'utf8')) sk.close()
#print(sk)
serve.py
import socket
sk = socket.socket()#创建socket
print(sk)
address = ('127.0.0.1', 8000)#本机地址
sk.bind(address)#为socket绑定IP和端口号
sk.listen(3)#限制排队的个数
print('waiting......')
#conn, addr = sk.accept()#conn为客户端socket对象
while True:
conn, addr = sk.accept()
print(addr) #client打开则接收
while True:
#收
try:
data = conn.recv(1024)#为什么用conn,而不用sk,client关闭时报错误
except Exception:
break #client端停止,他也停止
print('.......',str(data, 'utf8'))
if not data:break
#发
inp = input('>>>')
conn.send(bytes(inp, 'utf8'))
sk.close()#全关
不间断聊天,其中client若关闭,新开一个client,serve端还能继续服务。
粘包现象(远程执行命令)
cmd_client.py
import socket sk = socket.socket() print(sk)
address = ('127.0.0.1', 8001)
sk.connect(address) while True:
inp = input('>>>')
if inp == 'exit':
break
sk.send(bytes(inp, 'utf8'))
result_len = int(str(sk.recv(1024), 'utf8')) sk.sendall(bytes('ok', 'utf8'))#收到长度信息后,告诉server data = bytes()#初始化
while len(data) != result_len: #等于原文件大小,说明接收完
recv = sk.recv(1024)
data += recv print(str(data, 'utf8')) sk.close()
#print(sk)
cmd_server.py
import socket
import subprocess
sk = socket.socket()#创建socket print(sk) address = ('127.0.0.1', 8001)#本机地址
sk.bind(address)#为socket绑定IP和端口号 sk.listen(3)#限制排队的个数
print('waiting......')
#conn, addr = sk.accept()#conn为客户端socket对象 while True:
conn, addr = sk.accept()
print(addr) #client打开则接收
while True:
#收
try:
data = conn.recv(1024)#为什么用conn,而不用sk,client关闭时报错误
except Exception:
break #client端停止,他也停止
print('.......',str(data, 'utf8')) if not data:break
obj = subprocess.Popen(str(data, 'utf8'), shell = True, stdout = subprocess.PIPE)
cmd_result = obj.stdout.read()#以上执行结果
#print(cmd_result)
result_len = bytes(str(len(cmd_result)), 'utf8') conn.sendall(result_len)#发
#先向client发送数据,client若收到则向server发送OK,Server再发送处理结果
#若连续发送,两个发送内容(长度,处理结果)可能会合并。
re = conn.recv(1024)#防止粘包
if str(re, 'utf8') != 'ok':
break
#发
conn.sendall(cmd_result) # conn.sendall(result_len) # 这种方式会发生粘包现象,长度和内容合在一起了
# conn.sendall(cmd_result)
sk.close()#全关
先执行server.py,再执行client.py,在client中输入命令(dir,pwd,ifconfig等)
Python网络通信的更多相关文章
- Python网络通信 (一)
ISO(国际标准化组织)--->网络体系结构标准 OSI模型 OSI 七层模型 应用层 :提供用户服务,具体内容由特定程序规定 表示层 :提供数据的压缩解压和加密等 会话层 :建立程序级的连接, ...
- FastNet C++/Python 网络通信库之 协议
协议可以使用的基础数据类型: UInt8,UInt16,UInt32,UInt64Int8,Int16,Int32,Int64Float,Double,Bool,String [T] 数组,T代表元 ...
- Python—网络通信编程之tcp非阻塞通信(socketserver)
服务端代码 import socketserver # 定义一个类 class MyServer(socketserver.BaseRequestHandler): # 如果handle方法出现报错, ...
- Python—网络通信编程之udp通信编程
服务端代码 import socket # 1.创建实例,即数据报套接字 server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 2.绑 ...
- Python—网络通信编程之tcp通信编程
服务端代码 import socket # 1.创建流式套接字实例 # server = socket.socket() server = socket.socket(socket.AF_INET, ...
- python中Socket的使用
说明 前一段时间学习python网络编程,完成简单的通过python实现网络通信的功能.现在,将python中Socket 通信的基本实现过程做一个记录备份. Socket通信 python 中的so ...
- twisted是python实现的基于事件驱动的异步网络通信构架。
网:https://twistedmatrix.com/trac/ http://www.cnblogs.com/wy-wangyan/p/5252271.html What is Twisted? ...
- 百万年薪python之路 -- 网络通信原理
1. C/S B/S架构 C: Client 客户端 B: Browse 浏览器 S: Server 服务端 C/S架构: 基于客户端与服务端之间的通信 eg: QQ,微信,LOL,DNF等需要安装A ...
- python中的网络通信,socket、select、selectors、socketserver
楔子 网络通信用于获取一个算法在本地运行所需的数据,还可以共享信息实现分布式处理,另外可以用来管理云服务. python的标准库提供了一些模块来创建网络服务以及访问现有服务ipaddress模块提供了 ...
随机推荐
- ajax原理以及优缺点(转)
1.ajax技术的背景不可否认,ajax技术的流行得益于google的大力推广,正是由于google earth.google suggest以及gmail等对ajax技术的广泛应用,催生了ajax的 ...
- swift 添加webview
swift显示HTML代码 在布局中的方法 1.根据URL 直接显示内容, var urls : NSURL = NSURL(string: "http://www.baidu.com&q ...
- css长度
在CSS样式表中,长度单位分两种: 相对长度单位,如px, em等绝对长度单位,如pt,mm等 CSS相对长度单位(relative length unit) CSS相对长度单位中的相对二字,表明了其 ...
- 情感分析snownlp包部分核心代码理解
snownlps是用Python写的个中文情感分析的包,自带了中文正负情感的训练集,主要是评论的语料库.使用的是朴素贝叶斯原理来训练和预测数据.主要看了一下这个包的几个主要的核心代码,看的过程作了一些 ...
- hdu-2844(完全背包+二进制优化模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2844 思路:问1-m能的得到的硬币的值,所以dp[i]==i即可. #include<iostr ...
- [VC++入门]指针一
俗话说没有搞清楚指针就没有学会C/C++,所以指针是一个相当重要的东东,相当年在用 C#调用C++写的动态链接库时,以为C++中的指针就是C#中的引用类型(ref),但是看了一下却不是这样.指针当然和 ...
- HDU 2161 Primes (素数筛选法)
题意:输入一个数判断是不是素数,并规定2不是素数. 析:一看就很简单吧,用素数筛选法,注意的是结束条件是n<0,一开始被坑了... 不说了,直接上代码: #include <iostrea ...
- UVa 12118 nspector's Dilemma (构造+DFS+欧拉回路)
题意:给定n个点,e条边和每条边的长度t,每两个点之间都有路相连,让你求一条最短的路经过这e条边. 析:刚开始想到要判连通,然后把相应的几块加起来,但是,第二个样例就不过,后来一想,那么有欧拉回路的还 ...
- Mybatis中的update动态SQL语句
Mybatis中的CRUD操作(增删改查)中,简单的SQL操作比较直观,如查找操作: <select id="findBySrcId" resultMap="ent ...
- 20155302 2016-2017-2 《Java程序设计》第六周学习总结
20155302 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入 ...