【问题标题】:Using sockets with PHP and Java在 PHP 和 Java 中使用套接字
【发布时间】:2012-05-05 19:02:57
【问题描述】:

我试图创建一个 PHP 脚本来确定服务器(托管下面列出的 java 程序的计算机)是否正在运行,如果是,则 php 函数应该返回 true,否则返回 false。

这里是服务器:

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 好的,只是端口转发了端口 4343,它不再显示第一个错误,但函数似乎总是返回 false,最后两个错误仍然显示。

【问题讨论】:

  • 你在运行 java 部分的机器上有防火墙吗?或者如果 java 部分托管在路由器后面,您是否设置了端口转发?
  • @VideanuAdrian 好的,只是端口转发了端口 4343,它不再显示第一个错误,但函数似乎总是返回 false,最后两个错误仍然显示。
  • 哦,还有,当服务器应用关闭时,错误(第一个)再次出现,函数仍然返回false。

标签: java php sockets tcp client-server


【解决方案1】:

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

只需在您的服务器中注释response.close(); 行,程序就可以运行了。

【讨论】:

    【解决方案2】:

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

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

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

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

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

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-25
      • 1970-01-01
      • 1970-01-01
      • 2011-03-13
      • 1970-01-01
      相关资源
      最近更新 更多