使用Python,是否可以在本地主机和某个端口上发送UDP数据,然后在同一程序内同时监听本地主机上的不同端口?我一直在使用错误48'地址已经在使用'并尝试使用python的重用地址,虽然我很确定它无论如何都不适用于这个应用程序。
背景:我对软件开发一无所知,更不用说Python,这只是某人在工作中要求的东西。
我感谢任何帮助。
from threading import Thread
import time
import socket
HOST = 'localhost'
PORT = 5455
PORT1 = 5457
data1 = "1"
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((HOST,PORT1))
a = 0
def myfunction(string, *args):
while 1:
cmd = int( raw_input("send message: ") )
if (cmd == 1):
s.sendto(data1, (HOST,PORT))
time.sleep(1)
def myfunction2(string, *args):
while 1:
print s.recv(30)
time.sleep(.5)
if __name__=='__main__':
try:
Thread(target=myfunction, args=(a, 1)).start()
Thread(target=myfunction2, args=(a, 1)).start()
except Exception, errtxt:
print errtxt
答案 0 :(得分:5)
是的,确实如此。用任何语言。你可能正在两次听同一个端口; TCP和UDP端点的特征是IP地址和端口。 “已使用的地址”仅出现在完全匹配,同一地址和相同的端口。
另外,请确认侦听端口尚未与netstat
一起使用。
UPDATE (感谢l4mpi):如果您尝试使用1024以下的端口而没有超级用户权限,则会收到“拒绝访问”。
<强>更新强>
我稍微修改了你的代码;你遇到的一个问题是发送和接收套接字有些困惑,这就是“客户端”功能,它就是“服务器”。
我冒昧地查询邮件正文而不是“1”,但如果有必要,可以很容易地回复。
from threading import Thread
import time
import socket
CONN = ('localhost', 5455)
def fn_client(string, *args):
cs = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
cs.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
while 1:
cmd = int( raw_input("command (1 to send): ") )
if (cmd == 1):
data = raw_input("message to send: ")
cs.sendto(data, CONN)
time.sleep(1)
def fn_server(string, *args):
ss = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
ss.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
ss.bind(CONN)
while 1:
print "Server received '%s'" % (ss.recv(30))
time.sleep(.5)
if __name__=='__main__':
a = 0
try:
Thread(target=fn_client, args=(a, 1)).start()
Thread(target=fn_server, args=(a, 1)).start()
except Exception, errtxt:
print errtxt
答案 1 :(得分:1)
您的代码适用于我,因为它不会产生Address already in use
。
但是您的线程代码不是太干净,KeyboardInterrupt
不会在线程中处理。这是多线程的常见问题,有关如何减轻它的示例,请参阅this answer或this recipe。
这意味着您无法使用CTRL-C
正常终止您的程序。相反,你可能不得不求助于kill [pid]
,甚至可能使用-9
?我的猜测是你从以前的程序运行中获得了剩余的连接,导致Address already in use
。使用netstat -anp | grep 5457
之类的内容来确定该端口上是否还有连接。
另请参阅Doug Hellman's article以获得有关线程的详细介绍。