簡體   English   中英

通過服務器將BufferedImage發送到另一個Java客戶端

[英]Sending BufferedImage over server to another java client

我正在嘗試通過套接字服務器將BufferedImage發送到另一個客戶端。 請在下面張貼我的代碼。 當我運行服務器並通過發送客戶端和接收客戶端連接到服務器時,一切都就在那兒。 除非服務器已經打印了“名稱正在嘗試連接到:”,否則服務器甚至不應該接收任何內容,它只是坐在那里。 我不知道為什么它什么都不做。

發送的客戶端: http : //pastebin.com/X4z55Hdp

收到的客戶端: http : //pastebin.com/MB9qEyGy

發送和接收的服務器源:

package core;

import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.Socket;

import utilities.Tools;

public class Node implements Runnable {

private String name;
private Socket socket;
private boolean isApp;

public Node(Socket s, String name) {
    this.setName(name);
    this.setSocket(s);
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public Socket getSocket() {
    return socket;
}

public void setSocket(Socket socket) {
    this.socket = socket;
}

public void run() {
    while (true) {
        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    socket.getInputStream()));
            PrintWriter out = new PrintWriter(socket.getOutputStream(),
                    true);
            if (in.readLine() != null) {
                // Tools.log("[INPUT] " + in.readLine());
                String i = in.readLine();
                if (i.contains("set name ")) {
                    String n = i.replace("set name ", "");
                    Tools.log("Changing " + name + " to " + n);
                    this.name = n;
                    if (n.contains("_app")) {
                        this.isApp = true;
                    }
                } else {
                    String toFind = name + "_app";
                    if (isApp)
                        toFind = name.replace("_app", "");
                    Tools.log(name + " is attempting to connect to: "
                            + toFind);
                    for (Node n : Server.nodes) {
                        if (n.getName().equals(toFind)) {
                            Tools.log(n.getName() + " found, sending data");
                            ObjectOutputStream outToNode = new ObjectOutputStream(
                                    n.getSocket().getOutputStream());
                            ObjectInputStream inFromClient = new ObjectInputStream(
                                    socket.getInputStream());
                            BufferedImage img = (BufferedImage) inFromClient
                                    .readObject();
                            if (img != null) {
                                outToNode.writeObject(img);
                            }
                        }
                    }
                }
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
}

BufferedImage必須被序列化。 您可以將圖像轉換為字節數組,一旦讀取字節數組,就將其轉換回圖像。

當使用BufferedImage調用writeObject()時,發送方無疑會收到NotSerializableException ,因為BufferedImage沒有實現Serializable. 因此,您也無法從readObject()調用中獲得一個。 您必須將BufferedImage轉換為字節以進行發送,並在接收時再次返回。 看一下javax.imageio的一種實現方法。

暫無
暫無

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

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