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

1.UDP协议介绍(数据报协议)

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

  为什么说udp协议是不可靠而tcp是可靠的呢?这里面试可能会被问到,答案没你想得那么简单(因为tcp是基于双向链接而udp没有基于链接,数据发出去就行了~~~这么回答估计你这次面试也就GG了,背后的真正的原理:):首先必须搞清楚一个大的原理,应用程序收发消息都是跟谁打交道的???——没错是应用程序自身所在的操作系统,知道这一点之后,再来说,为什么tcp协议可靠,原因在于服务端向客户端发出数据(这里的数据也是先流到服务端的操作系统内存由服务端操作系统向客户端发)后,客户端必须向服务端发出确认消息,而服务端发出的数据,操作系统不会立即将内存中的数据立马清除,而是会等到确认消息后,才会清理数据内存,这个时候的数据才是无用的,如果没有收到确认信息,服务端隔断时间会再向客户端发送内存里存好的数据,这才是tcp协议通信的可靠的本质,

  反观udp则比较随性了,发送端将数据写好点击发送后,数据会被加上自定义报头然后由操作系统发出,发出后立马清除数据内存,要想用udp有效的传输数据,最大数据传输范围应该控制在512bytes,数据量超过这个限制,就无法再保证数据传输的稳定性了。

2.tcp协议完整代码逻辑

import socket

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

while True:
    msg=input(‘>>>: ‘).strip()
    if not msg:continue
    client.send(msg.encode(‘utf-8‘))
    data=client.recv(1024)
    print(data.decode(‘utf-8‘))

client.close()

客户端

import socket

server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind((‘127.0.0.1‘,8080))
server.listen(5)

while True:
    conn,client_addr=server.accept()
    print(client_addr)

    while True:
        try:
            data=conn.recv(1024)
            if not data:break # 针对linux系统
            conn.send(data.upper())
        except ConnectionResetError:
            break
    conn.close()

server.close()

服务端

3.udp协议代码

客户端:

import socket

client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 数据报协议

while True:
    msg=input(‘>>>: ‘).strip()
    client.sendto(msg.encode(‘utf-8‘),(‘127.0.0.1‘,8080))
    res,server_addr=client.recvfrom(1024)
    print(res.decode(‘utf-8‘))

服务端:

import socket

server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 数据报协议
server.bind((‘127.0.0.1‘,8080))

while True:
    client_data,client_addr=server.recvfrom(1024)
    msg=input(‘回复%s:%s>>>:‘ %(client_addr[0],client_addr[1]))
    server.sendto(msg.encode(‘utf-8‘),client_addr)

4.基于udp写实现网络沟通交流(建议版本qq)

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

while True:
    data,client_addr=server.recvfrom(1024)
    print(‘get a message form %s:%s>>:%s‘%(client_addr[0],client_addr[1],data.decode(‘utf-8‘)))
    msg=input(‘please recall>>:‘).strip()
    server.sendto(msg.encode(‘utf-8‘),client_addr)
import socket
client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

while True:
    msg=input(‘what are you want to talk>>:‘).strip()
    if not msg:continue
    client.sendto(msg.encode(‘utf-8‘),(‘127.0.0.1‘,8808))
    msg,addr=client.recvfrom(1024)
    print(‘get a message from %s:%s>>:%s‘%(addr[0],addr[1],msg.decode(‘utf-8‘)))

5.基于udp协议编写时间服务器(访问就给你放回当前时间)

服务端

import socket,time
server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
server.bind((‘127.0.0.1‘,8808))

while True:
    data,client_addr=server.recvfrom(1024)
    if not data:
        time_list=time.strftime(‘%Y-%m-%d %X‘)
    else:
        time_list=time.strftime(data.decode(‘utf-8‘))
    server.sendto(time_list.encode(‘utf-8‘),client_addr)

访问端

import socket
client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

while True:
    msg=input(‘please input the format of time which are you want get>>:‘).strip()
    client.sendto(msg.encode(‘utf-8‘),(‘127.0.0.1‘,8808))
    data,addr=client.recvfrom(1024)
    print(‘time>>:%s‘%data.decode(‘utf-8‘))

原文地址:https://www.cnblogs.com/Dominic-Ji/p/8920377.html

时间: 2024-10-13 06:19:49

网络编程之基于UDP协议套接字的相关文章

《网络编程》基本 UDP 套接字编程

在前面文章中介绍了<UDP 协议>和<套接字数据传输>.UDP 协议和 TCP 协议不同,它是一种面向无连接.不可靠的传输层协议.在基于 UDP 套接字编程中,数据传输可用函数 sendto 和 recvfrom.以下是基本 UDP 套接字编程过程: sendto 与 recvfrom 函数 这两个函数的功能类似于 write 和 read 函数,可用无连接的套接字编程.其定义如下: /* 函数功能:发送数据: * 返回值:若成功则返回已发送的字节数,若出错则返回-1: * 函数原

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

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

《网络编程》基于 TCP 套接字编程的分析

本节围绕着基于 TCP 套接字编程实现的客户端和服务器进行分析,首先给出一个简单的客户端和服务器模式的基于 TCP 套接字的编程实现,然后针对实现过程中所出现的问题逐步解决.有关基于 TCP 套接字的编程过程可参考文章<基本 TCP 套接字编程>.该编程实现的功能如下: (1)客户端从标准输入读取文本,并发送给服务器: (2)服务器从网络输入读取该文本,并回射给客户端: (3)客户端从网络读取由服务器回射的文本,并通过标准输出回显到终端: 简单实现流图如下:注:画图过程通信双方是单独的箭头,只

《网络编程》高级 UDP 套接字编程

概述 UDP 是一个无连接.不可靠的数据报协议,任何可靠传输都需由应用程序提供,例如:超时重传.序列号应答机制,但是它在某些场合使用效率高,方便.它支持广播和多播.有关<基本 UDP 套接字编程>参照该文,这里只是在那个基础上,记录一些在 UDP 编程中容易出现的问题. 辅助数据 辅助数据(也称为控制信息)可通过调用 recvmsg 和 sendmsg 函数使用,这里两个函数的定义可参考文章<高级 I/O>,使用 msghdr 结构体中的 msg_control 和 msg_con

【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

Socket网络编程TCP、UDP示例

Socket网络编程: 1) OSI(了解): 国际标准化组织ISO(International Orgnization for Standardization)指定了网络通信的模型:开放系统互联(OSI,Open System Interconnection),把网络通信工作分为七层:物理层(最底层)-数据链路层-网络层-传输层-会话层-表示层-应用层(应用程序) 数据格式 功能与连接方式 典型设备 应用层 网络服务与使用者应用程序间的一个接口 表示层 数据表示.数据安全.数据压缩 会话层 建

Socket网络编程TCP、UDP演示样例

Socket网络编程: 1) OSI(了解): 国际标准化组织ISO(International Orgnization for Standardization)指定了网络通信的模型:开放系统互联(OSI,Open System Interconnection),把网络通信工作分为七层:物理层(最底层)-数据链路层-网络层-传输层-会话层-表示层-应用层(应用程序) 数据格式 功能与连接方式 典型设备 应用层 网络服务与使用者应用程序间的一个接口 表示层 数据表示.数据安全.数据压缩 会话层 建

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字节:

Unix网络编程之基本TCP套接字编程(上)

TCP客户/服务器实例 服务器程序 #include "unp.h" int main(int argc, char **argv) { int listenfd, connfd; pid_t childpid; socklen_t clilen; struct sockaddr_in cliaddr, servaddr; listenfd = Socket(AF_INET, SOCK_STREAM, 0); //1 bzero(&servaddr, sizeof(servad