2012-04-25 23 views
2

我试图创建一个PHP脚本,它确定服务器(承载下面列出的Java程序的计算机)是否正在运行,如果是,则PHP功能应返回true,否则返回true它返回false。在PHP和Java中使用套接字

这里是服务器:

package darestium.minecraft.server; 

import java.io.BufferedReader; 
import java.net.*; 
import java.io.*; 

public class Server { 
    private static ServerSocket socket; 

    private static Socket connection; 
    private static String command  = new String(); 
    private static String responseStr = new String();; 

    private static int port = 4343; 

    public static void main(String args[]) { 
     System.out.println("Signal Server is running."); 

     try { 
      socket = new ServerSocket(port); 

      while (true) { 
       connection = socket.accept(); 

       InputStreamReader inputStream = new InputStreamReader(connection.getInputStream()); 
       DataOutputStream response = new DataOutputStream(connection.getOutputStream()); 
       BufferedReader input = new BufferedReader(inputStream); 

       command = input.readLine(); 

       response.writeBytes(responseStr); 
       response.flush(); 
       //response.close(); 

       System.out.println("Running"); 
      } 
     } catch (IOException e) { 
      System.out.println("Fail!: " + e.toString()); 
     } 

     System.out.println("Closing..."); 
    } 
} 

这里是客户端:

<? 
    function isRunning() { 
     $address = 'darestium.dyndns-free.com'; 
     $port = 4343; 
     $socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp')); 
     $message = 'loolololol'; 

     try { 
      socket_connect($socket, $address, $port); 

      $status = socket_sendto($socket, $message, strlen($message), MSG_EOF, $address, $port); 

      if ($status != false) { 
       return true; 
      } 

      return false; 
     } catch (Exception $e) { 
      return false; 
     } 
    } 
?> 

以下是显示了PHP页面上的回声出函数的结果的错误信息像这样:

include('server.php'); 
echo isRunning(); 

然后,错误消息:

Warning: socket_connect() [function.socket-connect]: unable to connect [0]: No connection could be made because the target machine actively refused it. in C:\Users\darestium\Documents\Portables\xampp\htdocs\darestium\minecraftserver.php on line 9 

Notice: Use of undefined constant MSG_EOF - assumed 'MSG_EOF' in C:\Users\darestium\Documents\Portables\xampp\htdocs\darestium\minecraftserver.php on line 11 

Warning: socket_sendto() expects parameter 4 to be long, string given in C:\Users\darestium\Documents\Portables\xampp\htdocs\darestium\minecraftserver.php on line 11 

我想知道如何解决这个问题。此外,我希望能够发送消息到服务器,任何想法我怎么能做到这一点?我基于此Simple Java TCP Server and PHP Client Problems

注意:我是非常新的套接字和服务器/客户端通信。

编辑:

@VideanuAdrian OK,只是端口转发端口4343,它不再显示了第一个错误,但功能似乎总是返回false,最后两个错误仍然显示。

+0

运行java部分的机器上是否有防火墙?或者如果Java部件位于路由器后面,您是否有端口转发设置? – 2012-04-25 05:34:03

+0

@VideanuAdrian好的,只是端口转发端口4343,它不再显示与第一个错误,但该函数似乎总是返回false,最后两个错误仍然显示。 – Darestium 2012-04-25 05:49:15

+0

哦,另外,错误(第一个)在服务器应用程序关闭时再次显示,并且该函数仍然返回false。 – Darestium 2012-04-25 06:06:33

回答

0

运行客户端/服务器时,您需要知道运行应用程序的用户是否有权访问该端口。由系统知道的应用程序/服务保留到1024的端口。第1点。

第2点:最好的方法之一是在连接线程方法中运行服务器。以这种方式运行时,当新的客户端请求到达时,服务器可以将请求句柄委托给连接线程。

点3:消息与协议有关。如果您使用的是像HTTP或FTP这样的内置协议,则必须使用协议规则。如果没有,您可以为消息请求/响应构建自己的规则。

我建议您在继续之前阅读Java网络教程。运行所有Java示例。稍后,您可以与PHP混合使用。有关套接字和协议的更多信息,您的程序将会更好。

http://docs.oracle.com/javase/tutorial/networking/

希望这可以帮助你。

1

您不应该关闭服务器中的DataOutputStream对象。

只需在您的服务器中注释行response.close();并且程序应该可以工作。

+0

+1为您的答案 – 2012-04-25 05:36:13