socket 通信模块

一. 导入模块

  import socket

二. 基本使用

2.1 服务端

  # 导入模块
  import socket

  # 买手机
  server = socket.socket()

  # 插电话卡
  server.bind(('127.0.0.1', 8080))

  # 开机
  server.listen(5)

  # 等待并接听电话  没有人来就原地等待(程序阻塞)
  sock, addr = server.accept()

  # 客户端的地址
  print(addr)

  """recv和send接收和发送的都是bytes类型的数据"""
  # 接受客服端传来的消息
  data = sock.recv(1024)
  print(data.decode('utf8'))

  # 回复客服端
  sock.send('你好啊'.encode('utf8'))

  # 挂电话
  sock.close()

  # 关机  
  server.close()

2.2 客服端

  # 导入模块
  import socket

  # 产生一个socket对象
  client = socket.socket()

  # 根据服务端的地址链接
  client.connect(('127.0.0.1', 8080))

  # 给服务端发送消息
  client.send(b'hello sweet heart!!!')

  # 接收服务端回复的消息
  data = client.recv(1024)
  print(data.decode('utf8'))

  # 关闭客户端
  client.close()

三. 循环通信

""" 服务端 """

  import socket

  server = socket.socket()
  server.bind(('127.0.0.1', 8080))
  server.listen(5)
  sock, addr = server.accept()

  while True:
      data = sock.recv(1024)
      print(data.decode('utf8'))
      msg = input('请回复消息>>>:').strip()
      sock.send(msg.encode('utf8'))

""" 客服端 """

import socket

client = socket.socket()  # 产生一个socket对象
client.connect(('127.0.0.1', 8080))  # 根据服务端的地址链接

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

四. 代码优化

4.1 错误类型及处理方法

1. 发送消息为空的错误

对发送的消息长度做判断然后进行处理

2. 反复重启服务端可能会报错 >>> 错误信息 :address in use

# 导入
from socket import SOL_SOCKET,SO_REUSEADDR

# 在bind前加
server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)

3. 客户端如果异常断开

客户端异常退出之后服务端会直接报错, 进行异常处理

try:
    pass
except Exception:
    pass

4.2 代码

""" --------------------------------客服端-------------------------------- """

import socket

client = socket.socket()  # 产生一个socket对象
client.connect(('127.0.0.1', 8080))  # 根据服务端的地址链接

while True:
    while True:
        msg = input('请输入你需要发送的消息>>>:').strip()
        if len(msg) == 0:
            print('消息不能为空')
            continue
        client.send(msg.encode('utf8'))  # 给服务端发送消息
        data = client.recv(1024)  # 接收服务端回复的消息
        print(data.decode('utf8'))


""" --------------------------------服务端-------------------------------- """

import socket
from socket import SOL_SOCKET, SO_REUSEADDR

server = socket.socket()

server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)

server.bind(('127.0.0.1', 8080))
server.listen(5)

while True:
    sock, addr = server.accept()
    print(addr)

    while True:
        try:
            data = sock.recv(1024)
            print(data.decode('utf8'))
            while True:
                msg = input('请回复消息>>>:').strip()
                if len(msg) == 0:
                    print('消息不能为空')
                    continue
                sock.send(msg.encode('utf8'))
                break
        except Exception:
            break
posted @ 2023-05-07 16:48  codegjj  阅读(0)  评论(0编辑  收藏  举报