繁体   English   中英

JAVA TCP服务器错误

[英]JAVA TCP Server Error

服务器:包服务器;

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

import javax.imageio.ImageIO;

public class Server extends Thread{

private ServerSocket mServer_Socket;
private ArrayList<SocketManager> managers = new ArrayList<SocketManager>();

public Server(){
    try {
        mServer_Socket = new ServerSocket(4242);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

@Override
public void run() {
    Socket msocket;
    try{
        msocket = mServer_Socket.accept();
        System.out.println("connected");
        managers.add(new SocketManager(msocket));
    }catch(Exception e){
        e.printStackTrace();
    }
}

public void SendMessage(String m, int i){
    try {
        managers.get(i).write(m.getBytes());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private class SocketManager{
    private OutputStream mout;
    private InputStream min;

    public SocketManager(Socket socket){
        try{
            mout = socket.getOutputStream();
            min = socket.getInputStream();
        }catch (IOException ioe) {
            ioe.printStackTrace();
        }
        startListen();
    }

    public void write(byte[] data) throws IOException{
        mout.write(data);
    }

    public void startListen(){
        new Thread() {
            BufferedImage image;
            public void run(){
                try {
                    System.out.println("listen..");
                    while(true){
                        if((image = ImageIO.read(min)) != null){
                            while(min.read() != 'y');
                            System.out.println("received");
                            mout.write('y');
                            mout.flush();
                            Main.drawImage(image);
                        }
                    }

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

客户:打包客户;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.List;

import javax.imageio.ImageIO;

import com.github.sarxos.webcam.Webcam;
import com.github.sarxos.webcam.WebcamResolution;
import com.github.sarxos.webcam.ds.fswebcam.FsWebcamDriver;

public class Client {
    private static List<Webcam> webcams = null;
    static Webcam webcam = null;

    static {
        Webcam.setDriver(new FsWebcamDriver());
    }

    public static void main(String[] args) {

    try {
        webcams =(List<Webcam>) Webcam.getWebcams(1000000);
    } catch (Exception e) {
        e.printStackTrace();
    }

    for(Webcam device : webcams){
        String name;
        System.out.println(name = device.getDevice().getName());
        //if(name.equals("Logitech HD Webcam C270 1"))
        webcam = device;
    }
    webcam.setViewSize(WebcamResolution.VGA.getSize());

    webcam.open();

    try{
        Socket socket = new Socket("localhost", 4242);
        OutputStream out = socket.getOutputStream();
        InputStream in = socket.getInputStream();
        byte[] buffer = new byte[10];
        while(true){
            ImageIO.write(webcam.getImage(), "png", out);
            out.flush();
            out.write('y');
            out.flush();
            System.out.println("read");
            while(in.read() != 'y');
        }
    }catch(Exception e){
        e.printStackTrace();
    }

    }
}

该程序可以运行约10秒。 但是在那之后它不起作用。 套接字已连接,但不发送任何内容。 我猜它不匹配同步,所以我匹配同步,但是它也不起作用。 我没主意 为什么它不起作用。 请帮忙。 我找不到问题

您的客户端需要先将已传输图像的大小发送给服务器,然后再发送图像本身,因为您的服务器需要知道图像的长度,以便从套接字读取图像并开始接收紧随图像之后的char数据。
而且,由于“ ImageIO”无法指定应该从输入流读取的字节数,因此应改用InputStream
请参阅下面的修改后的代码(添加新行时,我都会添加注释,其他所有内容与您的相同):

服务器:

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream; //<--- added
import java.io.DataInputStream;      //<--- added
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

import javax.imageio.ImageIO;

public class Server extends Thread{

private ServerSocket mServer_Socket;
private ArrayList<SocketManager> managers = new ArrayList<SocketManager>();

public Server(){
    try {
        mServer_Socket = new ServerSocket(4242);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

@Override
public void run() {
    Socket msocket;
    try{
        msocket = mServer_Socket.accept();
        System.out.println("connected");
        managers.add(new SocketManager(msocket));
    }catch(Exception e){
        e.printStackTrace();
    }
}

public void SendMessage(String m, int i){
    try {
        managers.get(i).write(m.getBytes());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private class SocketManager{
    private OutputStream mout;
    private InputStream min;
    private DataInputStream din; //<--- added DataInputStream    

    public SocketManager(Socket socket){
        try{
            mout = socket.getOutputStream();
            min = socket.getInputStream(); 
            din = new DataInputStream(min); //<--- initialized DataInputStream

        }catch (IOException ioe) {
            ioe.printStackTrace();
        }
        startListen();
    }

    public void write(byte[] data) throws IOException{
        mout.write(data);
    }


    public void startListen()
    {
        new Thread() {                                   
            BufferedImage image;
            public void run(){
                try {                   
                    System.out.println("listen..");                                                                                                           
                    while(true)
                    {
                        int arrlen = din.readInt();  //<--- receive image size in order to prepare a buffer for it                      
                        byte[] b = new byte[arrlen]; //<--- prepare a buffer
                        din.readFully(b);            //<--- receive image data

                        while(min.read() != 'y');                                                                  
                        mout.write('y');                       
                        mout.flush();

                        InputStream bais = new ByteArrayInputStream(b); //<--- get ByteArrayInputStream from buffer
                        BufferedImage image = ImageIO.read(bais);       //<--- prepare BufferedImage from ByteArrayInputStream 
                        bais.close();                                   //<--- close ByteArrayInputStream

                        Main.drawImage(image);  

                    }//end while true

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


    }


    }


}

客户:

import java.awt.image.BufferedImage;  //<--- added
import java.io.ByteArrayOutputStream; //<--- added
import java.io.DataOutputStream;      //<--- added
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.List;

import javax.imageio.ImageIO;

import com.github.sarxos.webcam.Webcam;
import com.github.sarxos.webcam.WebcamResolution;
import com.github.sarxos.webcam.ds.fswebcam.FsWebcamDriver;

public class Client {
    private static List<Webcam> webcams = null;
    static Webcam webcam = null;

    static {
        Webcam.setDriver(new FsWebcamDriver());
    }

    public static void main(String[] args) {

    try {
        webcams =(List<Webcam>) Webcam.getWebcams(1000000);
    } catch (Exception e) {
        e.printStackTrace();
    }

    for(Webcam device : webcams){
        String name;
        System.out.println(name = device.getDevice().getName());
        //if(name.equals("Logitech HD Webcam C270 1"))
        webcam = device;
    }
    webcam.setViewSize(WebcamResolution.VGA.getSize());

    webcam.open();

    try{
        Socket socket = new Socket("localhost", 4242);       
        OutputStream out = socket.getOutputStream();
        InputStream in = socket.getInputStream();
        DataOutputStream dos = new DataOutputStream(out);           //<--- added DataOutputStream
        BufferedImage image = null;                                 //<--- added BufferedImage to keep image from webcam                 
        while(true){

            ByteArrayOutputStream baos = new ByteArrayOutputStream();        //<--- create ByteArrayOutputStream            
            image = webcam.getImage();                                       //<--- get BufferedImage from webcam
            ImageIO.write(image, "png", baos);                               //<--- write image into ByteArrayOutputStream
            dos.writeInt(baos.size());                                       //<--- send image size                                                 
            dos.flush();  //<--- flush DataOutputStream                                                        
            baos.close(); //<--- close ByteArrayOutputStream

            ImageIO.write(image, "png", out);                                    
            out.flush();                                                                                       
            out.write('y');
            out.flush();
            System.out.println("read");
            while(in.read() != 'y');
        }
    }catch(Exception e){
        e.printStackTrace();
    }

    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM