java - 使用 Socket 将 PHP 转为 Java

标签 java php sockets

我正在尝试使用套接字在 Java 和 PHP 之间发送消息,但无法让它工作。我首先尝试了从 Java 到 Java,效果很好,但现在我想从 PHP 到 Java 等等。 PHP 表示消息已发送,但 Java 没有收到消息。谁能帮我解决这个问题吗?

Java 服务器:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    public static void main(String args[]) throws IOException {
        final int portNumber = 81;
        ServerSocket serverSocket = new ServerSocket(portNumber);
        while (true) {
            Socket socket = serverSocket.accept();
            OutputStream os = socket.getOutputStream();
            PrintWriter pw = new PrintWriter(os, true);

            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println("Client response: " + line);
                pw.println(line);
            }
            pw.close();
            br.close();
            os.close();
            socket.close();
        }
    }
}

Java 客户端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class Client extends Thread {

    Socket socket;
    BufferedReader br;
    PrintWriter out;

    String disconnectReason;
    boolean disconnected = false;
    public boolean running;

    public static void main(String[] args) {
        Client client = new Client();
        client.sendMessage("Hello!");
    }

    public Client() {
        new Thread(this).start();
        running = true;
    }

    @Override
    public void run() {
        try {
            socket = new Socket("localhost", 81);
            br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out = new PrintWriter(socket.getOutputStream(), true);
            while (running) {
                String line;
                if((line = br.readLine()) != null) {
                    System.out.println("Server response: " + line);
                }
            }
            System.out.println("Disconnected. Reason: " + disconnectReason);
            disconnected = true;
            running = false;
            br.close();
            out.close();
            socket.close();
            System.out.println("Shutted down!");
            System.exit(0);
        } catch (IOException e) {
            if(e.getMessage().equals("Connection reset")) {
                disconnectReason = "Connection lost with server";
                disconnected = true;
                System.out.println("Disconnected from server. Reason: Connection reset");
            } else {
                e.printStackTrace();
            }
        }
    }

    public void sendMessage(String message) {
        if(running) {
            if (!disconnected) {
                if (out != null && socket != null) {
                    out.println(message);
                    out.flush();
                }
            }
        }
    }
}

我尝试过的 PHP 代码:

<?php
$host = "localhost"; 
$port = 81;
$data = 'test';

if ( ($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === FALSE )
    echo "socket_create() failed: reason: " .             socket_strerror(socket_last_error());
else 
{
    echo "Attempting to connect to '$host' on port '$port'...<br>";
    if ( ($result = socket_connect($socket, $host, $port)) === FALSE )
        echo "socket_connect() failed. Reason: ($result) " .     socket_strerror(socket_last_error($socket));
    else {
        echo "Sending data...<br>";
        socket_write($socket, $data, strlen($data));
        echo "OK<br>";

        echo "Reading response:<br>";
        while ($out = socket_read($socket, 2048)) {
            echo $out;
        }
    }
    socket_close($socket);      
}
?>

编辑: 似乎注释 socket_read 解决了在 Java 中接收消息的问题,但问题仍然是如何从 Java 发送到 PHP

最佳答案

好吧,发现了问题,你必须在 php 中显示行尾在哪里,以便套接字可以发送它,并且它会像魅力一样工作:)

 socket_write ($my_socket, $data."\r\n", strlen ($data."\r\n"));

关于java - 使用 Socket 将 PHP 转为 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43032116/

相关文章:

javascript - 下载 .xls 抛出错误 - 文件不是指定格式

javascript - 我可以通过单击按钮而不使用 AJAX 将 HTML 表格中的行替换为新行吗?

python - 套接字不会通过LAN发送数据

node.js - 使用 NodeJS 发送到 ZeroMQ 云后端

java - liquibase 迁移 2.x 到 3.0 的问题

java - @Service 的 Spring @ComponentScan

java - 没有合适的驱动程序连接到使用 java 的 mysql 数据库 web 主机

php - 同一模型上的 Laravel 多对多关系

javascript - 从 socket.io 获取断开连接的用户

java - JTextPane 不换行?