【发布时间】: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 接收我的数据。
-
是的,问题是我会稍微改变你的代码:))