Java套接字侦听PHP客户端不工作
我在运行PHP客户端向Java服务器发送数据时遇到了一个问题,问题是Java服务器没有显示来自PHP客户端的任何输入流 Java服务器输出仅显示“刚刚连接…”当我执行php客户端时,我希望它显示“测试”,以下是Java代码:Java套接字侦听PHP客户端不工作,java,php,sockets,Java,Php,Sockets,我在运行PHP客户端向Java服务器发送数据时遇到了一个问题,问题是Java服务器没有显示来自PHP客户端的任何输入流 Java服务器输出仅显示“刚刚连接…”当我执行php客户端时,我希望它显示“测试”,以下是Java代码: Waiting for client on port 3000... Waiting for client on port 3000... Waiting for client on port 3000... Waiting for client on port 3000.
Waiting for client on port 3000...
Waiting for client on port 3000...
Waiting for client on port 3000...
Waiting for client on port 3000...
Just connected to /127.0.0.1:39220
Waiting for client on port 3000...
PHP客户端输出:
$ sudo php testSocketClient.php
Try to connect '127.0.0.1' Port '3000'...
Connect OK
Send Message to Server Successfully!
Send Information:Testing
Turn Off Socket...
Turn Off OK
这是我的PHP客户端代码,我在这里发送“测试”消息:
<?php
set_time_limit(0);
$port = 3000;
$ip = "127.0.0.1";
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if($socket < 0) {
echo "socket_create() Fail to create:".socket_strerror($sock)."\n";
} else {
echo "Try to connect '$ip' Port '$port'...\n";
$result = socket_connect($socket, $ip, $port);
if ($result < 0) {
echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n";
}else {
echo "Connect OK\n";
$in = "Testing\r\n";
$out = '';
if(!socket_write($socket, $in, strlen($in))) {
echo "socket_write() failed. reason: " . socket_strerror($socket) . "\n";
}else {
echo "Send Message to Server Successfully!\n";
echo "Send Information:" . $in . "\n";
echo "Turn Off Socket...\n";
socket_close($socket);
echo "Turn Off OK\n";
}
}
}
这是使用异常时的错误消息(尝试使用不同端口时发生相同错误。我正在尝试3000、4444和29299):
我让它工作了。根据JAVA文档,如果客户端关闭连接,可能会发生
IOException
。请参阅:。PHP代码执行并结束连接。但这仍然不是PHP代码的问题。您使用的是readUTF();这不可靠。相反,使用read([]字节b,int off,int len)
这是我的输出:
package TestPackage;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.nio.channels.IllegalBlockingModeException;
public class TestSocketListener {
public static void main(String[] args) {
System.out.println("INIT SOCKET");
int port = 3000;
while(true) {
try {
ServerSocket serverSocket = new ServerSocket(port);
serverSocket.setSoTimeout(5000);
System.out.println("Waiting for client on port " +
serverSocket.getLocalPort() + "...");
Socket server = serverSocket.accept();
System.out.println("Just connected to " + server.getRemoteSocketAddress());
// you want to know how much bytes to read
InputStream inputstream = server.getInputStream();
int buflen = inputstream.available();
DataInputStream DataInStream = new DataInputStream(inputstream);
byte[] rawstring = new byte[buflen];
DataInStream.read(rawstring, 0, buflen);
String str = new String(rawstring);
System.out.println(str);
DataOutputStream DataOutStream = new DataOutputStream(server.getOutputStream());
DataOutStream.writeUTF("Thank you for connecting to " + server.getLocalSocketAddress()
+ "\nGoodbye!");
server.close();
System.out.println(("SERVER CLOSED"));
} catch(SocketTimeoutException st) {
System.out.println("Socket timed out!");
} catch(SocketException s) {
//System.out.println("Socket Error!!");
//s.getMessage();
} catch (IOException e) {
//System.out.println("IO Error!");
}
}
}
}
INIT套接字
正在端口3000上等待客户端。。。
刚刚连接到/127.0.0.1:61989
测试
服务器关闭
以下是代码更改:
package TestPackage;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.nio.channels.IllegalBlockingModeException;
public class TestSocketListener {
public static void main(String[] args) {
System.out.println("INIT SOCKET");
int port = 3000;
while(true) {
try {
ServerSocket serverSocket = new ServerSocket(port);
serverSocket.setSoTimeout(5000);
System.out.println("Waiting for client on port " +
serverSocket.getLocalPort() + "...");
Socket server = serverSocket.accept();
System.out.println("Just connected to " + server.getRemoteSocketAddress());
// you want to know how much bytes to read
InputStream inputstream = server.getInputStream();
int buflen = inputstream.available();
DataInputStream DataInStream = new DataInputStream(inputstream);
byte[] rawstring = new byte[buflen];
DataInStream.read(rawstring, 0, buflen);
String str = new String(rawstring);
System.out.println(str);
DataOutputStream DataOutStream = new DataOutputStream(server.getOutputStream());
DataOutStream.writeUTF("Thank you for connecting to " + server.getLocalSocketAddress()
+ "\nGoodbye!");
server.close();
System.out.println(("SERVER CLOSED"));
} catch(SocketTimeoutException st) {
System.out.println("Socket timed out!");
} catch(SocketException s) {
//System.out.println("Socket Error!!");
//s.getMessage();
} catch (IOException e) {
//System.out.println("IO Error!");
}
}
}
}
希望这有帮助你完全忽略了被捕获的异常,考虑打印他们的消息。我正在更新线程,它显示了类似Bind FailedThis错误的情况,表明另一个应用程序已经在这个端口上侦听。检查您是否没有运行TestSocketListener
的其他实例,或者哪个应用程序当前正在使用此端口。我正在使用端口3000、4444和29299,但它仍然存在相同的错误。我很确定没有应用程序使用这个端口,我正在添加nmap结果(端口扫描)
$ nmap 127.0.0.1
Starting Nmap 6.40 ( http://nmap.org ) at 2019-08-01 17:32 WIB
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00046s latency).
Not shown: 994 closed ports
PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
80/tcp open http
111/tcp open rpcbind
443/tcp open https
3306/tcp open mysql
package TestPackage;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.nio.channels.IllegalBlockingModeException;
public class TestSocketListener {
public static void main(String[] args) {
System.out.println("INIT SOCKET");
int port = 3000;
while(true) {
try {
ServerSocket serverSocket = new ServerSocket(port);
serverSocket.setSoTimeout(5000);
System.out.println("Waiting for client on port " +
serverSocket.getLocalPort() + "...");
Socket server = serverSocket.accept();
System.out.println("Just connected to " + server.getRemoteSocketAddress());
// you want to know how much bytes to read
InputStream inputstream = server.getInputStream();
int buflen = inputstream.available();
DataInputStream DataInStream = new DataInputStream(inputstream);
byte[] rawstring = new byte[buflen];
DataInStream.read(rawstring, 0, buflen);
String str = new String(rawstring);
System.out.println(str);
DataOutputStream DataOutStream = new DataOutputStream(server.getOutputStream());
DataOutStream.writeUTF("Thank you for connecting to " + server.getLocalSocketAddress()
+ "\nGoodbye!");
server.close();
System.out.println(("SERVER CLOSED"));
} catch(SocketTimeoutException st) {
System.out.println("Socket timed out!");
} catch(SocketException s) {
//System.out.println("Socket Error!!");
//s.getMessage();
} catch (IOException e) {
//System.out.println("IO Error!");
}
}
}
}