如何将文件从 php 客户端发送到带有套接字的 java 服务器


How to send file from php client to java server with sockets

我想从php客户端传输java服务器的套接字文件。

Java的Java是很好的工作。

但是 php 不能将文件传输到 java 服务器。

我需要从java代码转换为php代码或我想知道通过其他方法从php客户端传输java服务器的套接字文件。请帮帮我...谢谢!!!

  1. Java 客户端代码。

    File file = new File(fileName);
    Socket socket = new Socket("localhost", 20225);
    ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
    ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
    oos.writeObject(file.getName());
    FileInputStream fis = new FileInputStream(file);
    byte [] buffer = new byte[100];
    Integer bytesRead = 0;
    while ((bytesRead = fis.read(buffer)) > 0) {
        oos.writeObject(bytesRead);
        oos.writeObject(Arrays.copyOf(buffer, buffer.length));
    }
    oos.close();
    ois.close();
    
  2. Java 服务器代码

    ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
    ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
    FileOutputStream fos = null;
    byte [] buffer = new byte[BUFFER_SIZE];
    String filename = null;
    Map<String, Object> retMap = new HashMap<String, Object>();
    // 1. Read file name.
    Object obj = ois.readObject();
    try {
        filename = Config.getInstance().getProperties("dispatcher.policy") + obj;
        fos = new FileOutputStream(new File(filename));   
        // 2. Read file to the end.
        Integer bytesRead = 0;
        do {
            obj = ois.readObject();
            bytesRead = (Integer)obj;
            obj = ois.readObject();
            buffer = (byte[])obj;
            // 3. Write data to output file.
            fos.write(buffer, 0, bytesRead);
        } while (bytesRead == BUFFER_SIZE);
        logger.info("File transfer success : {} ", filename );
    
        fos.close();
    }catch(Exception e){
    }
    oos.writeObject("OK");
    ois.close();
    oos.close();
    
$fp = stream_socket_client("tcp://localhost:20225", $error_number, $error_string);
if ( !$fp ) {
    # output what went wrong with a new line at the end
    echo "$error_number ($error_string)'n";
} else {
    fwrite($fp, file_get_contents(FILE_NAME));
}
# uncomment next line if you happen to have more code below
# fclose($fp); # does what it says - closes the resource

stream_socket_client() 返回流资源,如果失败,则返回 false。它可能需要另外三个参数:超时、标志和上下文 - 如果需要更改默认值,请参阅文档以获取更多信息。

已 tcp:// 作为套接字传输,顺便说一下,这是默认值。我把它作为一个提示,你可以使用其他传输,最有可能来自互联网域列表:TCP,UDP,SSL和TLS或其他Unix域列表:Unix和UDG。当使用localhost时,后者是一种更快的方法,但是您需要一个支持该操作系统的操作系统,并且(可能的话,在java中可能的话)Java服务器部分的正确代码。

fwrite() 是一种二进制安全写入 - 它只是将作为第二个参数传递的二进制数据写入作为第一个参数传递的资源。

file_get_contents() 也以二进制安全的方式完全按照其名称所说的方式执行。第一个参数是文件的路径。可能需要更多参数 - 如果默认值似乎不合适,请参阅文档。