码迷,mamicode.com
首页 > 其他好文 > 详细

第三十天

时间:2020-03-25 01:30:50      阅读:59      评论:0      收藏:0      [点我收藏+]

标签:一个人   tcp   input   get   输入   自定义   filename   mini   转换   

回顾

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=‘\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()

基于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:\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协议 收文件第一种 发送大文件 要考虑粘包

第三十天

标签:一个人   tcp   input   get   输入   自定义   filename   mini   转换   

原文地址:https://www.cnblogs.com/xueba/p/12563472.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!