我正在尝试使用PHP开发GPS跟踪系统。我在车辆上安装了GPS跟踪设备,我可以通过短信设置IP地址和端口。所以设备会将数据发送到给定的服务器端口。我的理想是,使用PHP Socket我会监听套接字并将其存储到MySQL数据库中。后来我可以做任何我想做的事情
现在的问题是我无法从设备接收消息。请先查看我的代码
服务器端插座代码:(server.php)
<?php
$_SOCKET = "166.62.10.183";
$_PORT = 5544;
if(!($sock = socket_create(AF_INET, SOCK_STREAM, 0)))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Couldn't create socket: [$errorcode] $errormsg \n");
}
echo "Socket created \n";
// Bind the source address
if( !socket_bind($sock, $_SOCKET , $_PORT) )
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not bind socket : [$errorcode] $errormsg \n");
}
echo "Socket bind OK \n";
if(!socket_listen ($sock , 10))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not listen on socket : [$errorcode] $errormsg \n");
}
echo "Socket listen OK \n";
echo "Listening on \n SOCKET: ".$_SOCKET."\n PORT: ".$_PORT."\n";
echo "Waiting for incoming connections... \n";
//start loop to listen for incoming connections
while (true)
{
//Accept incoming connection - This is a blocking call
$client = socket_accept($sock);
//display information about the client who is connected
if(socket_getpeername($client , $address , $port))
{
echo "Client $address : $port is now connected to us. \n";
}
//read data from the incoming socket
$input = socket_read($client, 1024000);
$response = "OK .. $input";
echo $response;
}
?>
客户端测试代码:(client.php)
<?php
//Creating a Socket
if(!($sock = socket_create(AF_INET, SOCK_STREAM, 0)))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Couldn't create socket: [$errorcode] $errormsg \n");
}
echo "1:: ---- Socket Created </br><br>";
//Connecting to Server
if(!socket_connect($sock, "166.62.10.183", 5544)){
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Couldn't connect socket: [$errorcode] $errormsg </br>");
}
echo "2:: ---- Connection Established </br></br>";
//Send message to Server
$message = "Message from Web\r\n";
if(!socket_send($sock, $message, strlen($message), 0 )){
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Couldn't not send data: [$errorcode] $errormsg </br>");
}
echo "3:: ---- Message sent </br></br>";
// ?>
当我从同一台服务器运行client.php代码时,我能够在server.php中看到消息(我通过SSH&#34运行; php server.php&#34;)。当我从任何其他服务器运行代码时,我看到以下错误消息
1 :: ---- Socket Created
无法连接套接字:[111]拒绝连接
我认为因此,我无法从GPS设备接收消息。指导我解决这个问题。
答案 0 :(得分:1)
如果你提到的ip是正确的,那么我只能看到ftp http portes open和sip port。
使用
nmap <ip-addr>
检查开放端口。 或者您可以使用netcat进行测试
nc <ip-addr> <port>
OR
nc -v -w 1 <ip-addr> -z <port>
这些工具可以帮助您进行调试。 并且在评论中提到它也可能是防火墙问题。为了验证它你可以临时将监听端口改为80.因为它是我可以看到的。 如果那也失败了。我们可以查看php代码以获取更多详细信息。请提供您对上述命令的观察。 使用私有IP(例如192.168.1.x)和使用公共IP的外部网络(例如166.62.10.183)检查它们是否形成相同的网络。看看你是否看到不同的行为。
答案 1 :(得分:0)
听起来好像是@Don't Panic和@Tarun Lalwani所说的防火墙问题 - 请确保您是否想要在服务器打开该端口以接受入站的特定端口上进行连接连接。
另外,为什么要尝试从头开始编写自己的套接字服务器?有plenty of PHP socket libraries out there to make your life easier - 您可能希望查看ReactPHP和Ratchet。
答案 2 :(得分:0)
如果您的托管服务提供商不能打开端口,您可以使用代理配置。它在nginx中更容易,但也可以在apache中完成。如果您使用的是AWS(或任何云提供商),则需要通过已打开的端口配置开放端口或代理。
我同意@Devidas,使用nmap查看哪些端口是打开的。
您的代码也没有指示事件循环,这将是守护进程所需的。你应该用这种方式编写它(对于一个简单的代码只需要大约100行代码),或者使用其中一种代码,例如php pear或上面提到的那些代码。当然,这适用于客户端和服务器。
客户端和服务器在WAN上以同样的方式连接,这是一个充满希望的远景!
答案 3 :(得分:0)
感谢您的所有答案,从过去两天的工作开始,我知道服务器设置不正确,无法从外部设备接收信息。防火墙阻止传入连接。没有共享托管/可托管服务提供商准备打开端口。他们告诉他们,出于安全原因,他们不会打开端口进行出站连接。最后,在为入站和出站连接打开端口后,相同的代码与专用服务器配合良好