基于tcp和udp协议的套接字
socket:是在应用层和传输层之间的一个抽象层,它把TCP/IP层的复杂的操作封装抽象,并提供一些接口供应用层调用
套接字:被设计用于同一台主机上多个应用程序之间的通信,被称为进程之间通信或IPC
基于文件类型的套接字:AF_UNIX
UNIX一切皆文件,基于文件的套接字调用的就是底层文件系统来抓取数据,两个套接字进程运行在同一机器
可以访问同一文件系统间接完成通信
基于网络类型的套接字:AF_INET
套接字工作流程


套接字工作流程:服务端先初始化socket(),然后与端口进行绑定bind(),对端口监听listen(),调用accept()阻塞,
直到等到客户端连接,这时如果客户端初始化一个socket(),然后连接服务器connect(),如果连接成功,则客户端和服务端建立连接。
客户端发送请求,服务端接收请求并处理请求,然后把处理的数据回复给客户端,客户读取数据,最后关闭连接,交互结束
基于tcp协议的套接字:tcp是基于链接的,必须先启动服务端,再启动客户端
#服务端
import socket ip_port = ("127.0.0.1", 8000)
back_log = 5
buffer_size = 1024 phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 参数分别为(基于网络通讯,TCP协议),表示基于TCP协议的网络通讯
phone.bind(ip_port) # 参数为IP地址和端口号,以元组的形式放进参数里,且IP地址是字符串
phone.listen(back_log) # 表示当前可以有几个链接
print("--->")
while True: #设定循环,可以接收多个链接
conn, addr = phone.accept( ) # 等待客户端信息,得到两个数据,一个是(对方的链接,一个是对方的通讯地址),元组形式 while True: #循环,服务端和客户端能循环多次的传输数据
try: #客户端断开链接时,服务端也会断开链接,这时循环时就会出现异常,需要处理异常
data = conn.recv(buffer_size) # 接收客户端信息,参数代表可以接收多少字节,得到的是二进制形式的数据
print("接到客户端信息:", data.decode("utf-8"))
conn.send(data.upper( )) # 向客户端回传信息
except Exception:
break
conn.close() phone.close()
#客户端
import socket
ip_port = ("127.0.0.1",8000)
back_log = 5
buffer_size = 1024 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.connect(ip_port) #链接服务端 while True:
msg = input(">>>")
if not msg:continue #输入为空时,可以send到自己的缓存中,但os不会将空发给硬件,对方便recv不到数据
phone.send(msg.encode("utf-8")) #向服务端传内容,传输的是二进制格式
data = phone.recv(buffer_size) #获取服务端传回的内容
print("收到服务端发来的消息:",data) phone.close()
补充1:
应用程序和os都是先加载到缓存再使用,所有操作都是对缓存读取和传输数据,只有os才可以操作硬件
应用程序将数据send到缓存中,然后由os操作传给硬件,再进行网络传输,对方在recv到(recv也是从缓存中recv数据)
如果send的数据为空,可以send到自己的缓存中,但recv不到空
补充2:
对于服务端来说,客户端断开链接,服务端accept不到链接,就会出现异常,程序就会停止,可以加个异常处理
补充3:
有时重启服务端时会出现异常:address already in use,这是断开链接时进入四次挥手,但time_wait状态在占用地址
可以加一个socket配置,重用IP和端口
在phone.bind()前加一个phone.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
基于udp协议的套接字:udp是无链接传输,先启动哪边都不会报错,可以实现并发,同时与多个客户端通讯
from socket import * #将socket下的所有属性都导入过来,这样可以直接使用属性
ip_port = ("127.0.0.1",8080)
buffer_size = 1024
udp_server = socket(AF_INET,SOCK_DGRAM) #DGRAM表示数据报式套接字
udp_server.bind(ip_port)
while True:
data,addr = udp_server.recvfrom(buffer_size) #接收到客户端发过来是数据加客户端的IP和端口
print(data,addr)
udp_server.sendto(data.upper(),addr) #无链接需要指定客户端的IP和端口
from socket import *
ip_port = ("127.0.0.1",8080)
buffer_size = 1024
udp_client = socket(AF_INET,SOCK_DGRAM)
while True:
msg = input(">>")
udp_client.sendto(msg.encode("utf-8"),ip_port) #sendto需要指定发送到哪个IP和端口
data,addr = udp_client.recvfrom(buffer_size)
print(data.decode("utf-8"))
udp_client.close()
补充1:
udp协议send一个空,依然可以fevcfrom到一个空
基于tcp和udp协议的套接字的更多相关文章
- 网络编程----socket介绍、基于tcp协议的套接字实现、基于udp协议的套接字实现
一.客户端/服务器架构(C/S架构) 即C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架 ...
- 基于tcp/udp协议的套接字通信
目录 一.套接字分类 二.套接字的工作流程 三.基于tcp协议的套接字 四.基于udp协议的套接字 一.套接字分类 1.基于文件类型的套接字家族:AF_UNIX 2.基于网络类型的套接字家族:AF_I ...
- 网络编程(基于udp协议的套接字/socketserver模块/进程简介)
一.基于UDP协议的套接字 TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据.相对TCP,UDP则是面向无连接的协议. 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就 ...
- 基于udp协议的套接字及udp协议粘包问题
udp协议的套接字 udp协议传输 服务端和客户端没有建立连接一说. import socket # 总结一下基础工作流程:服务端生成套接字并绑定ip_port,进入数据传输循环,服务端接受客户端发 ...
- 网络编程基础:粘包现象、基于UDP协议的套接字
粘包现象: 如上篇博客中最后的示例,客户端有个 phone.recv(2014) , 当服务端发送给客户端的数据大于1024个字节时, 多于1024的数据就会残留在管道中,下次客户端再给服务端发命令时 ...
- 网络编程(四)--基于udp协议的套接字、socketserver模块
一.UDP协议(数据报协议) 1.何为udp协议 不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包. 以太网头 ip头 ...
- 网络编程之基于UDP协议的套接字编程、基于socketserver实现并发的socket
目录 基于UDP协议的套接字编程 UDP套接字简单示例 服务端 客户端 基于socketserver实现并发的socket 基于TCP协议 server类 request类 继承关系 服务端 客户端1 ...
- 网络编程[第二篇]基于udp协议的套接字编程
udp协议下的套接字编程 一.udp是无链接的 不可靠的 而上篇的tcp协议是可靠的,会有反馈信息来确认信息交换的完成与否 基于udp协议写成的服务端与客户端,各司其职,不管对方是否接收到信息, ...
- 网络编程(四)——基于udp协议的套接字socket、socketserver模块的使用
基于udp协议的套接字.socketserver模块 一.UDP协议(数据报协议) 1.何为udp协议 不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包. ...
随机推荐
- java生成二维码的几种方式
1: 使用SwetakeQRCode在Java项目中生成二维码 http://swetake.com/qr/ 下载地址 或着http://sourceforge.jp/projects/qrcode/ ...
- Linux下服务器开发的必要准备
一.Windows下安装Xshell 二.Linux开启SSH 可以先查询有没有SSH服务 sudo ps -e |grep ssh 没有安装SSH的服务器 sudo apt-get install ...
- Word2Vec模型参数 详解
用gensim函数库训练Word2Vec模型有很多配置参数.这里对gensim文档的Word2Vec函数的参数说明进行翻译,以便不时之需. class gensim.models.word2vec.W ...
- 使用collection查询集合属性
介绍resultMap中使用collection查询集合属性 业务需求,查询部门中的多个人员 public class Department { private Integer id; private ...
- Hybrid平台
需求说明 离线包管理平台主要负责对需要接入Hybrid平台的应用进行管理,通过这个平台可以实现对应用的静态资源进行构建.发布.生成离线包,版本控制等,核心场景如下: 将需要做预加载的应用在平台上注册, ...
- 九、设置RF自定义的日志输出路径
在Arguments输入-d E:\\robot,每次运行完都会发送该目录日志
- hdu 4758 (AC自动机)
除了走到哪里,还要加状态表示当前节点和已经匹配的串 #include<iostream> #include<cstdio> #include<string> #in ...
- Jmeter之循环控制器
在使用Jmeter测试时,部分接口需要循环执行多次,这时候就可以使用循环控制器去控制执行. 循环控制器如下图: 说明 : (1.名称:标识,建议明确此循环控制器的使用的作用是什么(如:登录循环控制) ...
- k8s集群上线web静态网站
环境准备 一台部署节点,一台master节点,还有两台节点node1,node2 完好的k8s集群环境 思路1: 在node1和node2节点上通过宿主机与容器之间目录映射和端口映射上线静态网站(或动 ...
- mybatis参数传参、取值处理等
单个参数:mybatis不会做特殊处理 取值方式:#{参数名} 这里参数名不必与方法的形参名称一致,可以用任意参数名来接受实参 例子:方法:update(Integer id) sql映射文件取值#{ ...