【问题标题】:PHP to Java using SocketPHP 到 Java 使用 Socket
【发布时间】:2017-08-19 07:36:39
【问题描述】:

我正在尝试使用套接字在 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_read 行,它成功了,test 在 java 控制台中接收并打印。
  • @MaMadLord 啊,但是我如何阅读从 Java 发送到 PHP 的消息?
  • 好的,我发现了接收问题,您需要使用"\r\n" 确定行尾在哪里,例如使用$data 初始化"test\r\n",但我仍然不知道读数是什么问题。
  • 哦,已经解决了,谢谢。 PHP 现在也从 Java 接收我的数据。
  • 是的,问题是我会稍微改变你的代码:))

标签: java php sockets


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-05-09
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    相关资源
    最近更新 更多