0

サーバーは稼働しており、クライアントはサーバーに接続できますが、クライアントがビデオを送信しているとは思えません。クライアントのコードは次のとおりです。「ビデオの送信」を一度だけ出力します。

これを行うより良い方法がわからないため、クライアントの画面の多くのスクリーンショットを介してビデオを送信しようとしています。

import java.net.Socket;
import java.awt.AWTException;
import java.awt.HeadlessException;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.RenderedImage;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;

import javax.imageio.ImageIO;
import javax.swing.JOptionPane;

public class Main extends Thread{
    private static Socket socket;
    private static PrintWriter printWriter;
    private static String inputLine;
    private static Thread thread;
    private static BufferedReader bufferedReader;
    private static boolean Connected = true;

    public static void main(String[] args) {
        // System.out.println("What is the computer's IP address?");
        String Ip_addr = JOptionPane
                .showInputDialog("Enter the IP number of the server to connect: ");
        String IP = Ip_addr;
        while (Connected) {
            Connected = true;
            try {
                System.out.println("Client running...");
                socket = new Socket(IP, 8080);
                Connected = false;
                bufferedReader = new BufferedReader(
                        new InputStreamReader(socket.getInputStream()));



            } catch (Exception e) {

            }
        }
        System.out.println("thread running");
        thread = new Thread(new Main());
        thread.start();

    }

    public void run() {
        while(true) {
            RenderedImage screenShot;
            try {
                if((inputLine = bufferedReader.readLine()) != null){
                    System.out.println(inputLine);
                    JOptionPane.showMessageDialog(null, inputLine);
                }
                screenShot = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
                ImageIO.write(screenShot, "PNG", socket.getOutputStream());
                System.out.println("Sending video");
                Thread.sleep(10);
            } catch (HeadlessException | AWTException e) {
                e.printStackTrace();

            } catch (IOException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
}

おそらく、スレッドに関する知識が不足しているためです。次に、ビデオ用のスレッドを作成するコマンドを処理するサーバーの部分です。

Thread viewing = new Thread(new View(Main.sockets[Selected]));
            viewing.start();

この行は、少なくとも最初は機能しますが、スレッドでここでヌル ポインターを取得するため、他の行で機能するかどうかはわかりません。

import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.Socket;

import javax.imageio.ImageIO;


public class View extends Applet implements Runnable {
    private Socket Client;
    public boolean Running = true;
    public Graphics Buffer;
    public Image offscreen;
    public BufferedImage image;

    public View(Socket client) {
        Client = client;    
    }

    public void init() {
        setSize(500,500);
        offscreen = createImage(500, 500);
        Buffer = offscreen.getGraphics();
    }

    public void paint(Graphics g) {
        Buffer.clearRect(0, 0, 500, 500);
        Buffer.drawImage(image, 500, 500, null);
        g.drawImage(offscreen,  0,  0,  this);
    }

    public void update(Graphics g) {
        paint(g);
    }

    public void run() {
        while(Running) {
            try {

                try {
                    image = ImageIO.read(Client.getInputStream());
                    System.out.println("painting");
                    Graphics g = image.getGraphics(); //NullPointerException
                    g.drawImage(image, 500, 500, null);

                } catch (IOException e) {
                    e.printStackTrace();
                }

                repaint();
                Thread.sleep(10);

            } catch (InterruptedException e) {

                e.printStackTrace();
            }


        }

    }
}
4

0 に答える 0