2013-02-14 65 views
-1

朋友! 我想在PC上獲得遠程PC屏幕!我試圖用UDP編寫,現在我想寫成TCP協議,但有一些問題!如果有人能告訴我是什麼,我會感謝這個問題......這裏是我的代碼: Server.java如何通過java中的TCP socket發送圖像

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

請幫助解決這個問題!如果你有另一個解決方案建議!謝謝!

回答

2

你假設在套接字上的每次讀取都會傳送一個完整的圖像。你不能假設這一點。它可能只提供一個字節。

幸運的是,這是比簡單得多:

buffImg = Imageio.read(in); 

這也是在發送簡單得多。你不需要這個文件。只需致電

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