我正在尝试在同一硬件上的两个应用程序之间设置基本TCP套接字。我已经在另一台笔记本电脑(充当服务器)和python脚本之间有一个工作套接字,但似乎无法让另一台工作。 背景是我需要在笔记本电脑上运行用户界面,该笔记本电脑通过有线局域网(无需互联网)链接到运行网络的Rpi(这是用户界面的python脚本和html代码所在的位置)。我需要从python脚本中的用户界面访问用户输入,所以我将在两个脚本(PHP和Python)之间使用套接字来发送数据。 Rpi已经充当了一个单独系统的客户端,数据通过它的socket快乐地进入。我打算在PHP脚本中创建新的套接字(我想它会成为服务器)并从这个套接字作为客户端读取在Python脚本中。不幸的是它没有用,我一直在努力:
Traceback (most recent call last):
File "/var/www/Pipe_Sock_v3.py",line 33, in <module>
tcpConfigSock.connect(ADDRCONFIG)
File "/usr/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
error: [Errno 111] Connection refused
PHP套接字创建代码如下:
$host = 'aaa.aaa.aaa.aaa' #both PHP and python script at same IP address on Rpi
$port = 8000;
$sock = socket_create(AF_INET,SOCK_STREAM,0);
socket_bind($sock,$host,$port);
socket_listen($sock);
socket_accept($sock);
Python代码(还包括现有的套接字代码):
HOST = 'bbb.bbb.bbb.bbb' #IP address of system I am already getting data from.
HOSTCONFUG = 'aaa.aaa.aaa.aaa' #Rpi IP Address
PORTCONFIG = 8000 #PHP socket port
BUFSIZCONFIG = 4092
ADDRCONFIG = (HOSTCONFIG,PORTCONFIG) #PHP script link
PORTSYS = 6000 #existing system port
BUFSIZSYS = 4092
ADDRSYS = (HOST, PORTSYS) #existing system link
tcpSysSock = socket(AF_INET, SOCK_STREAM) #existing system socket
tcpConfigSock = socket(AF_INET, SOCK_STREAM) #non functioning PHP socket
tcpSysSock.connect(ADDRSYS)
tcpConfigSock.connect(ADDRCONFIG)
我查了许多其他帖子,书籍和网上搜索但我似乎无法发现我哪里出错了。据我所知,只要为每个服务器和客户端提供单独的套接字,TCP网络就可以在同一系统上与服务器和客户端一起工作。 任何帮助将不胜感激,现在已经坚持了一段时间。
答案 0 :(得分:2)
您的PHP代码缺少对socket_accept
的调用:
socket_accept($sock);
如果没有socket_accept
,php脚本将在socket_listen
之后退出而无需等待客户端连接。