网络编程

Posted guanchao

tags:

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

一 socket 实现大文件上传(基于TCP协议)

技术图片
import socket,os, json,struct


client = socket.socket()
client.connect((127.0.0.1,8080))

# 文件大小
file_size = os.path.getsize(rD:\fullstack_s\day32\巴拉巴拉.mp4)
# 文件名字
file_name = 性感荷官在线发牌.mp4

# 定义一个字典
d = {
    "file_name":file_name,
    "file_size":file_size,
    msg:注意身体哦!
}
data_bytes = json.dumps(d).encode(utf-8)
# 制作字典的报头
header = struct.pack(i,len(data_bytes))
# 发送报头
client.send(header)
# 发送字典
client.send(data_bytes)
# 发送真实数据
with open(rD:\fullstack_s\day32\巴拉巴拉.mp4,rb) as f:
    for line in f:
        client.send(line)
服务端
技术图片
import socket,struct,json,os

server = socket.socket()
server.bind((127.0.0.1,8080))
server.listen(5)

while True:
    conn,addr = server.accept()
    while True:
        try:
            # 先接受报头
            header = conn.recv(4)
            # 解析报头 获取字典长度
            header_len = struct.unpack(i,header)[0]
            # 接收字典
            header_bytes = conn.recv(header_len)

            header_dic = json.loads(header_bytes.decode(utf-8))
            print(header_dic)
            # 循环接收文件 存储到本地
            file_size = header_dic.get(file_size)
            file_name = header_dic.get(file_name)
            recv_size = 0
            # 文件操作
            with open(file_name,wb) as f:
                # 循环接收文件数据
                while recv_size < file_size:
                    data = conn.recv(1024)
                    f.write(data)
                    recv_size += len(data)
            print(header_dic.get(msg))
        except ConnectionResetError:
            break
    conn.close()
客户端

   socket基于TCP协议实现并发通信:socketserver模块(实现思路,TCP协议的特点是必须接客与服务是一个人,所以下一位服务的前提是上次服务完成,而socketserver的思路是,安排个老鸨专门接客)

技术图片
服务端
import socketserver

class MyBaby(socketserver.BaseRequestHandler):
    def handle(self):
        # 通信循环
        while True:
            # self.request相当于你的conn通信对象
            data,sock = self.request # 收消息
            print(data)
            sock.sendto(data.upper(),self.client_address)  # self.client_address客户端地址


if __name__ == __main__:
    server = socketserver.ThreadingUDPServer((127.0.0.1,8080),MyBaby)
    server.serve_forever()

客户端
import socket


client = socket.socket()
client.connect((127.0.0.1,8080))

while True:
    client.send(bhello)
    data = client.recv(1024)
    print(data)
socketserver并发

 

 

二 socket 聊天功能(基于UDP协议)

技术图片
服务端
import socket


server = socket.socket(type=socket.SOCK_DGRAM)
server.bind((127.0.0.1,8080))

while True:
    msg,addr = server.recvfrom(1024)
    print(msg.decode(utf-8))
    data = input(>>>:).encode(utf-8)
    server.sendto(data,addr)

客户端
import socket


client = socket.socket(type=socket.SOCK_DGRAM)
server_addr = (127.0.0.1,8080)

while True:
    msg = input(>>>:)
    msg = 客户端1的消息:%s%msg
    client.sendto(msg.encode(utf-8),server_addr)
    data,addr = client.recvfrom(1024)
    print(data)
简易QQ

基于UDP协议的通信特点:不粘包,支持并发。

TCP/UDP 区别:TCP,像打电话;UDP,像是发短信。

 

以上是关于网络编程的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装

使用 Pygments 检测代码片段的编程语言

面向面试编程代码片段之GC

如何在 Django Summernote 中显示编程片段的代码块?