最近在B站(https://www.bilibili.com/video/BV1Xx411R743?p=1)学习了socket,为了练习,使用socket编写了一个简易的聊天室功能
首先要创建两个udp套接字并绑定IP以及端口号,一个用于发送,一个用于接收
# 创建套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定ip以及端口
udp_socket.bind(("", 8077)) # 前一项为空字符串默认为本地ip,后一项为端口号可以在1024-65535之间任取,若程序提示端口号被占用,就换一个
udp_socket1 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_socket1.bind(("", 9099))
其中socket.AF_INET表示使用的ipv4版本的ip,socket.SOCL_DGRAM表示使用的是udp协议
然后编写收发数据功能
class myThread1(threading.Thread):# 发送数据
def run(self):
while True:
msg = input()
ip = "127.0.0.1"# 目的ip
port = 8080# 目的程序
udp_socket.sendto(msg.encode("utf-8"), (ip, port))
class lmyThread(threading.Thread):# 收数据
def run(self):
while True:
recv_data = udp_socket1.recvfrom(1024)
ip = recv_data[1]
msg = recv_data[0].decode("gbk")
print(">>>%s: %s" % (str(ip), msg))
通过继承Thread的类来实现,是为了实现两个线程,收发数据两不相干
最终版本代码:
import socket
import threading
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定端口
udp_socket.bind(("", 8077))
udp_socket1 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_socket1.bind(("", 9099))
class myThread1(threading.Thread):
def run(self):
while True:
msg = input()
ip = "127.0.0.1"
port = 8080
udp_socket.sendto(msg.encode("utf-8"), (ip, port))
class lmyThread(threading.Thread):
def run(self):
while True:
recv_data = udp_socket1.recvfrom(1024)
ip = recv_data[1]
msg = recv_data[0].decode("gbk")
print(">>>%s: %s" % (str(ip), msg))
t1=myThread1()
t2=lmyThread()
t1.start()
t2.start()
t1.join()
t2.join()
如果你编写两个这样的程序或者安装一个网络助手就可以与自己对话了
初学python的小白,若有不当,请不吝指教