Java Server Non Blocking Query - PullRequest
       3

Java Server Non Blocking Query

0 голосов
/ 29 февраля 2012

Я использую следующий код для чтения некоторых данных из клиента Android.Все идет хорошо.Но теперь меня просят сделать этот код сервера неблокирующим.Есть ли какие-либо предложения для этого?Я пытался использовать темы, но не знаете как?Я новичок в Java:)

Спасибо

import java.awt.image.BufferedImage;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Calendar;
import java.util.Date;

import javax.imageio.ImageIO;


public class Server {
    //Server Constructor
    public Server()
    {}
    //Variables Initialization
    private static ServerSocket server;
    byte[] imagetemp;
    private static Socket socket1;
    private static boolean newImage;
    private static Sdfdata data;
    private static boolean cond;
    public static int port;
    private static int number = 0;
    //Image Availability return method
    public boolean imageAvailable()
    {
        return newImage;
    }
    public boolean clientchk()
    {
        return socket1.isClosed();
    }
    //Image Flag set by Vis group when image read.
    public void setImageFlag(boolean set)
    {
        newImage = set;
    }
    // Send the data to the Vis Group
    public Sdfdata getData()
    {
    return data;
    }
    //Starts the Server
    public static boolean start(int port1)
    {
        try {
            port=port1;

                server = new ServerSocket(port1);
            System.out.println("Waiting for Client to Connect");
            //New thread here 

            socket1=server.accept();


        } catch (IOException e) {
            System.out.println("Cannot Connect");
            e.printStackTrace();
            return false;
        }
        return true;
    }
    //Stops the Server
    public boolean stop() 
    {

        try {
            socket1.close();
        } 
        catch (IOException e) 
        {

            e.printStackTrace();
            return false;
        }
        return true;

    }
    /**
     * @param args
     * @throws IOException 
     */



    public static void main(String[] args) throws IOException {
        // Starts the server
        start(4444);
        // DataInput Stream for reading the data 
        DataInputStream in = null;
        try {
            in = new DataInputStream(socket1.getInputStream());
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        cond=true;

        do {

            try
            {
                //Read Image Data
                int length = in.readInt();
                //Create an ByteArray of length read from Client for Image transfer
                Sdfdata data = new Sdfdata(length);

                //for (int i=0; i<length; i++)
                //{ data.image[i] = in.readbyte();  }   

                if (length > 0) {
                    in.readFully(data.image);
                }

                //Read Orientation
                data.orientation[0] = in.readFloat();       //Orientation x
                data.orientation[1] = in.readFloat();       //Orientation y
                data.orientation[2] = in.readFloat();       //Orientation z

                //Read GPS
                data.longitude = in.readDouble();
                data.latitude = in.readDouble();
                data.altitude = in.readDouble();

                //Display orientation and GPS data
                System.out.println(data.orientation[0] + " " + data.orientation[1] + " " + data.orientation[2]);
                System.out.println(data.longitude + " " + data.latitude + " " + data.altitude);

                String fileName = "IMG_" + Integer.toString(++number) + ".JPG";
                System.out.println("FileName:  " + fileName);
                FileOutputStream fos = new FileOutputStream(fileName);
                fos.write(data.image);
                fos.close();





                /*InputStream ins = new ByteArrayInputStream(data.image);
                BufferedImage image = ImageIO.read(ins);
                ImageIO.write(image, "JPG", new File (fileName));
                */
                //set image flag
                newImage = true;


            } catch (Exception e) {
                //System.out.println("EOF Or ? " + e);

                cond =false;
                socket1.close();
                server.close();
                start(port);

            }
    }while (cond);
        }

}

1 Ответ

2 голосов
/ 29 февраля 2012

Ваш код запускает сервер, ожидает подключения, считывает некоторые данные из первого подключенного клиента, а затем завершает работу после записи этих данных в файл.

При попытке сделать ваш сервер "неблокирующим«может означать, что вас просят изменить его на использование асинхронного ввода-вывода (вероятно, маловероятно), или это может означать, что вас просят обрабатывать более одного клиента одновременно - потому что в настоящее время вы можете обслуживать только один клиент, а затемваша программа завершает работу.

На этот вопрос сложно ответить, потому что ваш текущий код находится очень далеко от того места, где он вам нужен, и кажется, что некоторые чтения по сети, сокетам и Java-программированию в целом будутхороший способ начать.

Я бы порекомендовал Netty для выполнения всего, что связано с сетью в Java, и их примеры и документация хороши и просты для понимания.Удачи!

...