You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求适配Java Socket图片上传客户端的PHP服务端处理代码

PHP Socket图片上传服务端实现(适配Java客户端)

需求背景

已有Java编写的Socket图片上传客户端,需编写等价的PHP服务端代码,实现读取客户端发送的图片流并处理。

Java客户端代码

Socket soc;
BufferedImage img = null;
soc = new Socket("127.0.0.1", 4000);       
try 
{
    img = ImageIO.read(new File("blake-rig.jpg"));
    ByteArrayOutputStream baos = new ByteArrayOutputStream();           
    ImageIO.write(img, "jpg", baos);
    baos.flush();          
    byte[] bytes = baos.toByteArray();
    baos.close();                       
    OutputStream out = soc.getOutputStream();
    DataOutputStream dos = new DataOutputStream(out);            
    dos.writeInt(bytes.length);
    dos.write(bytes, 0, bytes.length);          
    dos.close();
    out.close();            
}
catch (Exception ex)
{
    System.err.println("Exception " + ex);
    soc.close();
}
soc.close();

参考Java服务端代码

class Server {
  public static void main(String  args[]) throws Exception{
  ServerSocket server=null;
  Socket socket;
  server = new ServerSocket(4000);
  System.out.println("Server Waiting for image");

  socket = server.accept();
  System.out.println("Client connected.");
  
  InputStream in = socket.getInputStream();
  DataInputStream dis = new DataInputStream(in);

  int len = dis.readInt();
  System.out.println("Image Size: " + len/1024 + "KB");
  
  byte[] data = new byte[len];
  dis.readFully(data);
  dis.close();
  in.close();

  InputStream ian = new ByteArrayInputStream(data);
  BufferedImage bImage = ImageIO.read(ian);
  }
}

PHP服务端实现方案

PHP通过socket_*系列函数即可实现对应逻辑,核心需处理两个关键点:读取Java客户端发送的4字节大端序整数(图片长度),再按长度读取完整图片字节流。

完整PHP服务端代码

<?php
// 创建TCP Socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("socket_create() 失败: " . socket_strerror(socket_last_error()) . "\n");
}

// 绑定本地端口4000
$result = socket_bind($socket, '127.0.0.1', 4000);
if ($result === false) {
    die("socket_bind() 失败: " . socket_strerror(socket_last_error($socket)) . "\n");
}

// 监听连接
$result = socket_listen($socket);
if ($result === false) {
    die("socket_listen() 失败: " . socket_strerror(socket_last_error($socket)) . "\n");
}

echo "服务端等待图片上传...\n";

// 接受客户端连接
$clientSocket = socket_accept($socket);
if ($clientSocket === false) {
    die("socket_accept() 失败: " . socket_strerror(socket_last_error($socket)) . "\n");
}
echo "客户端已连接\n";

// 读取4字节的图片长度(Java用大端序,PHP用unpack('N')解析)
$lenBytes = socket_read($clientSocket, 4);
if (!$lenBytes) {
    die("读取图片长度失败\n");
}
$imageLen = unpack('N', $lenBytes)[1];
echo "图片大小: " . round($imageLen / 1024, 2) . "KB\n";

// 循环读取完整的图片数据
$imageData = '';
$remaining = $imageLen;
while ($remaining > 0) {
    $chunk = socket_read($clientSocket, $remaining);
    if ($chunk === false) {
        die("读取图片数据失败\n");
    }
    $imageData .= $chunk;
    $remaining -= strlen($chunk);
}

// 将图片保存到本地(也可在此处做其他处理)
file_put_contents('received_image.jpg', $imageData);
echo "图片保存成功\n";

// 关闭连接
socket_close($clientSocket);
socket_close($socket);
?>

关键细节说明

  • 字节序适配:Java的DataOutputStream.writeInt()采用大端字节序,PHP通过unpack('N', $lenBytes)解析(N代表无符号大端长整数),确保长度读取准确。
  • 完整数据读取:socket_read可能无法一次性获取全部数据,需循环读取直到拿到完整的$imageLen字节。
  • 基础错误处理:代码包含核心错误判断,生产环境可根据需求扩展异常捕获和日志记录逻辑。

内容的提问来源于stack exchange,提问作者Justin Farrell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 08:50:45