python网络编程(通过tcp或者udp协议通信)

1、基于tcp协议传送文件:

  客户端:

import socketimport osimport jsonimport structclient = socket.socket()client.connect((‘127.0.0.1‘,8080))

# 文件大小file_size = os.path.getsize(r‘F:\老男孩Python7期\day32\视频\02TCP发送大文件.mp4‘)

# 文件名字file_name = ‘TCP发送大文件.mp4‘# 定义一个字典d = {    ‘file_name‘:file_name,    ‘file_size‘:file_size}data_pytes = json.dumps(d).encode(‘utf-8‘)# 制作报头header = struct.pack(‘i‘,len(data_pytes))# 发送报文client.send(header)# 发送字典client.send(data_pytes)# 发送真实数据with open(r‘F:\老男孩Python7期\day32\视频\02TCP发送大文件.mp4‘,‘rb‘) as f:    for lie in f:        client.send(lie)  服务端:
import socketimport structimport jsonimport 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]            print(‘长度为‘+header_len)            # 接收字典,其中header_len显示为接收内容的长度            header_bytes = conn.recv(header_len)            header_dic = json.loads(header_bytes.decode(‘utf-8‘))            print(header_dic)            # 根据字典中的key获取对应的value            file_name = header_dic[‘file_name‘]            file_size = header_dic[‘file_size‘]            resc_size = 0            # 文件操作            with open(file_name,‘wb‘) as f:                while resc_size <file_size:                    data = conn.recv(1024)                    f.write(data)                    resc_size += len(data)        except ConnectionRefusedError:            break    conn.close()

2、UDP协议通信(由于没有双通道,不会出现沾包、客户端中断或者服务端中断不影响、客户端可以发空内容)  客户端:
import socket

client = socket.socket(type=socket.SOCK_DGRAM)service_addr =(‘127.0.0.1‘,8080)while True:    msg = input(‘输入要发送的消息:‘)    msg = ‘客户发送的消息:%s‘ % msg    client.sendto(msg.encode(‘utf-8‘),service_addr)    data,addr = client.recvfrom(1024)    print(data.decode(‘utf-8‘))    print(addr)
  服务端:
import socket

service = socket.socket(type=socket.SOCK_DGRAM)service.bind((‘127.0.0.1‘,8080))while True:    msg,addr = service.recvfrom(1024)    print(msg.decode(‘utf-8‘))    print(addr)    data = input(‘请输入回复消息:‘).encode(‘utf-8‘)    service.sendto(data,addr)

基于sockerServer模块下tcp和udp高并发通讯  这里的高并发并不是真正意义上的高并发,是看起来像是同时运行的就成为并发# 注意事项:udp在测试高并发的时候不要默认循环测试,最好使用客户端使用一些io操作,不然会出现卡死现象

1、基于tcp的sockerServer模块使用

客户端:
import socket

client = socket.socket()client.connect((‘127.0.0.1‘,8080))while True:    msg = input(‘请输入要发送的消息:‘).encode(‘utf-8‘)    client.send(msg)    data = client.recv(1024)    print(data.decode(‘utf-8‘))服务端:
import socketserverclass Mybaby(socketserver.BaseRequestHandler):    def handle(self):        while True:            data = self.request.recv(1024)            print(data.decode(‘utf-8‘))            msg = input(‘请输入要发送的消息:‘).encode(‘utf-8‘)            self.request.send(msg)if __name__ == ‘__main__‘:    server = socketserver.ThreadingTCPServer((‘127.0.0.1‘,8080),Mybaby)    server.serve_forever()

2、基于UDP通信客户端:
import socketimport timeclient = socket.socket(type=socket.SOCK_DGRAM)service_addr = (‘127.0.0.1‘, 8080)while True:    client.sendto(b‘hello world‘,service_addr)    data, addr = client.recvfrom(1024)    print(data)    print(addr)    time.sleep(2)服务端:
import socketserver

class MyBaby(socketserver.BaseRequestHandler):    def handle(self):        while True:            data,sock = self.request            print(data)            print(self.client_address)            sock.sendto(data,self.client_address)if __name__ == ‘__main__‘:    server = socketserver.ThreadingUDPServer((‘127.0.0.1‘,8080),MyBaby)    server.serve_forever()
 
总结:

1、为什么会出现粘包现象?  只有在tcp协议中才会出现粘包现象,因为tcp协议是流式协议  特点是将数据量比较小且间隔时间短的数据一次性打包发送出去,本质还是因为我们不知道需要接收数据的长短。2、怎么解决粘包?  1、发送数据先告诉对方数据量的大小  2、利用struct模块定制自己的消息传输协议UDP协议:  1、udp协议客户端允许发空内容。  2、udp协议不会出现粘包。  3、udp协议服务端不存在的情况下,客户端照样不会报错。  4、udp协议支持并发。udp协议叫数据协议,发消息接收消息都带有报头upd的service不需要监听也不需要建立连接在启动服务后只能被动的等待客户端发送消息过来,客户端发送消息过来的时候,带上服务端的地址,服务端回复消息的时候,也到带上客户端的地址。

 
并发编程:多道技术的产生:  解决cpu在执行程序,遇到io时,cpu不干活的情况  串行:一个程序完完整整的运行完毕,才能运行下一个程序。  并发:看上去像是同时运行。多道技术:  空间上的复用(多个程序共用一套硬件设别,它是多道技术实现时间上的复用的基础。)  时间上的复用(单个cpu的电脑上,起多个应用程序,cpu快速切换,给人的感觉是同时运行)  一个任务占用cpu时间过长或被操作系统强行剥夺走cpu的执行权限(比起串行效率而降低)  一个任务执行过程中遇到io操作(等待时间),也会被操作系统强行剥夺cpu的执行权限(比串行效率高)

原文地址:https://www.cnblogs.com/yangzhaon/p/10815606.html

时间: 2024-08-22 04:27:45

python网络编程(通过tcp或者udp协议通信)的相关文章

Python网络编程—(TCP、UDP区别)

tcp套接字和udp套接字编程区别 1.流式套接字是以字节流方式传输数据,数据报套接字以数据报形式传输 2.tcp套接字会有粘包,udp套接字有消息边界不会粘包 3.tcp套接字保证消息的完整性,udp套接字则不能 4.tcp套接字依赖listen accept建立连接才能收发消息,udp套接字则不需要 5.tcp套接字使用send,recv收发消息,udp套接字使用sendto,recvfrom 原文地址:https://www.cnblogs.com/maplethefox/p/109890

python网络编程实现TCP和UDP连接

实现TCP #!/usr/bin/env python3 # -*- coding: utf-8 -*- import socket # 创建一个socket: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 建立连接: s.connect(('www.sina.com.cn', 80)) # 发送数据: s.send(b'GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection:

2015/12/14 Python网络编程,TCP/IP客户端和服务器初探

一直不是很清楚服务器的定义,对于什么是服务器/客户端架构也只有一个模糊的感觉.最近开始学习,才明白一些什么服务器和客户端的关系. 所谓的服务器,就是提供服务的东西,它是一个硬件或者软件,可以向一个或者多个客户端提供所需要的服务.它存在的目的就是等待客户的请求,然后给客户服务,再接着等待请求. 而客户端,就来连上一个服务器,提出自己的请求,然后等待获得反馈. 比如说,打印机就是一个服务器的例子,与之相连的计算机就是客户端,通过网络连接打印机后,给它提出服务需求(打印)和传输数据(传输内容),然后打

python socket编程 ,tcp,udp服务端客户端创建

转自http://blog.csdn.net/rebelqsp/article/details/22109925 Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发. 下面讲的是Socket模块功能 1.Socket 类型 套接字格式: socket(family,type[,protocal]) 使用给定的地址族.套接字类型.协议编号

android 网络编程--socket tcp/ip udp http之间的关系

网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层,一般编程人员接触最多的就是应用层和运输层,再往下的就是所谓的媒体层了,不是我们研究的对象. 下面是应用层.运输层,网络层.链路层通信协议概图.我们经常接触到的一般是: http协议:应用层协议,并且http协议是基于tcp连接的,主要解决的是如何包装协议的 tcp协议:运输层协议,通常也叫做tcp/ip协议,主要解决数据如何在网络中传输 udp协议:运输层协议,用户数据报协议,不可靠的协议,只负责把应用层的协议的数

java基础增强:网络编程、Tcp、Udp案例

一入编程深似海,从此妹子是路人. 1.Udp的客户端,服务端-----DatagramSocket 通过Udp协议编写一个群聊室,具体实现代码如下: package day.by.day.udp.charroom; //客户端代码 import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import j

网络编程[第二篇]基于udp协议的套接字编程

udp协议下的套接字编程 一.udp是无链接的    不可靠的 而上篇的tcp协议是可靠的,会有反馈信息来确认信息交换的完成与否 基于udp协议写成的服务端与客户端,各司其职,不管对方是否接收到信息,只需自己发送了即可 二.客户端 import socket #买手机 -- 套接字家族 | 端口协议 phone = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #服务端地址 ip_port = ('127.0.0.1',8001) #实现多次发送

[javaSE] 网络编程(TCP,UDP,Socket特点)

UDP特点: 面向无连接,把数据打包发过去,收不收得到我不管 数据大小有限制,一次不能超过64k,可以分成多个包 这是个不可靠的协议 速度很快 视频直播,凌波客户端,feiQ都是UDP协议 TCP特点: 面向连接,对方必须在 三次握手完成连接,我:在吗:你:我在:我:我知道了 大数据量传输 速度稍慢 Socket: Socket就是网络服务提供的一种机制 通信两段都要Socket 网络通信其实就是Socket间的通信 数据在两个Socket间通过IO传输

socket编程及tcp、UDP协议

1.TCP UDP区别: TCP有点:可靠,稳定,TCP可靠提现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传输时,有确认.窗口.重传.拥塞控制机制,在数据传完后,还会断开连接来节约系统资源. TCP缺点:慢.效率低.占用系统资源高,易呗攻击,TCP在传递数据之前,要先建立连接,这会消耗时间,而且在数据传输时,确认机制.重传机制.拥塞机制等都会消耗大量的时间,而且要再每台设备上维护所有的传输连接,事实上,每个连接都会占用系统的CPU,内存等硬件资源,而且,因为TCP有确认机制,这些