基于UDP的socket编程-[WinError 10022]的解决

一、准备部分

  • 目的:

简单地实现客户端和服务端互通

  • 流程:

在这里插入图片描述

  • 接口:

    img

    img

  • 环境:
    python3.8.2、pycharm、SocketTool.exe

二、编程实践

  • 实现客户端
    在这里插入图片描述
    在这里插入图片描述

发现错误

在这里插入图片描述

解决

在这里插入图片描述

总结:[WinError 10022]出现必须为client绑定一个固定的端口号!
client code:

虽然能quit,程序能正常关闭Process finished with exit code 0,但是抛出的线程没有结束,就来关闭socket会出现报错,记录待解决!

import socket
import datetime
import threading

class UdpClient:
    #初始化
    def __int__(self, ip, port):
        self.bufsize = 1024
        self.addr = (ip, port)
        self.udpClient = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.udpClient.bind(('',6666))
        threading.Thread(target=self.send, name="send").start()
        threading.Thread(target=self.recv, name="recv").start()

    def send(self):
        print("please input a message to send or quit to quit:")
        while True:
            data = input()
            if data.strip() == 'quit':
                self.stop()
                break
            msg = data.encode()
            self.udpClient.sendto(msg, self.addr)
            print("you just send a message:", data)

    def recv(self):
        while True:
            msg, addr = self.udpClient.recvfrom(self.bufsize)
            if len(msg) > 0:
                print("recive a message from server:", msg.decode())

    def stop(self):
        self.udpClient.close()

    def main(self):
        ip = input("input a ip you need to chat:\n").strip()
        port = input("input a port you need to chat:\n").strip()
        self.__int__(ip, int(port))

c = UdpClient()
c.main()
  • 实现服务端

在这里插入图片描述

在这里插入图片描述

server code

功能虽然实现,线程收回的问题暂时没有解决!

import socket
import datetime
import threading

class UdpServer:
    #初始化
    def __int__(self):
        self.laddr = ('127.0.0.1', 9999)
        self.bufsize = 1024
        self.udpServer = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.udpServer.bind(self.laddr)
        threading.Thread(target=self.recv, name="recv").start()
        threading.Thread(target=self.send, name="send").start()
        self.clients = {}               #空字典储存socket

    def send(self):
        print("please input in here to send a message")
        print("if you input quit will shut down the server")
        while True:
            data = input()
            if data.strip() == 'quit':
                self.stop()
            elif data.strip() == 'show':
                print(threading.enumerate())
            else:
                msg = "s to c{}. {} {}".format(
                    self.udpServer.getsockname(),
                    datetime.datetime.now().strftime("%Y/%m/%d-%H:%M:%S"),
                    data).encode()
                self.udpServer.sendto(msg, self.raddr)
                print("you have send a message:\n", msg.decode())

    def recv(self):
        while True:
            data, self.raddr = self.udpServer.recvfrom(self.bufsize)
            if len(data) > 0:
                data = "c to s{}. {} {}".format(
                    self.raddr,
                    datetime.datetime.now().strftime("%Y/%m/%d-%H:%M:%S"),
                    data.decode())
                print("you have recived a message:\n", data)

    def stop(self):
        self.udpServer.close()

s = UdpServer()
s.__int__()

  • 最后:

在这里插入图片描述

发布了40 篇原创文章 · 获赞 2 · 访问量 2388

猜你喜欢

转载自blog.csdn.net/qq_42404383/article/details/104858097