如何在java中通过TCP套接字发送图像

时间:2013-02-14 06:49:39

标签: image sockets tcp

朋友们! 我想在我的电脑上安装远程PC屏幕!我曾尝试用UDP编写,现在我想用TCP协议写它,但是有一些问题!如果有人能告诉我这是什么问题我会很感激......这是我的代码: Server.java

public Server(int port){
    this.G_PORT = port;
}
void sendMessage() throws IOException, AWTException{
    servSocket = new ServerSocket(G_PORT);
    System.out.println("Waiting...");
    cSocket = servSocket.accept();
    System.out.println("Server has connected to " + cSocket.getRemoteSocketAddress() + " on " + cSocket.getPort() +" port");

        BufferedOutputStream buffOS = new BufferedOutputStream(cSocket.getOutputStream());
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        Rectangle r = new Rectangle(d);

        KeyStroke keyStr = KeyStroke.getKeyStroke("ESCAPE");

        FileInputStream fileIN = null;
        OutputStream out = null;

    //while(keyStr.getKeyCode() != 27){
        bot = new Robot();
        buffIMG = bot.createScreenCapture(r);
        ImageIO.write(buffIMG, "jpeg", new File("D:\\ScreenShots\\test.jpeg"));
        fileIN = new FileInputStream(new File("D:\\ScreenShots\\test.jpeg"));
        out = cSocket.getOutputStream();
        int read, readTotal = 0;
        byteToIMG = new byte[BUFF_SIZE];

        while((read =  fileIN.read())!= -1){
            out.write(byteToIMG,0,read);
            System.out.println("IMG sended");
        }
    //}
    out.close();
    fileIN.close();
    cSocket.close();        
} 

和Client.java

void recievMessage(long starTime) throws UnknownHostException, IOException{
    cSocket = new Socket(InetAddress.getByName(G_HOST), G_PORT);
    System.out.println("Connected");
    JFrame frame = new JFrame("My frame");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    JLabel label = new JLabel();
    ImageIcon icon;

    InputStream in = cSocket.getInputStream();
    byteToIMG = new byte[BYTE_SIZE];
    int read;
    int readTotal = 0;
        while((read = in.read(byteToIMG)) != -1){
            readTotal += read;
            InputStream imgIN = new ByteArrayInputStream(byteToIMG);
            buffIMG = ImageIO.read(imgIN);
            icon = new ImageIcon();
            icon.setImage(buffIMG);
            label.setIcon(icon);
            frame.getContentPane().add(label, BorderLayout.CENTER);
            frame.pack();
            System.out.println("IMG recieved");
        }
} 

请帮忙解决这个问题!如果您有其他解决方案建议!谢谢!

1 个答案:

答案 0 :(得分:2)

您假设套接字上的每次读取都会传送一整个图像。你不能假设。它可能只提供一个字节。

幸运的是,它比这简单得多:

buffImg = Imageio.read(in);

发件人也简单多了。您不需要该文件。只需致电

ImageIO.write(buffImg, "jpeg", out);