Ошибка программирования сокета порта Java - PullRequest
0 голосов
/ 29 апреля 2010

Я работал над программой клиент-сервер java с использованием сокетов портов. Цель этой программы состоит в том, чтобы клиент сделал снимок экрана машины, на которой он работает, разбил информацию RGB этого изображения на целые и массивы, а затем отправил эту информацию на сервер, где он был преобразован в новый файл изображения. Я запускаю эти файлы с двумя другими небольшими классами, которые создают экземпляры объектов этих двух файлов и выполняют их методы run (). Однако при запуске программы возникают следующие две ошибки:

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

1 Ответ

0 голосов
/ 29 апреля 2010

Вы не показываете нам, как вы запускаете клиент или сервер. Похоже, вы не используете потоки в том, что требуется для сокета IO

У вас много ошибок, я даже не знаю, с чего начать.

Вы звоните read() в BufferedReader Возвращает целые числа, но это целое число, которое колеблется в диапазоне 0-255 Да, я знаю, что это плохой интерфейс, но вы читаете только байт, а не всю ширину и высоту.

Я предлагаю разбить вашу программу и убедиться, что вы понимаете, как сначала отправить один байт. Напишите программу, которая использует сокеты для отправки Hello World. Учитывая код, который вы показали, я не думаю, что вы даже можете сделать это.

...