将消息从 Java 套接字发送到 PHP 服务器套接字
Sending message from a Java socket to a PHP server socket
我有一个套接字侦听 PHP 中的某个端口,我试图使用 Java 中的套接字发送字符串,但我不断收到以下错误:
Warning: socket_recv(): unable to read from socket [0]: The operation completed successfully.
in H:\Dropbox\EISTI\www\java-instagram-web\src\Client\Component\Server\Client.php on line 55
没有更多的描述,很难理解是什么问题。
我的 PHP class 如下所示:
class Client {
private $address;
private $port;
private $command;
public function __construct($port, $address, $addressServer, $portServer, $command)
{
set_time_limit(0);
$this->address = $address;
$this->port = $port;
$this->init();
}
private function init(){
//Create socket
if (! $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) {
$this->showError('socket create');
}
echo "Server Created\n";
//Bind socket
if (!socket_bind($socket, $this->address, $this->port)) {
$this->showError('socket bind');
}
echo "Server bind to $this->address and $this->port \n";
if (!socket_listen($socket)) {
$this->showError('socket listen');
}
echo "Server Listening \n";
do {
$client = socket_accept($socket);
echo "connection established\n";
$message = "\n Hey! welcome to the server\n";
socket_write($client, $message, strlen($message));
do {
if (! socket_recv($socket, $clientMessage, 2045, MSG_WAITALL)) {
$this->showError('socket receive');
}
$message = "Command Received\n";
echo $clientMessage;
socket_send($client, $message, strlen($message), 0);
if (!$clientMessage = trim($clientMessage)) {
continue;
}
if (trim($clientMessage) == 'close') {
socket_close($client);
echo "\n\n--------------------------------------------\n".
"ClientRequest terminated\n";
break 1;
}
} while(true);
} while(true);
}
private function showError($message) {
echo ("Error: ".$message);
exit(666);
}
}
我的 Java 套接字 class 如下所示:
public class ResponseToClient {
private String host;
private int port;
private Socket socket;
private PrintStream theOut;
private String resultLocation;
/**
* Constructor
*/
public ResponseToClient(String path) {
this.host = "localhost";
this.port = 1000;
this.resultLocation = path;
}
/**
* Setting up Socket
*/
public void init(){
try{
socket = new Socket(host, port);
theOut = new PrintStream(socket.getOutputStream());
//Send Command
sendCommand();
//Closing connections
socket.close();
theOut.close();
}
catch (IOException e){
e.printStackTrace();
}
}
/**
* Send Command
*/
public void sendCommand()
{
theOut.println(Messages.type_response + Messages.seperator_client + resultLocation);
System.out.println(Messages.type_response + Messages.seperator_client + resultLocation);
}
}
我做错了什么?
我认为问题是您试图从 PHP 端的服务器套接字而不是客户端套接字读取:
socket_recv($socket, $clientMessage, 2045, MSG_WAITALL)
这应该是
socket_recv($client, $clientMessage, 2045, MSG_WAITALL)
我找到问题了
有两个问题,我从错误的套接字读取,所以我按照@RealSkeptic 的建议进行了更改,从 :
socket_recv($socket, $clientMessage, 2045, MSG_WAITALL)
到
socket_recv($client, $clientMessage, 2045, MSG_WAITALL)
另一个问题是我使用的内部 while 循环是 socket_read.
我是这样做的,因为我从 PHP 中为 server_sockets 找到的教程中获取了这段代码。
但是由于通信流,它在这里造成了一个问题:
答案:
在 Java 端我只发送一个响应,而在 PHP 端我在 while 循环中使用 socket_read "infinitely" 直到我收到字符串 "close"。这造成了问题,因为在收到第一个响应后,没有其他内容可读。因此错误。
所以为了解决这个问题,我只需要删除 while 循环,(我删除了 socket_write 因为我不需要发送任何信息)。
classClient
的工作示例:
class Client {
private $addressServer;
private $portServer;
private $address;
private $port;
private $command;
public function __construct($port, $address, $addressServer, $portServer, $command)
{
set_time_limit(0);
$this->addressServer = $addressServer;
$this->address = $address;
$this->portServer = $portServer;
$this->port = $port;
$this->command = $command;
$this->init();
}
private function init() {
//Send request to the Java server
$request = new Request(
$this->addressServer, $this->portServer, $this->command
);
//create socket
if (! $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) {
$this->showError('socket create');
}
echo "Server Created\n";
//Bind socket
if (!socket_bind($socket, $this->address, $this->port)) {
$this->showError('socket bind');
}
echo "Server bind to $this->address and $this->port \n";
if (!socket_listen($socket)) {
$this->showError('socket listen');
}
echo "Server Listening \n";
do {
$client = socket_accept($socket);
echo "connection established\n";
if(!$clientMessage = socket_read($client, 10000, PHP_NORMAL_READ)){
$this->showError('socket read');
}
echo "Command Received\n";
echo $clientMessage;
} while(true);
}
private function showError($message){
echo ("Error: ".$message);
exit(666);
}
}
我有一个套接字侦听 PHP 中的某个端口,我试图使用 Java 中的套接字发送字符串,但我不断收到以下错误:
Warning: socket_recv(): unable to read from socket [0]: The operation completed successfully.
in H:\Dropbox\EISTI\www\java-instagram-web\src\Client\Component\Server\Client.php on line 55
没有更多的描述,很难理解是什么问题。
我的 PHP class 如下所示:
class Client {
private $address;
private $port;
private $command;
public function __construct($port, $address, $addressServer, $portServer, $command)
{
set_time_limit(0);
$this->address = $address;
$this->port = $port;
$this->init();
}
private function init(){
//Create socket
if (! $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) {
$this->showError('socket create');
}
echo "Server Created\n";
//Bind socket
if (!socket_bind($socket, $this->address, $this->port)) {
$this->showError('socket bind');
}
echo "Server bind to $this->address and $this->port \n";
if (!socket_listen($socket)) {
$this->showError('socket listen');
}
echo "Server Listening \n";
do {
$client = socket_accept($socket);
echo "connection established\n";
$message = "\n Hey! welcome to the server\n";
socket_write($client, $message, strlen($message));
do {
if (! socket_recv($socket, $clientMessage, 2045, MSG_WAITALL)) {
$this->showError('socket receive');
}
$message = "Command Received\n";
echo $clientMessage;
socket_send($client, $message, strlen($message), 0);
if (!$clientMessage = trim($clientMessage)) {
continue;
}
if (trim($clientMessage) == 'close') {
socket_close($client);
echo "\n\n--------------------------------------------\n".
"ClientRequest terminated\n";
break 1;
}
} while(true);
} while(true);
}
private function showError($message) {
echo ("Error: ".$message);
exit(666);
}
}
我的 Java 套接字 class 如下所示:
public class ResponseToClient {
private String host;
private int port;
private Socket socket;
private PrintStream theOut;
private String resultLocation;
/**
* Constructor
*/
public ResponseToClient(String path) {
this.host = "localhost";
this.port = 1000;
this.resultLocation = path;
}
/**
* Setting up Socket
*/
public void init(){
try{
socket = new Socket(host, port);
theOut = new PrintStream(socket.getOutputStream());
//Send Command
sendCommand();
//Closing connections
socket.close();
theOut.close();
}
catch (IOException e){
e.printStackTrace();
}
}
/**
* Send Command
*/
public void sendCommand()
{
theOut.println(Messages.type_response + Messages.seperator_client + resultLocation);
System.out.println(Messages.type_response + Messages.seperator_client + resultLocation);
}
}
我做错了什么?
我认为问题是您试图从 PHP 端的服务器套接字而不是客户端套接字读取:
socket_recv($socket, $clientMessage, 2045, MSG_WAITALL)
这应该是
socket_recv($client, $clientMessage, 2045, MSG_WAITALL)
我找到问题了
有两个问题,我从错误的套接字读取,所以我按照@RealSkeptic 的建议进行了更改,从 :
socket_recv($socket, $clientMessage, 2045, MSG_WAITALL)
到
socket_recv($client, $clientMessage, 2045, MSG_WAITALL)
另一个问题是我使用的内部 while 循环是 socket_read.
我是这样做的,因为我从 PHP 中为 server_sockets 找到的教程中获取了这段代码。
但是由于通信流,它在这里造成了一个问题:
答案:
在 Java 端我只发送一个响应,而在 PHP 端我在 while 循环中使用 socket_read "infinitely" 直到我收到字符串 "close"。这造成了问题,因为在收到第一个响应后,没有其他内容可读。因此错误。
所以为了解决这个问题,我只需要删除 while 循环,(我删除了 socket_write 因为我不需要发送任何信息)。
classClient
的工作示例:
class Client {
private $addressServer;
private $portServer;
private $address;
private $port;
private $command;
public function __construct($port, $address, $addressServer, $portServer, $command)
{
set_time_limit(0);
$this->addressServer = $addressServer;
$this->address = $address;
$this->portServer = $portServer;
$this->port = $port;
$this->command = $command;
$this->init();
}
private function init() {
//Send request to the Java server
$request = new Request(
$this->addressServer, $this->portServer, $this->command
);
//create socket
if (! $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) {
$this->showError('socket create');
}
echo "Server Created\n";
//Bind socket
if (!socket_bind($socket, $this->address, $this->port)) {
$this->showError('socket bind');
}
echo "Server bind to $this->address and $this->port \n";
if (!socket_listen($socket)) {
$this->showError('socket listen');
}
echo "Server Listening \n";
do {
$client = socket_accept($socket);
echo "connection established\n";
if(!$clientMessage = socket_read($client, 10000, PHP_NORMAL_READ)){
$this->showError('socket read');
}
echo "Command Received\n";
echo $clientMessage;
} while(true);
}
private function showError($message){
echo ("Error: ".$message);
exit(666);
}
}