第三十天

Posted xueba

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第三十天相关的知识,希望对你有一定的参考价值。

回顾

tcp协议的多人多次通信

  1. 和一个人通信说多句话
  2. 和一个人聊完在和其他人聊
  3. socket() tcp协议 的server
  4. bind 绑定一个ip 和端口
  5. listen 剪影 代表socket 服务的开启
  6. accept 等 到有客户端来访问和客户端建立连接
  7. send 直接通过连接发送消息 不需要写地址
  8. recv 只接受消息
  9. connect 客户端 tcp 协议 的方法 和server 端建立连接
  10. close 关闭服务链接

udp协议

socket(type=socket.SOCK_DGRAM)

sendto 需要写一个对方的地址

recvfrom 接收消息和地址

close 关闭服务链接

没一句话什么意思?执行到哪里程序会阻塞? 为什么阻塞? 什么时候结束阻塞?

  1. input() 等待 指导用户输入enter键

  2. accept() 阻塞 有客户端和我建立连接之后

  3. recv() 阻塞,直到收到对方的消息之后

  4. recvfrom 阻塞 直到收到对方的消息之后

  5. 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:%s33[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协议 收文件第一种 发送大文件 要考虑粘包

以上是关于第三十天的主要内容,如果未能解决你的问题,请参考以下文章

安卓第十天笔记-fragment

第三十天

数学建模学习笔记集训十天之第三天

Mysql基础第三十天,全球化和本地化

C++笔试强训第三十天

关于学习小组第三篇分享总结-三十天如何让自己变成一个超级自律的人