如何使用datainputstream从套接字读取

时间:2013-01-05 22:16:54

标签: java android java-server

我可以显示收到的单个图像,但现在我想在我的磁盘上接收和写入多个图像,这些图像将在每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);

3 个答案:

答案 0 :(得分:3)

您需要在客户端和服务器之间构建协议

如果图像大小是常量,则只需循环输入流并保持缓冲,直到获得固定的字节数并写入所有已缓冲的图像。

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

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

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

但最重要的是不要试图做一个像处理图像这样天真的协议,睡5秒并检索下一个,因为由于客户端,网络或服务器,每个图像之间的确切时间可能会有很大差异(你的代码和/或文件系统。)

答案 1 :(得分: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);
}

答案 2 :(得分: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功能。不确定这是多么清楚。如果需要,我可以向您发送我所拥有的完整代码,这与您正在进行的操作类似。