python新手,单线程程序,主要还是想分享一下成长的经历,仅供参考,写的不好的地方希望能提提建议。
"""
udp 程序
"""
import socket
import threading
import time
class Exchange(object):
"""
定义一个类,将收发数据的函数全部封装到此类中,但是并没有用继承子类的方法来写程序
"""
def __init__(self, ip, port):
"""
初始化,将外部传过来的参数转化为类属性,有ip地址和端口
:param ip:
:param port:
"""
self.ip = ip
self.port = port
self.socket_init = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
self.socket_init.bind(("", 7788))
def send_msg(self):
"""
发送消息的函数,直接按回车就可更换ip,port,发送close即可结束程序
:return:
"""
while True:
send_content = input('请输入要发送的信息:')
if send_content == '':
try:
self.ip = input('请输入新的ip:')
self.port = int(input('请输入新的端口:'))
except ValueError:
print('端口值出现问题或ip出现问题')
break
if send_content == 'close': # 关闭程序的时候也有问题(已解决)
print('发送程序已关闭!')
self.close()
break
try:
self.socket_init.sendto(send_content.encode('utf-8'), (self.ip, self.port))
except ValueError:
print('编码错误')
break
def recv_msg(self):
"""
接收程序,当发送程序结束后此进程也会结束
:return:
"""
time.sleep(0.1) # 画龙点睛纸笔
while True:
# 接收有问题(已解决)
try:
recv_data = self.socket_init.recvfrom(1024)
except OSError:
print('接收程序已关闭!')
break
try:
print('\n收到消息:',recv_data[0].decode('utf-8'))
except ValueError:
print('解码错误')
break
def close(self):
"""
关闭套接字
:return:
"""
self.socket_init.close()
if __name__ == '__main__':
ips = input('请输入ip地址:')
ports = int(input('请输入端口号:'))
target_person_1 = Exchange(ips, ports)
thread_1 = threading.Thread(target=target_person_1.send_msg)
thread_2 = threading.Thread(target=target_person_1.recv_msg)
thread_1.start()
thread_2.start()