网络编程(四)——基于udp协议的套接字socket、socketserver模块的使用

基于udp协议的套接字、socketserver模块

一、UDP协议(数据报协议)

1、何为udp协议

不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包。

以太网头 ip头                      udp头                            数据                                           

tcp协议(流式协议)

2、udp协议的特点

(1)传输数据以数据报的形式传送。因为数据以数据包的形式发送,所以没发送一次就会接收一次

from socket import *

server=socket(AF_INET,SOCK_DGRAM)
server.bind((‘127.0.0.1‘,8081))

print(server.recvfrom(1024))
print(server.recvfrom(1024))
print(server.recvfrom(1024))

# (b‘hello‘, (‘127.0.0.1‘, 56816))
# (b‘world‘, (‘127.0.0.1‘, 56816))
# (b‘sdfas‘, (‘127.0.0.1‘, 56816))

服务端

from socket import *

client=socket(AF_INET,SOCK_DGRAM)

client.sendto(b‘hello‘,(‘127.0.0.1‘,8888))
client.sendto(b‘world‘,(‘127.0.0.1‘,8888))
client.sendto(b‘sdfas‘,(‘127.0.0.1‘,8888))

客户端

(2)客户端只管发送数据,不管服务端给不给回复,所以是一种不可靠的协议

二、基于udp协议的套接字

udp是无链接的,先启动哪一端都不会报错

from socket import *

# 1.创建套接字对象
server = socket(AF_INET, SOCK_DGRAM)

# 2.绑定服务器IP地址和端口号
server.bind((‘127.0.0.1‘, 8888))

# 3.收发消息
while True:
    data, cli_addr = server.recvfrom(1024)              # 收到的是数据和客户端地址
    print(data)
    server.sendto(data.upper(), cli_addr)           # 发送消息,根据客户端地址发送消息

server.close()

服务端

from socket import *

# 1.创建套接字对象
server = socket(AF_INET, SOCK_DGRAM)

# 2.发收消息
while True:
    client.sendto(‘hello‘.encode(‘utf-8‘), (‘127.0.0.1‘, 8888))       # 根据地址发送消息
    data, ser_addr = client.recvfrom(1024)                   # 收消息,获得服务端的消息和地址
    print(data)

客户端

三、socketserver模块

1、作用

利用socketserver模块可以实现并发

2、基于TCP协议的并发

自定义类中:

  1. self.request  即一个套接字对象
  2. self.client_address  即客户端地址
# 服务端import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        while True:   # 通信循环
            try:
                data = self.request.recv(1024)
                print(data.decode(‘utf-8‘))
                self.request.send(data.upper())
            except ConnectionResetError:
                break

if __name__ == ‘__main__‘:
    server = socketserver.ThreadingTCPServer((‘127.0.0.1‘, 8888), MyTCPHandler)
    server.serve_forever()   # 链接循环
# 客户端from socket import *

cli_socket = socket(AF_INET, SOCK_STREAM)

cli_socket.connect((‘127.0.0.1‘, 8888))

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

cli_socket.close()

3、基于UDP协议的并发

自定义类中:

  1. self.request是一个元组(第一个元素是客户端发来的数据,第二部分是服务端的udp套接字对象),如(b‘adsf‘, <socket.socket fd=200, family=AddressFamily.AF_INET, type=SocketKind.SOCK_DGRAM, proto=0, laddr=(‘127.0.0.1‘, 8080)>)
  2. self.client_address即客户端地址
# 服务端
import socketserver

class MyUDPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        while True:  # 通信循环
            print(self.request) # (b‘hello‘, <socket.socket fd=216, family=AddressFamily.AF_INET, type=SocketKind.SOCK_DGRAM, proto=0, laddr=(‘127.0.0.1‘, 8888)>)
            data, sock = self.request
            sock.sendto(data.upper(), self.client_address)

if __name__ == ‘__main__‘:
    server = socketserver.ThreadingUDPServer((‘127.0.0.1‘, 8888), MyUDPHandler)
    server.serve_forever()  # 链接循环
#客户端
from socket import *

cli_socket = socket(AF_INET, SOCK_STREAM)

while True:
    cli_socket.sendto(‘hello‘.encode(‘utf-8‘), (‘127.0.0.1‘, 8888))
    data, server_addr = cli_socket.recvfrom(1024)
    print(data.decode(‘utf-8‘))

cli_socket.close()

原文地址:https://www.cnblogs.com/linagcheng/p/9584998.html

时间: 2024-10-06 19:01:05

网络编程(四)——基于udp协议的套接字socket、socketserver模块的使用的相关文章

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

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

java学习--基础知识进阶第十二天--网络编程概述、UDP协议、TCP协议

今日内容介绍 u  网络编程概述 u  UDP u  TCP 第1章 网络编程概述 1.1 网络协议 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样.在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传输格式.传输速率.传输步骤等做了统一规定,通信双方必须同时遵守才能完成数据交换. 网络通信协议有很多种,目前应用最广泛的是TCP/IP协议(Transmission Contro

Python网络编程02/基于TCP协议的socket简单的通信

目录 Python网络编程02/基于TCP协议的socket简单的通信 1.昨日内容回顾 2.socket 2.1 socket套接字 2.2 基于TCP协议的socket简单通信 Python网络编程02/基于TCP协议的socket简单的通信 1.昨日内容回顾 1.单播:单独联系某一个人 2.广播:给所有人发送消息(群发) 3.比特流:bit就是0101跟水流一样的源源不断的发送01010101 4.以太网协议:将数据进行分组:一组称之为一帧,数据报 head|data head:18字节:

【Java】Java网络编程菜鸟进阶:TCP和套接字入门

Java网络编程菜鸟进阶:TCP和套接字入门 JDK 提供了对 TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Datagram Protocol,用户数据报协议)这两个数据传输协议的支持.本文开始探讨 TCP. TCP 基础知识 在“服务器-客户端”这种架构中,服务器和客户端各自维护一个端点,两个端点需要通过网络进行数据交换.TCP 为这种需求提供了一种可靠的流式连接,流式的意思是传出和收到的数据都是连续的字节,没有对数据量进行大小限制.

什么是 socket?简述基于 tcp 协议的套接字通信流程?

Socket的英文原义是"孔"或"插座".通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄, 可以用来实现不同虚拟机或不同计算机之间的通信. 在Internet上的主机一般运行了多个服务软件,同时提供几种服务.每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务. 基于tcp 协议的套接字通信流程: 1). 服务器先用 socket 函数来建立一个套接字,用这个套接字完成通信的监听. 2). 用 bind

网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服务器进程B1同时为客户进程A1.A2和B2提供服务. Socket概述 ①   所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过“套接字”向网络发出请求或者应答网络请求. ②   Socket是连接运行在网络上的两个程序间的双向通信的端点. ③  

网络编程之基于UDP协议套接字

1.UDP协议介绍(数据报协议) UDP协议不同于TCP,通信时,它不需要事先建立双向链接,并且不区分客户端先启动还是服务端前起,工作原理:基于udp协议传输的信息,协议会将数据自动加上自定义的报头,这样每一个数据都是一个数据报,而流失协议由于自身优化算法,产生粘包现象,udp不会产生粘包现象,并且发出的消息可以为空,因为就算你发的是空消息,协议也会给你的空消息加上一段自定义报头,所以它还是一个数据报,而tcp协议在这里则不能发空消息,一旦发空消息,接收方会一直处于收的状态,发送方发完空后会一直

Linux网络编程:基于UDP的程序开发回顾篇

基于无连接的UDP程序设计 同样,在开发基于UDP的应用程序时,其主要流程如下: 对于面向无连接的UDP应用程序在开发过程中服务端和客户端的操作流程基本差不多.对比面向连接的TCP程序,服务端少了listen和accept函数.前面我们也说过listen函数最主要的作用就是将一个socket套接字描述符转为被动监听模式,然后调用accept主要是用于等待客户端(用connect)来连接服务器.connect函数不仅可以用于流式套接字还可用于数据报式套接字.在TCP中,客户端调用connect函数

【Java网络编程】基于UDP的聊天通信

使用udp协议,写一个基于命令行的聊天软件:客户端跟服务端分别在命令行启动之后,客户端和服务器端可以互相发送数据. 一.创建线程 sendThread 和receiveThread 1 package com.fhcq.chat; 2 3 //双工的聊天程序 4 //可以发送数据,同时也可以等待接收数据 5 //需要使用多线程来实现 6 7 public class QICQDemo { 8 9 public static void main(String[] args) { 10 // TOD