服务端:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""运行环境:
@Time : 2019/11/20 21:34
@Author : muzone
@File : broadcast_server.py
"""
import socket
import logging
class MyLogging:
@classmethod
def get_logger(cls):
logging.basicConfig(format="%(asctime)s|%(filename)s[%(lineno)d]|%(levelname)s|%(message)s",
level=logging.DEBUG,
datefmt="%Y-%m-%d %H:%M:%S")
return logging.getLogger(__name__)
class BroadcastServer:
def __init__(self, port=9094):
self._port = port
self._log = MyLogging.get_logger()
# ipv4 SOCK_DGRAM指定了这个Socket的类型是UDP
self._socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
# 绑定 客户端口和地址:
self._socket.bind(('0.0.0.0', self._port))
self._log.info(f'Bind UDP on {self._port}...')
def run(self):
while True:
# 接收数据 自动阻塞 等待客户端请求:
try:
data, address = self._socket.recvfrom(1024)
data = data.decode()
self._log.info('Received from %s:%s.' % (address, data))
data = f"我接到你的请求:{data}"
self._socket.sendto(data.encode(), address)
self._log.debug('send "%s" to %s.' % (data, address,))
except ConnectionResetError:
pass
except KeyboardInterrupt:
break
@classmethod
def example(cls):
server = cls()
server.run()
def main():
BroadcastServer.example()
pass
if __name__ == "__main__":
main()
客户端:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""运行环境:
@Time : 2019/11/20 21:47
@Author : muzone
@File : broadcast_client.py
"""
import socket
import logging
class MyLogging:
@classmethod
def get_logger(cls):
logging.basicConfig(format="%(asctime)s|%(filename)s[%(lineno)d]|%(levelname)s|%(message)s",
level=logging.DEBUG,
datefmt="%Y-%m-%d %H:%M:%S")
return logging.getLogger(__name__)
class BroadcastClient:
"""客户端使用UDP时,首先仍然创建基于UDP的Socket,然后,不需要调用connect(),直接通过sendto()给服务器发数据:"""
def __init__(self, port=9094):
self._log = MyLogging.get_logger()
self._broadcast_address = ('', port)
self._socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
self._log.debug("create socket")
def send(self, data):
if isinstance(data, str):
data = data.encode()
self._log.debug('send "{0}" to {1[0]}:{1[1]}.'.format(data.decode(), self._broadcast_address))
self._socket.sendto(data, self._broadcast_address)
def recieve(self) -> str:
data = self._socket.recvfrom(1024)
# data = data.decode()
self._log.debug(f'Received from {data[1]}, data is : {data[0].decode()}')
return data[0].decode(), data[1]
@classmethod
def example(cls):
client = cls()
client.send("tom")
client.recieve()
def main():
BroadcastClient.example()
pass
if __name__ == "__main__":
main()