2013-01-05 71 views
5

读我可以显示一个图像接收,但是现在我想接收并写我的磁盘上的多张图片,将来自Android客户端每5秒后送出。如何从插座中使用DataInputStream类

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

你需要建立你的客户端和服务器之间的协议

如果图像尺寸是恒定的,你只需要循环输入流,并保持缓冲,直到你得到字节固定数量和写入所有已缓存的图像。

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

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

与[大小-1]占据空间的固定量和[图像-1]的第i个图像的大小。

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

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); 
} 
+1

VG但我想摆脱的base64编码的,只是使用DataInputStream.readFully()。 – EJP

+1

在这种情况下... '为(.....){ INT imgLen = dataInputStream.readInt(); 字节[] ARR =新的字节[imgLen]; dataInputStream.readFully(arr); // [... cut ...]' – ggrandes

+0

我在线程“main”java.lang.OutOfMemoryError中收到此错误异常:Java堆空间 \t at server.main(server.java:52) –

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功能需要。不知道这有多清楚。如果需要,我可以向您发送我所拥有的与您正在做的有点相似的完整代码。