udp广播 java_udp广播丶Java教程网-IT开发者们的技术天堂

服务端:

#!/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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值