当前位置: 首页 > article >正文

python的socket模块以及通信相关学习笔记

Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯(最初设计是为了是使同一台计算机中的不同进程进行信息传递通信),最后拓展到可以使网络上两台计算机的不同程序进行数据信息传递

在这里插入图片描述

服务端接口代码流程以及参数介绍

# 服务端代码流程介绍

# 导入模块
import socket

# 1.创建 socket 对象 设置通信方式
# tcp方式通信,流式通信可靠,持续传输且互相确认,所谓三次握手四次挥手就是说的tcp,成功不成功可感知,不易丢包,但是占用资源多
tcp_socket_obj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# udp方式通信,包式通信可靠性不佳,直接将信息打包成整体一次性发送,成功不成功无法感知,易丢包,但是占用资源少
udp_socket_obj = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# family: 套接字家族可以使 AF_UNIX 或者 AF_INET。
# type: 套接字类型可以根据是面向连接的还是非连接(tcp/udp)分为 SOCK_STREAM 或 SOCK_DGRAM。
# protocol: 一般不填默认为 0。



# 2.bind主机的ip和端口到套接字(服务端的话就是自己的ip和自己设定的通信进程程序所用的端口,客户端的话就是服务器端的ip和设定的端口)
# bind():这个函数由服务端Socket调用,会将之前创建Socker与指定的IP地址和端口进行绑定。如果之前使用了AF_INET初始化Socket,那么这里可以使用元组(host, port) 的形式表示地址。
#

# 3.s.listen()  #开始TCP监听
# listen():这个函数用于在使用TCP的服务端开启监听模式。这个函数可以使用个参数来指定可以挂起的最大连接数量。这个参数的值最小为1,一般设置为5。
#

# 4.s.accept()  #被动接受TCP客户的连接,(阻塞式)等待连接的到来
# accept():这个函数用于在使用TCP的服务端接收连接,一般是阻塞态。接受TCP连接并返回(conn,adresse), 其中,conn 是新的套接字对象,可以用来接收和发送数据; address是连接客户端的地址。
# 需要注意,当客户端不与服务端连接的话,程序会在此接口处阻塞不会往下走,除非有客户端连接到服务端

服务端代码样例

import socket               # 导入 socket 模块
 
s = socket.socket()         # 创建 socket 对象
host = socket.gethostname() # 获取本地主机名               # 设置端口
s.bind((host_ip, port))        # 绑定端口
 
s.listen(5)                 # 等待客户端连接
while True:
    c,addr = s.accept()     # 建立客户端连接
    print("来自后面所示主机的连接已建立", addr)
    # 接收消息
    client_msg=conn.recv(1024) # 收消息
    print(client_msg.decode("utf-8"))
    # 发送消息 网络传输的是二进制的对象
    c.send('欢迎访问服务端'.encode("utf-8"))
    # conn.sendall("Hello! A_dmin!!".encoding="utf-8")
    c.close()                # 关闭连接

s.bind() #绑定(主机,端口号)到套接字
s.listen() #开始TCP监听
s.accept() #被动接受TCP客户的连接,(阻塞式)等待连接的到来
s.connect() #主动初始化TCP服务器连接
s.connect_ex() #connect()函数的扩展版本,出错时返回出错码,而不是抛出异常
s.recv() #接收TCP数据
s.send() #发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
s.sendall() #发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
s.recvfrom() #接收UDP数据
s.sendto() #发送UDP数据
s.getpeername() #连接到当前套接字的远端的地址
s.getsockname() #当前套接字的地址
s.getsockopt() #返回指定套接字的参数
s.setsockopt() #设置指定套接字的参数
s.close() #关闭套接字

客户端代码样例

import socket

# 创建tcp,stocket对象
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

# 连接服务端
phone.connect((host_ip, port))

# 给服务端发消息
phone.send('hello'.encode('utf-8'))

# 接受消息
back_msg=phone.recv(1024)
print(back_msg)
phone.close()

参考博客链接


http://www.kler.cn/news/136586.html

相关文章:

  • ubuntu 安装haproxy
  • 函数的力量:掌握C语言的基石
  • 人工智能算法之双倍体遗传算法(DGA)
  • C# 委托简述
  • Nest.js 实战 (十五):前后端分离项目部署的最佳实践
  • LeetCode题解:2357. 使数组中所有元素都等于零,排序,详细注释
  • c语言遇到的常见问题及解决方案
  • Leetcode—5.最长回文子串【中等】
  • 印刷企业实施MES管理系统需要哪些硬件设施
  • 第八部分:JSP
  • gitlab环境准备
  • Windows本地搭建rtmp推流服务
  • ROS参数服务器(Param):通信模型、Hello World与拓展
  • ros2工作空间
  • CentOS7安装部署Kafka with KRaft
  • react重要知识点(面经)
  • 图像分割方法
  • Redis常用的八种场景
  • Java Enumeration 接口
  • Spark---介绍及安装
  • 【LeetCode:2216. 美化数组的最少删除数 | 贪心】
  • 【opencv】debug报错HEAP CORRUPTION DETECTED
  • ChatGPT + DALL·E 3
  • 【Java】volatile-内存可见性问题
  • 云原生周刊:Istio 1.20.0 发布 | 2023.11.20
  • 图的基础知识(数据结构)