簡體   English   中英

如何使用datainputstream從套接字讀取

[英]How to read from socket using datainputstream

我可以顯示接收到的單個圖像,但是現在我想在磁盤上接收並寫入多個圖像,這些圖像將每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);

您需要在客戶端和服務器之間建立協議

如果圖像大小恆定,則只需要遍歷輸入流並保持緩沖,直到獲得固定的字節數並寫入所有已緩沖的圖像為止。

否則,您需要添加一些指示圖像大小的元數據 例如,您可以使用以下簡單格式:

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

[size-i]占據固定的空間量,[image-i]則是第i個圖像的大小。

但是最重​​要的是,不要試圖像處理圖像,休眠5秒然后檢索下一個圖像那樣天真的協議,因為由於客戶端,網絡或服務器的不同,每個圖像之間的確切時間可能會有很大差異(您的代碼和/或文件系統)。

小變化:

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

如果您有多個客戶端和一個服務器。 嘗試多線程。 示例代碼片段:

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函數。 不知道這有多清楚。 如果需要,我可以將您擁有的全部代碼發送給您,這與您正在執行的操作類似。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM