一、TCP(只能一对一,长连接):server端
import socket
sk = socket.socket() #相当于买手机 创建一个socket对象
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #避免服务重启的时候报address alrealy in use
sk.bind(('127.0.0.1',8890))#相当于绑定手机卡:给server端绑定一个ip和端口
sk.listen(5) #监听 等着有人给我打电话 只允许5个人连我
conn,addr = sk.accept()#接收别人的电话 connection:连接 address 地址 获取到一个客户端的连接,已完成了三次握手建立了一个连接
print(addr)
while True:
ret = conn.recv(1024).decode('utf-8') #听别人说话 recv(num):num接收的字节长度
if ret == 'bye':
break
print(ret)
info = input('>>')
conn.send(bytes(info,encoding='utf-8'))
conn.close() #挂电话
sk.close()#关手机 关闭socket对象
输出结果:
(‘127.0.0.1’, 56533)
你好
很好
TCP:client端
import socket
sk = socket.socket() #买手机
sk.connect(('127.0.0.1',8890))#拨别人的号
while True:
info = input('>>')
sk.send(bytes(info,encoding='utf-8'))
ret = sk.recv(1024).decode('utf-8')
print(ret)
if ret == 'bye':
sk.send(b'bye')
break
sk.close()
输出结果:
你好
很好
bye
二、UDP(可以多对一):server端:
import socket
sh = socket.socket(type=socket.SOCK_DGRAM)
sh.bind(('127.0.0.1',8080))
while True:
msg,addr = sh.recvfrom(1024)
print(msg.decode('utf-8'))
info = input('>>').encode('utf-8')
sh.sendto(info,addr)
sh.close()
输出结果:
来自耿娃的消息:hi
hellow
来自全蛋的消息:你好
你好
来自全蛋的消息:bye
bye
来自耿娃的消息:see you
bye
UDP:client(1)端:
import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
ip_port = ('127.0.0.1',8080)
while True:
info = input('耿娃:')
info = ('\033[32m来自耿娃的消息:%s\033[0m'%info).encode('utf-8')
sk.sendto(info,ip_port)
ret,addr = sk.recvfrom(1024)
print(ret.decode('utf-8'))
sk.close()
输出结果:
耿娃:hi
hellow
耿娃:see you
bye
耿娃:
UDP:client(2)端:
import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
ip_port = ('127.0.0.1',8080)
while True:
info = input('全蛋:')
info = ('\033[34m来自全蛋的消息:%s\033[0m' % info).encode('utf-8')
sk.sendto(info,ip_port)
ret,addr = sk.recvfrom(1024)
print(ret.decode('utf-8'))
sk.close()
输出结果:
全蛋:你好
你好
全蛋:bye
bye
全蛋:
udp:
1、udp的server不需要进行监听也不需要建立连接
2、在启动服务之后只能被动的等待客户端发送消息过来
3、客户端发送消息的同时还会自带地址信息
4、消息回复的时候不仅需要发送消息,还需要把自己的地址发送过去
三、一个很好的例子(所有的客户端执行server端下发的指令将结果反馈回来,我来接收):
在server端下发命令
在client端接收命令
TCP(server端):
import subprocess
res = subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
print('stdout',res.stdout.read().decode('gbk'))
print('stderr:',res.stderr.read().decode('gbk'))
import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8090))
sk.listen(5)
conn,addr = sk.accept()
while True:
cmd = input('>>').encode('utf-8')
conn.send(cmd)
ret = conn.recv(10240).decode('utf-8')
print(ret)
conn.close()
sk.close()
输出结果:
stdout 驱动器 D 中的卷是 LENOVO 卷的序列号是 8CB6-F27B D:\Python\python_txt\GUI进度条 的目录2018/11/28 15:36 …
dir
stdout 驱动器 D 中的卷是 LENOVO 卷的序列号是 8CB6-F27B D:\Python\python_txt\GUI进度条 的目录2018/11/28 15:36 …
TCP(client端):
import socket
import subprocess
sk = socket.socket()
sk.connect(('127.0.0.1',8090))
while True:
cmd = sk.recv(10240).decode('gbk')
ret = subprocess.Popen(cmd,shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
stdout = 'stdout:'+ (ret.stdout.read()).decode('gbk')
stderr = 'stderr:'+ (ret.stderr.read()).decode('gbk')
sk.send(stdout.encode('utf-8'))
sk.send(stderr.encode('utf-8'))
sk.close()
UDP(server端):
import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',8090))
msg,addr = sk.recvfrom(1024)
while True:
cmd = input('>>:')
if cmd == 'q':
break
sk.sendto(cmd.encode('utf-8'),addr)
msg,addr = sk.recvfrom(1024)
print(msg.decode('utf-8'))
sk.close()
输出结果:
:dir
stdout: 驱动器 D 中的卷是 LENOVO
卷的序列号是 8CB6-F27B…
UDP(client端):
import socket
import subprocess
sk = socket.socket(type=socket.SOCK_DGRAM)
addr = ('127.0.1',8090)
sk.sendto('hi'.encode('utf-8'),addr)
while True:
cmd, addr = sk.recvfrom(1024)
ret = subprocess.Popen(cmd.decode('gbk'),shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
stdout = 'stdout:'+ (ret.stdout.read()).decode('gbk')
stderr = 'stderr:'+ (ret.stderr.read()).decode('gbk')
print(stdout)
print(stderr)
sk.sendto(stdout.encode('utf-8'),addr)
sk.sendto(stderr.encode('utf-8'),addr)
sk.close()
输出结果:
stdout: 驱动器 D 中的卷是 LENOVO
卷的序列号是 8CB6-F27B…