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

网络编程

时间:2019-05-05 17:13:26      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:elf   base   div   data   put   bre   nbsp   聊天   定义   

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

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


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

# 文件大小
file_size = os.path.getsize(r‘D:\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(r‘D:\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(b‘hello‘)
    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,像是发短信。

 

网络编程

标签:elf   base   div   data   put   bre   nbsp   聊天   定义   

原文地址:https://www.cnblogs.com/guanchao/p/10813726.html

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