5

我可以显示接收到的单个图像,但现在我想在我的磁盘上接收和写入多个图像,这些图像将在每 5 秒后从 Android 客户端发送一次。

Socket sock = servsock.accept();
dataInputStream = new DataInputStream(sock.getInputStream());
dataOutputStream = new DataOutputStream(sock.getOutputStream());
System.out.println("Accepted connection : " + sock); 

dataInputStream = new DataInputStream(sock.getInputStream());

byte[] base64=dataInputStream.readUTF().getBytes();

byte[] arr=Base64.decodeBase64(base64);

FileOutputStream imageOutFile = new FileOutputStream("E:\\image.jpeg");
imageOutFile.write(arr);
4

3 回答 3

3

您需要在客户端和服务器之间建立一个协议。

如果图像大小不变,您只需遍历输入流并继续缓冲,直到获得固定数量的字节并写入所有已缓冲的图像。

否则,您需要添加一些指示图像大小的元数据;例如,您可以使用这样的简单格式:

[size1][image1][size2][image2][size3][image3]

其中 [size-i] 占用固定的空间量, [image-i] 是第 i 个图像的大小。

但最重要的是,不要试图执行诸如处理图像、休眠 5 秒并检索下一个图像这样幼稚的协议,因为由于客户端、网络或服务器(您的代码和/或文件系统)。

于 2013-01-05T22:42:05.373 回答
2

小改动:

Socket sock = servsock.accept();
dataInputStream = new DataInputStream(sock.getInputStream());
dataOutputStream = new DataOutputStream(sock.getOutputStream());
System.out.println("Accepted connection : " + sock); 

int imagesCount = dataInputStream.readInt();
for (int imgNum = 0; imgNum < imagesCount; imgNum++) {
    int imgLen = dataInputStream.readInt();
    byte[] base64 = new byte[imgLen];
    dataInputStream.readFully(base64);

    byte[] arr = Base64.decodeBase64(base64);

    FileOutputStream imageOutFile = new FileOutputStream("E:\\image"+imgNum+".jpeg");
    imageOutFile.write(arr);
}
于 2013-01-06T00:08:02.303 回答
0

如果您有多个客户端和一个服务器。尝试多线程。示例代码:

public static void main(String[] args){
    try {
        servSocket = new ServerSocket(xxxx);

        while(true)
        {

            socket = servSocket.accept();

            ClientNum++;

            for(int i=0;i<10;i++){ //this for eg accepts 10 clients, with each client assigned an ID. 

                if(threads[i]==null){
                    sockets[i]=socket; 

在您的“运行”中,您可以通过它们各自的 ID 调用每个这些客户端并执行您需要的 reqd 功能。不知道这有多清楚。如果需要,我可以将我拥有的整个代码发送给你,这有点类似于你正在做的事情。

于 2013-01-08T21:47:40.170 回答