【问题标题】:Java Socket Listening PHP Client Not WorkJava Socket 监听 PHP 客户端不工作
【发布时间】: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 结果(端口扫描)

标签: java php sockets


【解决方案1】:

我让它工作了。根据 JAVA 文档,如果客户端关闭连接,可能会出现IOException。请参阅:DataInputStream。您的 PHP 代码执行并结束连接。但这仍然不是您的 PHP 代码的问题。您正在使用 readUTF() 方法,它并没有真正告诉 JAVA 要读取多少字节;这不可靠。相反,请使用read([]byte b, int off, int len)

这是我的输出:

INIT SOCKET
Waiting for client on port 3000...
Just connected to /127.0.0.1:61989
Testing

SERVER CLOSED

代码更改如下:

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!");
            }
        }
    }
}

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-01
    • 2015-09-14
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多