2013-12-12 2 views
3

최근에는 팀 뷰어처럼 프로그램을 만들려고합니다. 그것은 다소 잘되고 있지만, 현재 나는 문제에 직면하고 있습니다.소켓을 통해 이미지 보내기

내 프로그램이 소켓을 통해 이미지를 보내려고합니다. 이 코드를 실행하면 "Image is sent!"라는 결과가 출력되지 않으므로 문제는 ImageIO.write 행에 있다고 생각합니다.

BufferedImage screencapture = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize())); 
try { 
    ImageIO.write(screencapture, "jpg", socket.getOutputStream()); 
    System.out.println("Image should be sent!"); 
} catch (IOException ex){ 
    ex.printStackTrace(); 
} finally { 
    if (socket != null){ 
     try { socket.close(); } catch (IOException ex){} 
    } 
    System.out.println("Image sent and socket closed!"); 
} 

위의 코드에서 보내는 데이터를 소비하는 클라이언트가 상대방에 있습니다. 이 작업을 수행하는 코드는 다음과 같습니다

BufferedImage image = ImageIO.read(socket.getInputStream()); 
JLabel label = new JLabel(new ImageIcon(image)); 
f.getContentPane().add(label); 

지금 내 질문에,이 코드 문제이며, 무엇을 어떻게이 일을 할 수있다

?

+0

되지 않음 답변 : 왜 당신은 그냥 VNC를 사용하지 않는? 기본적으로 NAT 트래버 설이없는 Teamviewer입니다 (TW를 원할 경우 수정해야합니다.)하지만 그게 전부입니다. UltraVNC, TightVNC 등이 있습니다. – Shiki

+0

@Shiki 음, 그냥 다른 프로그램에없는 다른 기능을 추가하고 싶습니다. 일부 프로그램에는 내가 생각할 수있는 몇 가지 기능이있을 수 있지만 모두가 갖고있는 기능은 없습니다. – user2988879

+0

이미지의 길이를 소켓에 쓰지 않을 것입니다 (아마도 필요하지는 않을 것입니다). 둘째,'socket.getOutputStream()'을'BufferedOutputStream'으로 싸울 것을 제안합니다. 마지막으로 OutputStream을 닫고 (전에 플러시) 소켓을 닫았습니다. –

답변

4

사실 코드는 정상적으로 보입니다. 내 컴퓨터에서 잘 작동하는 완전한 코드는 다음과 같습니다.

import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.net.*; 

import javax.imageio.ImageIO; 
import javax.swing.*; 

public class Server { 
    public static void main(String[] args) throws Exception { 
    BufferedImage screencapture = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize())); 
    try (ServerSocket serv = new ServerSocket(25000)) { 
     System.out.println("waiting..."); 
     try (Socket socket = serv.accept()) { 
     System.out.println("client connected"); 
     ImageIO.write(screencapture, "jpg", socket.getOutputStream()); 
     System.out.println("sent"); 
     } 
    } 
    } 
} 

class Client { 
    public static void main(String[] args) throws Exception { 
    try(Socket socket = new Socket("localhost", 25000)){ 
     BufferedImage image = ImageIO.read(socket.getInputStream()); 
     JLabel label = new JLabel(new ImageIcon(image)); 
     JFrame f = new JFrame("vnc"); 
     f.getContentPane().add(label); 
     f.pack(); 
     f.setVisible(true); 
    } 
    } 
} 

이미지를 보낸 후에 소켓을 닫을 때에 만 작동합니다. 동일한 소켓을 통해 몇 개의 이미지를 보내려고하면 오류가 발생합니다. https://stackoverflow.com/a/6973863/211205을 참조하십시오.

+0

고마워, 이건 나를 위해 완벽하게 작동했습니다. 몇 가지 작은 것들을 바꿔야했지만 지금은 모든 것이 내가 원하는대로 작동합니다. – user2988879

1

나는이 일을 앞두고 내 블로그에 해결책을 게시했습니다. 완전한 소스 코드를 확인하십시오. 너의 먹이가 다시 필요해.

이렇게하려면 스레드, 소켓 및 이미지 쓰기를 읽어야합니다.

http://javabelazy.blogspot.in/2013/10/sending-screenshot-from-client-to.html

BufferedImage screenshot = robot.createScreenCapture(new Rectangle(dimensions)); 
ImageIO.write(screenshot,"png",serverSocket.getOutputStream()); 
ImageIO.write(img, "png", new File(fileName+".png")) 
관련 문제