[英]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.