2010-04-28 111 views
0

我一直在使用端口套接字的java客戶端服務器程序。這個程序的目標是讓客戶端截取正在運行的機器的截圖,將這個圖像的RGB信息分解成整數和數組,然後將這些信息發送到服務器,在那裏重建爲新的圖像文件。我用另外兩個小類運行這些文件,這兩個小類實例化這兩個文件的對象並執行它們的run()方法。然而,當我運行該程序,我遇到了以下兩個錯誤:Java端口套接字編程錯誤

  1. 服務器接收到的第一個數字,不管它的價值是什麼根據客戶端,始終是49
  2. 客戶端只發送(或服務器只接收?)第一個值,然後程序永遠掛起。

任何有關爲什麼會發生這種情況的想法,以及我能做些什麼來解決它?客戶端和服務器的代碼如下。

謝謝!

客戶:

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferedImage; 
import java.io.*; 
import java.net.Socket; 
import java.text.SimpleDateFormat; 
import java.util.*; 
import javax.swing.*; 
import javax.swing.Timer; 


public class ViewerClient implements ActionListener{ 

private Socket vSocket; 
private BufferedReader in; 
private PrintWriter out; 
private Robot robot; 
// static BufferedReader orders = null; 

public ViewerClient() throws Exception{ 
    vSocket = null; 
    in = null; 
    out = null; 
    robot = null; 
} 

public void setVSocket(Socket vs) { 
    vSocket = vs; 
} 

public void setInput(BufferedReader i) { 
    in = i; 
} 

public void setOutput(PrintWriter o) { 
    out = o; 
} 

public void setRobot(Robot r) { 
    robot = r; 
} 

/*************************************************/ 

public Socket getVSocket() { 
    return vSocket; 
} 

public BufferedReader getInput() { 
    return in; 
} 

public PrintWriter getOutput() { 
    return out; 
} 

public Robot getRobot() { 
    return robot; 
} 



public void run() throws Exception{ 
    int speed = 2500; 
    int pause = 5000; 
    Timer timer = new Timer(speed, this); 
    timer.setInitialDelay(pause); 
// System.out.println("CLIENT: Set up timer."); 
    try { 
    setVSocket(new Socket("Alex-PC", 4444)); 
    setInput(new BufferedReader(new InputStreamReader(getVSocket().getInputStream()))); 
    setOutput(new PrintWriter(getVSocket().getOutputStream(), true)); 
    setRobot(new Robot()); 
// System.out.println("CLIENT: Established connection and IO ports."); 
// timer.start(); 
    captureScreen(nameImage()); 
    }catch(Exception e) { 
    System.err.println(e); 
    } 

} 

public void captureScreen(String fileName) throws Exception{ 
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
    Rectangle screenRectangle = new Rectangle(screenSize); 
    BufferedImage image = getRobot().createScreenCapture(screenRectangle); 
    int width = image.getWidth(); 
    int height = image.getHeight(); 
    int[] pixelData = new int[(width * height)]; 
    image.getRGB(0,0, width, height, pixelData, width, height); 
    byte[] imageData = new byte[(width * height)]; 
    String fromServer = null; 

    if((fromServer = getInput().readLine()).equals("READY")) { 
    sendWidth(width); 
    sendHeight(height); 
    sendArrayLength((width * height)); 
    sendImageInfo(fileName); 
    sendImageData(imageData); 

    }  


} 

public String nameImage() throws Exception { 
    String dateFormat = "yyyy-MM-dd HH-mm-ss"; 
    Calendar cal = Calendar.getInstance(); 
    SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); 
    String fileName = sdf.format(cal.getTime()); 
    return fileName; 
} 

public void sendArrayLength(int length) throws Exception { 
    getOutput().println("SENDING ARRAY LENGTH..."); 
    getOutput().println(length); 
} 

public void sendWidth(int width) throws Exception { 
    getOutput().println("SENDING IMAGE WIDTH..."); 
    getOutput().println(width); 
} 

public void sendHeight(int height) throws Exception { 
    getOutput().println("SENDING IMAGE HEIGHT..."); 
    getOutput().println(height); 
} 

public void sendImageData(byte[] imageData) throws Exception { 
    getOutput().println("SENDING IMAGE..."); 
    for(int i = 0; i < imageData.length; i++) { 
    getOutput().println(imageData[i]); 
    } 
} 

public void sendImageInfo(String info) throws Exception { 
    getOutput().println("SENDING IMAGE INFO..."); 
    getOutput().println(info); 
} 


public void actionPerformed(ActionEvent a){ 
    String message = null; 
    try { 
    if((message = getInput().readLine()).equals("PROCESSING...")) { 
    if((message = getInput().readLine()).equals("IMAGE RECIEVED SUCCESSFULLY.")) { 
    captureScreen(nameImage()); 
    } 
    } 
    }catch(Exception e) { 
    JOptionPane.showMessageDialog(null, "Problem: " + e); 
    } 

} 

} 

SERVER:

import java.awt.image.BufferedImage; 
import java.io.*; 
import java.net.*; 
import javax.imageio.ImageIO; 


public class ViewerServer { 

private ServerSocket vServer; 
private Socket vClient; 
private PrintWriter out; 
private BufferedReader in; 
private byte[] imageData; 
private int width; 
private int height; 
private String imageInfo; 
private int[] rgbData; 
private boolean active; 

public ViewerServer() throws Exception{ 
    vServer = null; 
    vClient = null; 
    out = null; 
    in = null; 
    imageData = null; 
    width = 0; 
    height = 0; 
    imageInfo = null; 
    rgbData = null; 
    active = true; 
} 

public void setVServer(ServerSocket vs) { 
    vServer = vs; 
} 

public void setVClient(Socket vc) { 
    vClient = vc; 
} 

public void setOutput(PrintWriter o) { 
    out = o; 
} 

public void setInput(BufferedReader i) { 
    in = i; 
} 

public void setImageData(byte[] imDat) { 
    imageData = imDat; 
} 

public void setWidth(int w) { 
    width = w; 
} 

public void setHeight(int h) { 
    height = h; 
} 

public void setImageInfo(String im) { 
    imageInfo = im; 
} 

public void setRGBData(int[] rd) { 
    rgbData = rd; 
} 

public void setActive(boolean a) { 
    active = a; 
} 

/***********************************************/ 


public ServerSocket getVServer() { 
    return vServer; 
} 

public Socket getVClient() { 
    return vClient; 
} 

public PrintWriter getOutput() { 
    return out; 
} 

public BufferedReader getInput() { 
    return in; 
} 

public byte[] getImageData() { 
    return imageData; 
} 

public int getWidth() { 
    return width; 
} 

public int getHeight() { 
    return height; 
} 

public String getImageInfo() { 
    return imageInfo; 
} 

public int[] getRGBData() { 
    return rgbData; 
} 

public boolean getActive() { 
    return active; 
} 


public void run() throws Exception{ 
    connect(); 
    setActive(true); 
    while(getActive()) { 
    recieve(); 
    } 
    close(); 
} 


public void recieve() throws Exception{ 
    String clientStatus = null; 
    int clientData = 0; 

// System.out.println("SERVER: Sending ready message..."); 
    getOutput().println("READY"); 
// System.out.println("SERVER: Ready message sent."); 
    if((clientStatus = getInput().readLine()).equals("SENDING IMAGE WIDTH...")) { 
    setWidth(getInput().read()); 
    System.out.println("Width: " + getWidth()); 
    } 
    if((clientStatus = getInput().readLine()).equals("SENDING IMAGE HEIGHT...")) { 
    setHeight(getInput().read()); 
    System.out.println("Height: " + getHeight()); 
    } 
    if((clientStatus = getInput().readLine()).equals("SENDING ARRAY LENGTH...")) { 
    clientData = getInput().read(); 
    setImageData(new byte[clientData]); 
    System.out.println("Array length: " + clientData); 
    } 
    if((clientStatus = getInput().readLine()).equals("SENDING IMAGE INFO...")) { 
    setImageInfo(getInput().readLine()); 
    System.out.println("Image Info: " + getImageInfo()); 
    } 
    if((clientStatus = getInput().readLine()).equals("SENDING IMAGE...")) { 
    for(int i = 0; i < getImageData().length; i++) { 
    getImageData()[i] = ((byte)getInput().read()); 
    } 
    } 

    if((clientStatus = getInput().readLine()).equals("FINISHED.")) { 
    getOutput().println("PROCESSING..."); 
    setRGBData(new int[getImageData().length]); 
    for(int i = 0; i < getRGBData().length; i++) { 
    getRGBData()[i] = getImageData()[i]; 
    } 
    BufferedImage image = null; 
    image.setRGB(0, 0, getWidth(), getHeight(), getRGBData(), getWidth(), getHeight()); 
    ImageIO.write(image, "png", new File(imageInfo + ".png")); //create an image file out of the screenshot 

    getOutput().println("IMAGE RECIEVED SUCCESSFULLY."); 
    } 
} 

public void connect() throws Exception { 
    setVServer(new ServerSocket(4444)); //establish server connection 
// System.out.println("SERVER: Connection established."); 
    setVClient(getVServer().accept()); //accept client connection request 
// System.out.println("SERVER: Accepted connection request."); 
    setOutput(new PrintWriter(vClient.getOutputStream(), true)); //set up an output channel 
    setInput(new BufferedReader(new InputStreamReader(vClient.getInputStream()))); //set up an input channel 
// System.out.println("SERVER: Created IO ports."); 
} 

public void close() throws Exception { 
    getOutput().close(); 
    getInput().close(); 
    getVClient().close(); 
    getVServer().close(); 
} 
} 
+0

在客戶端代碼中,您沒有初始化imageData數組,您只是創建了大小爲width * height的數組,並將其發送到服務器,而無需使用圖像對其進行初始化。這可能會給出輸出49.請發佈輸出日誌,這可能有助於追蹤問題。 – krishna 2011-06-02 08:45:26

回答

0

你不告訴我們你是如何運行的客戶端或服務器。看起來你並沒有使用任何一個插槽所需的線程io

你有許多許多錯誤,我甚至不知道從哪裏開始。

您正在呼叫read() in BufferedReader它返回一個整數,但它的整數範圍只有0-255。是的,我知道它是一個糟糕的界面,但是你只能讀取一個字節,而不是完整的寬度和高度。

我的建議是打破你的程序,並確保你知道如何首先發送一個字節。編寫一個使用套接字發送的程序Hello World。鑑於你已經顯示的代碼,我認爲你甚至不能這樣做。

+0

嗯,我一定錯過了備忘錄:)自從何時線程需要做套接字IO? – 2010-04-28 21:12:34

+0

@Niko如果你想在一個端口上接受多個連接,並且如果你在輸入/輸出流上進行的瑣碎轉移,你將需要線程。是的,你不需要使用NIO和套接字選擇的線程,但這些是更高級的主題 – Pyrolistical 2010-04-28 21:23:45

+0

我想你認爲線程是「容易的」。孩子們這幾天... :) – 2010-04-28 21:41:24