一、准备部分
简单地实现客户端和服务端互通
二、编程实践
- 实现客户端
发现错误
解决
总结:[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__()