标签:一个人 tcp input get 输入 自定义 filename mini 转换
socket(type=socket.SOCK_DGRAM)
sendto 需要写一个对方的地址
recvfrom 接收消息和地址
close 关闭服务\链接
没一句话什么意思?执行到哪里程序会阻塞? 为什么阻塞? 什么时候结束阻塞?
input() 等待 指导用户输入enter键
accept() 阻塞 有客户端和我建立连接之后
recv() 阻塞,直到收到对方的消息之后
recvfrom 阻塞 直到收到对方的消息之后
connect 阻塞 直到server 端结束了一个对client的服务 开始和当前的client建立连接的时候
tcp是流式传输,数据和数据之间没有边界
解决粘包现象 :
? 先发送4字节的数据长度 先接受4字节 知道数据长度
? 再按照长度发送数据 在按照长度接收数据
tcp协议的自定义协议解决年报问题
验证客户端的合法性
并发的TCP协议 server端 socketserver
服务端
import socket
friend_lst={‘alex‘:‘32‘,‘太白‘:‘33‘}
sk=socket.socket(type=socket.SOCK_DGRAM)
sk.bind((‘127.0.0.1‘,9001))
dic={}
while 1:
msg,addr=sk.recvfrom(1500)
msg=msg.decode(‘utf-8‘)
name,message=msg.split(‘|‘)
# print(addr)
if name not in dic:
dic[name]=addr
# print(dic)
msg=‘\033[1;%sm %s:%s\033[0m‘%(friend_lst.get(name,‘30‘),name,message)
# print(msg)
# content=input(‘>>>‘)
if len(dic)==2:
if name ==‘alex‘:
sk.sendto(msg.encode(‘utf-8‘),dic[‘太白‘])
else:
sk.sendto(msg.encode(‘utf-8‘), dic[‘alex‘])
# if content.upper()==‘Q‘:break
客户端1
import socket
name=‘太白‘
sk=socket.socket(type=socket.SOCK_DGRAM)
while 1:
content=input(‘>>>‘)
if content.upper()==‘Q‘:break
content ="%s|%s" %(name,content)
sk.sendto(content.encode(‘utf-8‘),(‘127.0.0.1‘,9001))
msg=sk.recv(1024).decode(‘utf-8‘)
# if msg.upper() == ‘Q‘: break
print(msg)
客户端2
import socket
name=‘alex‘
sk=socket.socket(type=socket.SOCK_DGRAM)
while 1:
content=input(‘>>>‘)
if content.upper()==‘Q‘:break
content ="%s|%s" %(name,content)
sk.sendto(content.encode(‘utf-8‘),(‘127.0.0.1‘,9001))
msg=sk.recv(1024).decode(‘utf-8‘)
# if msg.upper() == ‘Q‘: break
print(msg)
#
# msg=sk.recv(1024)
# print(msg)
# sk.send(b‘bye‘)
#
# sk.close()
import socket
import json
sk=socket.socket()
sk.bind((‘127.0.0.1‘,9001))
sk.listen()
conn,_=sk.accept()
msg=conn.recv(1024).decode(‘utf-8‘)
msg=json.loads(msg) #json语句 转换成普通
with open (msg[‘filename‘],‘wb‘) as f:
content=conn.recv(msg[‘filesize‘])
print((‘->‘,len(content)))
f.write(content)
conn.close()
sk.close()
import os
import socket
import json
sk=socket.socket()
sk.connect((‘127.0.0.1‘,9001))
abc_path=r‘C:\Users\Administrator\Desktop\小丁变优秀的代码\day31\asdas.py‘
filename=os.path.basename(abc_path)
filesize=os.path.getsize(abc_path)
dic={‘filename‘:filename,‘filesize‘:filesize}
str_dic=json.dumps(dic) # 转换成 json 语句
sk.send(str_dic.encode(‘utf-8‘))
with open(abc_path,mode=‘rb‘) as f:
content=f.read()
sk.send(content)
sk.close()
标签:一个人 tcp input get 输入 自定义 filename mini 转换
原文地址:https://www.cnblogs.com/xueba/p/12563472.html