寻求适配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
相关产品推荐
相关产品推荐

