Java套接字侦听PHP客户端不工作

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.

我在运行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...
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!");
            }
        }
    }
}