首页 > 其他分享 >socket 模块

socket 模块

时间:2022-11-16 16:58:07浏览次数:39  
标签:socket utf8 sock server 模块 data 服务端

socket 模块

我们知道基于网络编写程序时,需要使用 OSI七层协议里的七层,每一层都要写。很复杂很繁琐。
socket 模块相当于集成了这一块,封装了复杂的接口提空了简单快捷的接口。	

socket套接字简介

	基于文件类型的套接字家族(单机)
  	AF_UNIX
  基于网络类型的套接字家族(联网)
  	AF_INET

代码实操

cs架构的软件都应该考虑到服务端,因为只有有了服务场所,才能提供服务

# 1.产生一个socket对象并指定采用的通信版本和协议(TCP)
server = socket.socket()  # 括号内不写参数 默认就是TCP协议  family=AF_INET基于网络的套接字 type=SOCK_STREAM流式协议即TCP
# 2.绑定一个固定的地址(服务端必备的条件)
server.bind(('127.0.0.1', 8080))  # 127.0.0.1为本地回环地址 只有自己的电脑可以访问
# 3.设立半连接池(暂且忽略)
server.listen(5)
# 4.等待接客
sock, addr = server.accept()  # return sock, addr  三次握手 建立链接
print(sock, addr)  # sock就是双向通道 addr就是客户端地址
# 5.服务客人
data = sock.recv(1024)  # 接收客户端发送过来的消息 1024字节
print(data.decode('utf8'))
sock.send('滚开我不开心'.encode('utf8'))  # 给客户端发送消息 注意消息必须是bytes类型
# 6.关闭双向通道
sock.close()  # 四次挥手  关闭链接
# 7.关闭服务端
server.close()  


# 客户端
import socket


# 1.生成socket对象指定类型和协议
client = socket.socket()
# 2.通过服务端的地址链接服务端
client.connect(('127.0.0.1', 8080))
# 3.直接给服务端发送消息
client.send('今天你吃饭了吗'.encode('utf8'))
# 4.接收服务端发送过来的消息
date = client.recv(1024)
print(date.decode('utf8'))
# 5.断开与服务端的链接
client.close()

数据交互循环

# 1.解决信息固定的问题
    利用input获取用户输入
# 2.解决通信循环的问题
    将双方用于数据交互的代码循环起来
    
 # 服务端
while True:
    data = sock.recv(1024)  # 获取别人说的什么
    print(data.decode('utf8'))  # 解码别人说的啥
    msg = input('请回复>>>:').strip()
    sock.send(msg.encode('utf8'))  # 回复别人的话,因为基于网络传输,使用二进制编码

    
# 客户端
while True:
    msg = input('请输入你要发送的信息>>>:').strip()
    client.send(msg.encode('utf8'))  # 给服务端发送信息
    data = client.recv(1024)  # 接收服务端回复消息
    print(data.decode('utf8'))

代码优化

1、发送信息不能为空
  统计长度然后进行判断(len)
    
2、苹果电脑 反复重启服务端可能会发生报错: address in use
 解决方法:
# 在最上面放一个
 from socket import SOL_SOCKET,SO_REUSEADDR
# 在bind上面放
 server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
    

    
 当客户端异常断开的情况下 如何让服务端继续服务其他客人
"""
  如果在windows客户端异常处理退出之后服务端就会直接报错,直接加上异常处理 break结束退出内循环 跳到外循环 接待另一个客人
  处理方式: 异常处理 """
  while True:
  	sock, addr = server.accept() 
    try:
       	data = sock.recv(1024)  # 获取别人说的什么 
        print(data.decode('utf8'))  # 解码别人说的啥
        msg = input('请回复>>>:').strip()
        sock.send(msg.encode('utf8'))  # 回复别人的话,因为基于网络传输,使用二进制编码
    except Exception:
        break
 """ 
 如果是mac或linux服务端,就会接收到一个空的信息
 处理方式: len判断 """
 while True:
  	sock, addr = server.accept() 
    try:
       	data = sock.recv(1024)  # 获取别人说的什么 
       	if data(len) == 0:
       		break
        print(data.decode('utf8'))  # 解码别人说的啥
        msg = input('请回复>>>:').strip()
        sock.send(msg.encode('utf8'))  # 回复别人的话,因为基于网络传输,使用二进制编码
    except Exception:
        break

半连接池

listen(5)
py文件默认只能同时只能运行一次,如果想要单独分开运行多次:
Edit Configuration选择all

# 半连接池
  设置最大等待人数 >>>:  节省资源,提升效率

标签:socket,utf8,sock,server,模块,data,服务端
From: https://www.cnblogs.com/LiaJi/p/16896480.html

相关文章

  • 传输层之TCP与UDP协议、socket
    目录传输层之TCP与UDP协议应用层socket模块Socket通信socket代码简介代码优化半连接池的概念传输层之TCP与UDP协议TCP与UDP都是用来规定通信方式的ps:不遵循上述协议也......
  • 关于 WebSocket 和 HTTP 区别的思考以及一个最简单的 WebSocket 的客户端和服务器实现
    笔者之前与一位同事研究了Cypress的visit方法,其源码实现最终是调用了WebSocket向visit参数里指定的website通行并获取数据,见下图变量ev.data的值。我这位同......
  • Excel VBA模块隐藏和工程不可查看 比密码保护强
    VBA代码助手下载地址视频演示本功能可把VBA模块隐藏且不影响VBA代码运行用户不可查看VBA代码以及设置为VBA工程不可查看用户不能进入VBA代码区打开模块隐藏窗口隐藏......
  • 模块
    8.模块1、    2、       3、      4、    5、     6、   7、     8、   ......
  • socket模块简介
    今日内容概要传输层只TCP与UDP协议应用层socket模块简介socket模块基本使用代码优化处理半连接池的概念今日内容详细传输层只TCP与UDP协议TCP与UDP都是用来......
  • socket
    目录今日内容概要今日内容详细传输层之TCP与UDP协议应用层socket模块socket代码简介代码优化半连接池的概念今日内容概要传输层之TCP与UDP协议应用层socket模块简介s......
  • docker报错Got permission denied while trying to connect to the Docker daemon soc
    报错内容GotpermissiondeniedwhiletryingtoconnecttotheDockerdaemonsocketatunix:///var/run/docker.sock:Get"http://%2Fvar%2Frun%2Fdocker.sock/v1.......
  • TRINAMIC的六轴步进电机控制模块TMCM-6110使用简介及使用场景
      TMCM-6110是一个用于无传感器负载相关电流控制的六轴步进电机控制器/驱动器模块。该设备有Trinamic  StallGuard2™(无传感器失速检测和机械负载测量)、CoolStep......
  • fastapi socketio
    E:\song\agv_fastapi_socket2\fastapi-socketio-example-main\app.pyimportosimportpathlibimportsecretsimporttimefromtypingimportOptionalimportsocket......
  • Linux下Socket编程(转)
    什么是SocketSocket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解So......