在PHP和Java中使用socket
我试图创建一个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
注意:我对socket和服务器/客户机通信非常陌生
编辑:
@VideanuAdrian OK,只是端口转发了端口4343,它不再显示第一个错误,但函数似乎总是返回false,最后两个错误仍然显示
# 1 楼答案
不应关闭服务器中的DataOutputStream对象
只需在服务器中注释
response.close();
行,程序就可以运行了# 2 楼答案
运行客户端/服务器时,您需要知道运行应用程序的用户是否有权访问该端口。1024个端口由system know应用程序/服务保留。这就是第一点
第2点:最好的方法之一是在连接线程方法中运行服务器。以这种方式运行时,当新的客户端请求到达时,服务器可以将请求句柄委托给连接线程
第3点:消息与协议有关。如果使用HTTP或FTP等内置协议,则必须使用协议规则。如果没有,您可以为消息请求/响应构建自己的规则
在继续之前,我建议您阅读Java网络教程。运行所有Java示例。稍后,您可以与PHP混合使用。关于套接字和协议的信息越多,程序就越好
http://docs.oracle.com/javase/tutorial/networking/
希望这能对你有所帮助