网络编程三

一 .TCP上传大文件

Server端

import socket
import json
import struct

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)

            dict_size = struct.unpack(‘i‘,header)[0]

            dic_byte = conn.recv(dict_size)

            dic = json.loads(dic_byte.decode(‘utf-8‘))

            file_size = dic.get(‘file_size‘)
            recv_size = 0
            with open(dic.get(‘file_name‘),‘wb‘) as f :
                while recv_size <file_size :
                    data = conn.recv(1024)
                    f.write(data)
                    recv_size += len(data)
                    print(‘#####******####‘)
            print(‘上传成功‘)

        except ConnectionResetError :
            break
    conn.close()

Client端

import socket
import json
import struct
import os

client = socket.socket()

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

while True :

    MOVIE_DIR = r‘D:\笔记\film‘
    movie_list = os.listdir(MOVIE_DIR)

    for index,movie in enumerate(movie_list,1) :
        print(index,movie)

    choice = input(">> : ").strip()

    if choice.isdigit():
        choice = int(choice)-1

        if choice >= 0 and choice <len(movie_list) :

            file_name = movie_list[choice]
            file_path = os.path.join(MOVIE_DIR,file_name)
            file_size = os.path.getsize(file_path)

            d = {
                ‘file_name‘ : file_name,
                ‘file_size‘ : file_size,
                ‘info‘   : ‘高清无码‘
            }

            json_d = json.dumps(d)
            dic_byte = json_d.encode(‘utf-8‘)

            header = struct.pack(‘i‘,len(dic_byte))
            client.send(header)
            client.send(dic_byte)

            with open(file_path,‘rb‘) as f :
                for line in f :
                    client.send(line)
        else:
            print(‘out of range‘)
    else:
        print(‘not is digit‘)

二.异常机制

异常 : 程序运行中出现了不可预知的错误,没有相应的处理机制来进行处理,

     程序就会中断,抛出异常。

异常的结构 :

      异常类型

      异常的信息

      异常的位置

异常的类型:

      语法错误

      逻辑错误

异常的抛出方式 :

        程序运行出错被动抛出

        使用raise 异常类型 (异常信息),主动抛出

异常的处理 :

try:

    l = [1,2,3]
    l[111]
    # Exception和BaseException都是万能异常
    #其中BaseException是Exception
except BaseException:  # 万能异常  所有的异常类型都被捕获
    print(‘6666‘)

与其他关键字的配合使用:

        else :与try  : ......except连用,程序没有抛出异常才会执行

        finally:与try  : ......except连用,无论有没有异常都会执行

断言 assert:猜测某个数据的状态,猜错了抛出AssertionError异常。猜对了,代码正常执行

自定义异常:

class MyError(BaseException):
     def __init__(self,msg):
         super().__init__()
         self.msg=msg
     def __str__(self):
         return ‘<dfsdf%ssdfsdaf>‘ %self.msg

raise MyError(‘我自己定义的异常‘) 

三.TCP与UDP的区别

TCP(Transmission Control Protocol):

会粘包

不能发送空格

服务端不存在的情况下,客户端会报错

不支持并发

UDP(User Datagram Protocol):

自带报文头,不会粘包

支持发送空格

服务端不存在的情况下,客户端也不会报错

支持并发

PS :并发:看起来像同时运行的 ;并行:真正意义上的同时运行

四.UDP的基本使用

服务端

import socket

server = socket.socket(type=socket.SOCK_DGRAM)  # UDP协议
server.bind((‘127.0.0.1‘,8080))
# UDP不需要设置半连接池 它也没有半连接池的概念

# 因为没有双向通道  不需要accept  直接就是通信循环
while True:
    data, addr = server.recvfrom(1024)
    print(‘数据:‘,data)  # 客户端发来的消息
    print(‘地址:‘,addr)  # 客户端的地址
    server.sendto(data.upper(),addr)

客户端

import socket

client = socket.socket(type=socket.SOCK_DGRAM)
# 不需要建立连接  直接进入通信循环
server_address = (‘127.0.0.1‘,8080)
while True:
    client.sendto(b‘hello‘,server_address)
    data, addr = client.recvfrom(1024)
    print(‘服务端发来的数据‘,data)
    print(‘服务端的地址‘,addr)

五.SocketServer

TCP服务端

import socketserver

class MyServer(socketserver.BaseRequestHandler):
    def handle(self):
        # print(‘来啦 老弟‘)
        while True:
            data = self.request.recv(1024)
            print(self.client_address)  # 客户端地址
            print(data.decode(‘utf-8‘))
            self.request.send(data.upper())

if __name__ == ‘__main__‘:
    """只要有客户端连接  会自动交给自定义类中的handle方法去处理"""
    server = socketserver.ThreadingTCPServer((‘127.0.0.1‘,8080),MyServer)  # 创建一个基于TCP的对象
    server.serve_forever()  # 启动该服务对象

TCP客户端

import socket

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

while True:
    client.send(b‘hello‘)
    data = client.recv(1024)
    print(data.decode(‘utf-8‘))

UDP客户端

import socketserver

class MyServer(socketserver.BaseRequestHandler):
    def handle(self):
        # print(‘来啦 老弟‘)
        while True:
            data,sock = self.request
            print(self.client_address)  # 客户端地址
            print(data.decode(‘utf-8‘))
            sock.sendto(data.upper(),self.client_address)

if __name__ == ‘__main__‘:
    """只要有客户端连接  会自动交给自定义类中的handle方法去处理"""
    server = socketserver.ThreadingUDPServer((‘127.0.0.1‘,8080),MyServer)  # 创建一个基于TCP的对象
    server.serve_forever()  # 启动该服务对象

UDP服务端

import socket
import time

client = socket.socket(type=socket.SOCK_DGRAM)
server_address = (‘127.0.0.1‘,8080)

while True:
    client.sendto(b‘hello‘,server_address)
    data,addr = client.recvfrom(1024)
    print(data.decode(‘utf-8‘),addr)
    time.sleep(1)

原文地址:https://www.cnblogs.com/Cpsyche/p/11324541.html

时间: 2024-11-07 04:24:47

网络编程三的相关文章

网络编程模型及网络编程三要素

网络模型 计算机网络之间以何种规则进行通信,就是网络模型研究问题. 网络模型一般是指 OSI(Open SystemInterconnection开放系统互连)参考模型 TCP/IP参考模型 网络模型7层概述: 1.物理层:主要定义物理设备标准,如网线的接口类型.光纤的接口类型.各种传输介质的传输速率等.它的主要作用是传输比特流(就是由1.0转化为电流强弱来进行传输,到达目的地后在转化为1.0,也就是我们常说的数模转换与模数转换).这一层的数据叫做比特. 2. 数据链路层:主要将从物理层接收的数

iOS网络编程(三) 异步加载及缓存图片----&gt;SDWebImage

@SDWebImage提供一个UIImageView的类别以支持加载来自网络的远程图片.具有缓存管理.异步下载.同一个URL下载次数控制和优化等特征. @SDWebImage的导入1.https://github.com/rs/SDWebImage 下载SDWebImage开源包2.将类包拖入工程,再导入MapKit.framework.ImageIO.framework两个框架3.SDWebImage是支持ARC的,在MRC的工程中要注意,可参考MRC工程配置ARC4.注意:SDWebImag

winform网络编程(三)

TcpClient类和TcpListener类 (1)TcpClient的用途: 用于在同步阻止模式下通过网络来链接.发送和接受流数据,在此情况下,必须有侦听此连接的请求,而侦听的任务就交给TcpListener实例或Socket实例 (2)TcpClient的两种方法连接到侦听器 第一种:创建一个TcpClient,并调用3个可用的Connect方法之一 第二种:使用远程主机的主机名和端口号创建TcpClient,此构造函数将自动尝试一个连接 (3)TcpClient的常用属性和方法 Avai

网络编程三素概述

1.1网络编程概述计算机网络 ●是指将地理位置不同的具有独立功能的多 台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统 网络编程●在网络通信协议下, 实现网络互连的不同计算机上运行的程序间可以进行数据交换 网络编程三要素 IP地址●要想让网络中的计算 机能够互相通信,必须为每台计算机指定一个标识号, 通过这个标识号来指定要接收数据的计算机和识别发送的计算机,而IP地址就是这个标识号.也就是设备的标识 端口●网

Linux 网络编程三(socket代码详解)

//网络编程客户端 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h>//htons()函数头文件 #include <ne

网络编程三---多线程/进程解决并发问题

前文列出的代码给大家展示了一个最简单的网络程序,但正如文章末尾所提的,这个最简单的网络程序最大的缺点是服务端一次只能服务一个客户端,就比如说你去吃饭,饭店只有一个服务员, 而且服务员在客户离开之前只能为一个客户服务,也就是说你只能等待你前面的客户吃好饭离开了,然后你才能进去吃饭,而在你吃饭的时候时候,你后面来的人都得等你吃完饭才能轮到你后面一个人吃饭.这种模式的缺点很明显,因为在你进去点好菜到买单前的这段时间,这个服务员都是空闲的,为什么不让服务员在这个空闲时间让其他客户进来服务员为他点菜呢?在

网络编程三要素

1.ip    端口号     协议 ip地址=网络号+主机号 端口号:用于表明消息给哪个程序处理的.其中0~1023是公认端口,1024~49151是注册端口.一共有0~65535个端口. UDP协议:1.将数据封装为数据包,传输时不需要建立连接. 2.每个数据包的限制大小64K中 3.不可靠传输,传输速度快 TCP协议:(打电话.文件传输) 1.面向连接,有特有的通道 2.传输比较大的数据 3.三次握手机制建立连接,是可靠协议 4.通信前必须建立连接:效率低 2.网络通讯(Socket通讯)

Java高并发网络编程(三)NIO

从Java 1.4开始,Java提供了新的非阻塞IO操作API,用意是替代Java IO和Java Networking相关的API. NIO中有三个核心组件: Buffer缓冲区 Channel通道 Selector选择器 一.Buffer缓冲区 缓冲区本质上是一个可以写入数据的内存块(类似数组),然后可以再次读取.此内存块包含在NIO Buffer对象中,该对象提供了一组方法,可以更轻松地使用内存块. 相比较直接对数组的操作,BufferAPI更容易操作和管理. 使用Buffer进行数据写入

java网络编程三次握手四次挥手

第一次握手:client设置syn=1,随机产生一个序列号seq=x,将数据包发送到server.client进入syn_send状态, 等待server确认. 第二次握手:server查看client发来的数据包syn=1,得知是client发来的连接请求.server设置syn=1 ACK=1 ack = x+1 seq = y,并将数据包发送到客户端.server进入syn_rcvd状态. 第三次握手:client得到server的确认,查看ACK=1 ack=x+1.然后,再给serve

网络编程三要素之端口号

每个程序在设备上的唯一标识 每个网络程序都需要绑定一个端口号,传输数据的时候除了确定发到哪台机器上,还要明确发到哪个程序. 端口号范围从0-65535 编写网络应用就需要绑定一个端口号,尽量使用1024以上的,1024以下的基本上都被系统程序占用了. 常用端口 mysql: 3306 oracle: 1521 web: 80 tomcat: 8080 QQ: 4000 feiQ: 2425