【发布时间】:2019-08-29 10:10:37
【问题描述】:
我在运行 PHP 客户端向 Java 服务器发送数据时遇到问题,问题是 Java 服务器没有显示来自 PHP 客户端的任何输入流。
当我执行 php 客户端时,Java 服务器输出仅显示“刚刚连接..”,我希望它显示“正在测试”,这是 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...
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";
}
}
}
这是我的 Java 服务器代码:
package TestPackage;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.net.SocketTimeoutException;
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());
DataInputStream DataInStream = new DataInputStream(server.getInputStream());
System.out.println(DataInStream.readUTF());
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!");
}
}
}
}
这是使用异常时的错误消息(尝试使用不同的端口时发生同样的错误。我正在尝试 3000、4444 和 29299):
java.net.BindException: Address already in use (Bind failed)
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387)
at java.net.ServerSocket.bind(ServerSocket.java:375)
at java.net.ServerSocket.<init>(ServerSocket.java:237)
at java.net.ServerSocket.<init>(ServerSocket.java:128)
at TestPackage.TestSocketListener.main(TestSocketListener.java:17)
当前使用的端口:
$ 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
【问题讨论】:
-
您完全忽略了捕获的异常,请考虑打印它们的消息。
-
我正在更新线程,它显示类似绑定失败
-
这个错误表明另一个应用程序已经在监听这个端口。检查您是否没有其他
TestSocketListener实例正在运行,或者当前哪个应用程序正在使用此端口。 -
我正在使用端口 3000、4444 和 29299,但仍然有相同的错误。我很确定没有应用程序使用此端口,我正在添加 nmap 结果(端口扫描)