码迷,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(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,像是发短信。

 

网络编程

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

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

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