Python - 1程序,在不同的端口上发送和接收但是相同的主机,是否可能?

TDK*_*TDK 4 python sockets udp localhost

使用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
Run Code Online (Sandbox Code Playgroud)

LSe*_*rni 5

是的.用任何语言.你可能正在两次听同一个端口; TCP和UDP端点的特征是IP地址和端口."已使用的地址"仅出现在完全匹配,相同地址相同端口的情况下.

此外,验证侦听端口尚未使用netstat.

更新(感谢l4mpi):如果您尝试使用1024以下的端口而没有超级用户权限,您将获得"拒绝访问".

UPDATE

我稍微修改了你的代码; 你遇到的一个问题是关于发送和接收套接字的一些混淆,这是"客户端"功能,它是"服务器".

我冒昧地查询了一个消息体而不是"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
Run Code Online (Sandbox Code Playgroud)

  • 您应该使用1024以上的示例端口,在Linux系统上,您必须是root用户才能在其下创建端口. (2认同)