can';t在java中从服务器向客户端发送图像

can';t在java中从服务器向客户端发送图像,java,swing,sockets,networking,Java,Swing,Sockets,Networking,编辑#2: chuck指出了一个bug,所以我修复了它,非常感谢,(我只运行了一次图像发送器) 现在,如果还有人能够提供帮助,我在客户端只得到一个错误,好吗。 如果没有,它仍然可以,因为现在我只有一个错误要修复,所以谢谢 java.io.EOFException at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source) at java.io.ObjectInputStream$BlockDataI

编辑#2: chuck指出了一个bug,所以我修复了它,非常感谢,(我只运行了一次图像发送器) 现在,如果还有人能够提供帮助,我在客户端只得到一个错误,好吗。 如果没有,它仍然可以,因为现在我只有一个错误要修复,所以谢谢

java.io.EOFException
    at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)
    at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source)
    at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
    at java.io.ObjectInputStream.<init>(Unknown Source)
    at Client.run(Client.java:45)
    at java.lang.Thread.run(Unknown Source)
我在服务器端(发送图像)收到了很多错误(太多了,它们都是一样的)

线程“thread-91”中的异常线程“thread-69”中的异常

主要内容:

服务器使用ImageSender发送图片:

import java.awt.AWTException;
import java.awt.Robot;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;


public class Server extends Thread {
    private ServerSocket ssocket;
    private Socket connection;
    private InputStream in;
    private ObjectInputStream out;
    private Robot robot;

    public Server()
    {
        try {
            robot=new Robot();
        } catch (AWTException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Thread t=new Thread(this);
        t.start();
    }
    public void run()
    {
        try {
            ssocket=new ServerSocket(5000);
            System.out.println("waiting for connections");
            connection=ssocket.accept();
            System.out.println("Got connection from"+connection.getInetAddress().getHostName());
            System.out.println("2");
            while (connection.isConnected()==true)
                {
                System.out.println("3");
                ImageSender sender = new ImageSender(connection);
                    sender.start();
                }
            /*
            out.close();
            in.close();
            connection.close();
            ssocket.close();
            */
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;

import javax.swing.ImageIcon;

class ImageSender extends Thread{       
    Socket connection;
    Robot robot; // Used to capture screen
    Rectangle rectangle; // Used to represent screen dimensions
    ImageSender(Socket sc){
        connection=sc;
    }
    public void run(){
        try{
            this.robot = new Robot();
            Toolkit t=Toolkit.getDefaultToolkit();
            Rectangle rect=new Rectangle(t.getScreenSize());
            while(true){
                System.out.println("10");
                OutputStream out=connection.getOutputStream();
                ObjectOutputStream oout=new ObjectOutputStream(out);
                BufferedImage b_img=robot.createScreenCapture(rect);
                ImageIcon img=new ImageIcon(b_img);
                System.out.println("12");
                oout.writeObject(img);
                System.out.println("133");
                oout.close();   
                out.close();
            }
        }catch(Exception e){System.out.println(e);}
    }   
}
图像发送者:

import java.awt.AWTException;
import java.awt.Robot;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;


public class Server extends Thread {
    private ServerSocket ssocket;
    private Socket connection;
    private InputStream in;
    private ObjectInputStream out;
    private Robot robot;

    public Server()
    {
        try {
            robot=new Robot();
        } catch (AWTException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Thread t=new Thread(this);
        t.start();
    }
    public void run()
    {
        try {
            ssocket=new ServerSocket(5000);
            System.out.println("waiting for connections");
            connection=ssocket.accept();
            System.out.println("Got connection from"+connection.getInetAddress().getHostName());
            System.out.println("2");
            while (connection.isConnected()==true)
                {
                System.out.println("3");
                ImageSender sender = new ImageSender(connection);
                    sender.start();
                }
            /*
            out.close();
            in.close();
            connection.close();
            ssocket.close();
            */
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;

import javax.swing.ImageIcon;

class ImageSender extends Thread{       
    Socket connection;
    Robot robot; // Used to capture screen
    Rectangle rectangle; // Used to represent screen dimensions
    ImageSender(Socket sc){
        connection=sc;
    }
    public void run(){
        try{
            this.robot = new Robot();
            Toolkit t=Toolkit.getDefaultToolkit();
            Rectangle rect=new Rectangle(t.getScreenSize());
            while(true){
                System.out.println("10");
                OutputStream out=connection.getOutputStream();
                ObjectOutputStream oout=new ObjectOutputStream(out);
                BufferedImage b_img=robot.createScreenCapture(rect);
                ImageIcon img=new ImageIcon(b_img);
                System.out.println("12");
                oout.writeObject(img);
                System.out.println("133");
                oout.close();   
                out.close();
            }
        }catch(Exception e){System.out.println(e);}
    }   
}
客户:

import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.ImageIcon;


public class Client extends Frame implements Runnable {
    Socket cSocket;
    OutputStream out;
    ObjectOutputStream oout;
    Thread t;
    String serverIp;
    public Client()
    {
        Toolkit tk = Toolkit.getDefaultToolkit();
        this.setSize(tk.getScreenSize());

        this.setExtendedState(Frame.MAXIMIZED_BOTH); 
        this.setUndecorated(true);

        this.serverIp="localhost";

        Thread t=new Thread(this);
        t.start();  
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        try {
            cSocket = new Socket(serverIp, 5000);
            out=cSocket.getOutputStream(); 
            oout=new ObjectOutputStream(out);
            this.setVisible(true);
            while(true){
                InputStream in=cSocket.getInputStream();
                ObjectInputStream oin=new ObjectInputStream(in);                        
                try {
                    ImageIcon img = (ImageIcon)oin.readObject();
                    Graphics g=getGraphics();
                    img.paintIcon(this,g,0,0);
                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }

}

strong text

好吧,下面的内容看起来很奇怪。继续创建和启动ImageSender()对象(线程)。这看起来像一个严重的错误

 while (connection.isConnected()==true) 
 { 
   System.out.println("3"); 
   ImageSender sender = new ImageSender(connection); 
   sender.start(); 
 } 
请澄清——当你说它不起作用时,你是什么意思?会发生什么?你有错误吗?你有一张空白的照片吗?
 while (connection.isConnected()==true) 
 { 
   System.out.println("3"); 
   ImageSender sender = new ImageSender(connection); 
   sender.start(); 
 }