第三十天
Posted xueba
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第三十天相关的知识,希望对你有一定的参考价值。
回顾
tcp协议的多人多次通信
- 和一个人通信说多句话
- 和一个人聊完在和其他人聊
- socket() tcp协议 的server
- bind 绑定一个ip 和端口
- listen 剪影 代表socket 服务的开启
- accept 等 到有客户端来访问和客户端建立连接
- send 直接通过连接发送消息 不需要写地址
- recv 只接受消息
- connect 客户端 tcp 协议 的方法 和server 端建立连接
- close 关闭服务链接
udp协议
socket(type=socket.SOCK_DGRAM)
sendto 需要写一个对方的地址
recvfrom 接收消息和地址
close 关闭服务链接
没一句话什么意思?执行到哪里程序会阻塞? 为什么阻塞? 什么时候结束阻塞?
-
input() 等待 指导用户输入enter键
-
accept() 阻塞 有客户端和我建立连接之后
-
recv() 阻塞,直到收到对方的消息之后
-
recvfrom 阻塞 直到收到对方的消息之后
-
connect 阻塞 直到server 端结束了一个对client的服务 开始和当前的client建立连接的时候
粘包现象
tcp是流式传输,数据和数据之间没有边界
解决粘包现象 :
? 先发送4字节的数据长度 先接受4字节 知道数据长度
? 再按照长度发送数据 在按照长度接收数据
今日
tcp协议的自定义协议解决年报问题
验证客户端的合法性
并发的TCP协议 server端 socketserver
udp 转发
服务端
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=‘ 33[1;%sm %s:%s 33[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()
基于tcp协议 收文件第一种 发送小文件 不考虑粘包
服务端
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:UsersAdministratorDesktop小丁变优秀的代码day31asdas.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协议 收文件第一种 发送大文件 要考虑粘包
以上是关于第三十天的主要内容,如果未能解决你的问题,请参考以下文章