[英]Python - 1 program, send and receive on different ports but same host, Is it possible?
使用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
是的。 任何语言。 您可能在同一端口上监听了两次; TCP和UDP端点由IP地址和端口来表征。 仅当完全匹配,相同的地址和相同的端口时,才会显示“地址已在使用中”。
另外,请验证netstat
尚未使用侦听端口。
更新 (由于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
您的代码在不产生Address already in use
对我Address already in use
。
但是您的线程代码不太干净, KeyboardInterrupt
不会在线程中处理。 这是多线程的一个常见问题,有关如何缓解多线程的示例,请参阅此答案或本食谱 。
这意味着您无法使用CTRL-C
优雅地终止程序。 相反,您可能不得不求助于使用kill [pid]
类的东西,甚至使用-9
? 我的猜测是,您从程序的先前运行中获得了剩余连接,从而导致Address already in use
。 使用类似netstat -anp | grep 5457
netstat -anp | grep 5457
确定该端口上是否仍然有连接。
另请参阅Doug Hellman的文章 ,以很好地介绍线程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.