繁体   English   中英

Python-1个程序,在不同的端口上但在同一主机上发送和接收,可以吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM