Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-1程序,在同一主机上的不同端口上发送和接收,有可能吗?_Python_Sockets_Udp_Localhost - Fatal编程技术网

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

Python-1程序,在同一主机上的不同端口上发送和接收,有可能吗?,python,sockets,udp,localhost,Python,Sockets,Udp,Localhost,使用Python,是否可以在本地主机和某些端口上发送UDP数据,然后在同一个程序中同时侦听本地主机上的不同端口?我一直收到错误48“地址已在使用”,并尝试使用python的重用地址,尽管我很确定它无论如何都不会适用于此应用程序 背景:我对软件开发一无所知,更不用说Python了,这只是有人在工作中要求的东西 谢谢你的帮助 from threading import Thread import time import socket HOST = 'localhost' PORT = 5455

使用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

您的代码对我有效,因为它不会生成已在使用的
地址

但是线程代码不太干净,
KeyboardInterrupt
不能在线程中处理。这是多线程的一个常见问题,请参阅或,以获取有关如何缓解该问题的示例

这意味着您不能通过使用
CTRL-C
优雅地终止程序。相反,您可能不得不使用类似于
kill[pid]
,甚至可能使用
-9
?我的猜测是,您从以前运行的程序中得到了剩余的连接,导致
地址已在使用中
。使用类似于
netstat-anp | grep5457
的方法确定该端口上是否仍有连接


有关线程的详细介绍,请参见。

是否检查了端口是否已由其他进程使用?另外,请张贴您的套接字初始化代码!不过我使用的是不同的端口。我创建一个套接字并将数据发送到(localhost,“端口1”),同时尝试绑定到(localhost,“端口2”)
(localhost,“端口2”)
是什么意思?(我将在答案中添加一些代码)您应该使用1024以上的示例端口,在linux系统上,您必须是root用户才能创建低于1024的端口。您完全正确。我没有停下来思考就从OP的问题中复制了1和2。谢谢,我将尝试使用connect()函数并在午餐后重新发布。在这篇文章之前,我尝试创建了两个不同的套接字,但没有使用connect()。