• socket:进行应用程序之间的网络信息交互的工具
  • 几乎市面上所有具有网络通讯功能的软件,底层都使用了socket
  • 两个进程,分别开启sokcet服务,使用scoket可以在进程间进行通讯.
  • 有了sokcet一样要获取三要素:ip 端口号 协议, 才能进行正常通讯

socket的使用流程

分为服务端和客服端

  • 服务端
  • 创建服务端socket
# 1.导包导入socket模块
  import socket

# 2.创建socket对象
# socket.AF_INET 这个参数代表ipv4,下边绑定的IP地址就是ipv4协议的
# socket.SOCK_STREAM 这个参数代表使用的是TCP协议,要使用tcp协议收发数据
  server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  
# 设置端口号复用
# server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
  • 绑定ip和端口号,让客户端可以访问
# 3.绑定ip和端口号
# ip地址中 127.0.0.1代表本地回环地址, 就是主机本身的ip地址
# 无论你的主机ip是什么,我们都可以使用127.0.0.1找到你的主机
# 绑定的端口号是 8888
  server_socket.bind(('127.0.0.1',8888))
  • 设置监听,等待客户端接入
# 4.设置监听
# 128代表最大监听数量,也就是同时接入服务的客户端最多有128个
  server_socket.listen(128)
  • 如果有客户端接入,则创建新的socket对象,与之进行数据通讯
# 5.等待用户接入服务端,创建新的socket对象
# 使用accept方法后会等待客户端接入后才能继续执行. 阻塞:暂时无法执行等待某个事件发生后才能继续执行
# 客户端接入后,会返回一个元组,元组中有两个元素,第一个是新的sokcet对象,第二个是ip和端口号
  service_client_socket, ip_port = server_socket.accept()
  • 收发数据
# 使用死循环保持服务端一直开启
while True:
# 6.接收数据
# 获取数据的字节数
# 字符型数据 = 字节型数据 + 字符集
  recv_data = service_client_socket.recv(1024)
  # 当接收到客服端发来结束会话时跳出循环
  if recv_data.decode() == '结束':
      print('会话结束')
      break
  else:
      print('客服端: '+recv_data.decode())

  # 7.发送数据 发送时只能发送二进制数据
  send_data = input('服务端:')
  service_client_socket.send(send_data.encode())
  • 关闭socket
# 8.关闭socket
 service_client_socket.close()
 server_socket.close()
  • 客户端
  • 创建客户端socket
# 1.导包导入socket模块
  import socket
  
# 创建客服端socket
  client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  • 连接服务端
# 连接服务器和端口
  client_socket.connect(('127.0.0.1', 8888))
  • 与服务端新建的socket进行通讯收发数据
# 使用循环进行多次会话
while True:
  # 发送数据
  send_data = input('客服端:')
  client_socket.send(send_data.encode())
  # 跳出会话
  if send_data == '结束':
      print('会话结束')
      break

  # 接收服务端的响应
  recv_data = client_socket.recv(1024)
  print('客服端:'+recv_data.decode())
  • 使用结束后关闭socket
# 关闭socket
  client_socket.close()