Java服务器非阻塞查询

Java服务器非阻塞查询,java,client,blocking,Java,Client,Blocking,我使用以下代码从Android客户端读取一些数据。一切都很好。但是现在我被要求使这个服务器代码不阻塞。对此有什么建议吗?我试图使用线程,但不知道如何使用?我是Java初学者:) 谢谢 import java.awt.image.BufferedImage; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.DataInputStream; import java.io.

我使用以下代码从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);
        }
导入java.awt.image.buffereImage;
导入java.io.BufferedOutputStream;
导入java.io.ByteArrayInputStream;
导入java.io.DataInputStream;
导入java.io.File;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.net.ServerSocket;
导入java.net.Socket;
导入java.util.Calendar;
导入java.util.Date;
导入javax.imageio.imageio;
公共类服务器{
//服务器构造函数
公共服务器()
{}
//变量初始化
私有静态服务器套接字服务器;
字节[]imagetemp;
专用静态插座1;
私有静态布尔图像;
私有静态Sdfdata数据;
私有静态布尔cond;
公共静态int端口;
私有静态整数=0;
//图像可用性返回方法
公共布尔值imageAvailable()
{
返回新图像;
}
公共布尔clientchk()
{
返回socket1.isClosed();
}
//读取图像时Vis组设置的图像标志。
public void setImageFlag(布尔集)
{
newImage=set;
}
//将数据发送到Vis组
公共Sdfdata getData()
{
返回数据;
}
//启动服务器
公共静态布尔启动(int-port1)
{
试一试{
端口=端口1;
服务器=新服务器套接字(端口1);
System.out.println(“等待客户端连接”);
//这里有新线索
socket1=server.accept();
}捕获(IOE异常){
System.out.println(“无法连接”);
e、 printStackTrace();
返回false;
}
返回true;
}
//停止服务器
公共布尔停止()
{
试一试{
socket1.close();
} 
捕获(IOE异常)
{
e、 printStackTrace();
返回false;
}
返回true;
}
/**
*@param args
*@抛出异常
*/
公共静态void main(字符串[]args)引发IOException{
//启动服务器
启动(4444);
//用于读取数据的数据输入流
DataInputStream in=null;
试一试{
in=新的DataInputStream(socket1.getInputStream());
}捕获(IOE1异常){
//TODO自动生成的捕捉块
e1.printStackTrace();
}
cond=真;
做{
尝试
{
//读取图像数据
int length=in.readInt();
//创建从客户端读取的用于图像传输的字节数组长度
Sdfdata数据=新Sdfdata(长度);
//对于(int i=0;i 0){
in.readFully(data.image);
}
//阅读方向
data.orientation[0]=in.readFloat();//方向x
data.orientation[1]=in.readFloat();//方向y
data.orientation[2]=in.readFloat();//方向z
//读取全球定位系统
data.longitude=in.readDouble();
data.latitude=in.readDouble();
data.altime=in.readDouble();
//显示方向和GPS数据
System.out.println(data.orientation[0]+“”+data.orientation[1]+“”+data.orientation[2]);
System.out.println(data.longitude+“”+data.latitude+“”+data.althip);
String fileName=“IMG_”+Integer.toString(++number)+“.JPG”;
System.out.println(“文件名:“+FileName”);
FileOutputStream fos=新的FileOutputStream(文件名);
fos.写入(数据.图像);
fos.close();
/*InputStream ins=新的ByteArrayInputStream(data.image);
BuffereImage image=ImageIO.read(ins);
write(图像,“JPG”,新文件(文件名));
*/
//设置图像标志
newImage=true;
}捕获(例外e){
//系统输出打印项次(“EOF或?”+e);
cond=假;
socket1.close();
server.close();
启动(端口);
}
}while(cond);
}

}

您的代码启动服务器,等待连接,从第一个连接的客户端读取一些数据,然后将这些数据写入文件后退出

被要求使您的服务器“非阻塞”可能意味着您被要求将其更改为使用异步IO(可能不太可能),也可能意味着您被要求一次处理多个客户机-因为当前您只能为一个客户机服务,然后您的程序退出

这个问题很难回答,因为您当前的代码离您需要它的地方很远,一般来说,阅读网络、套接字和Java编程似乎是一个很好的开始


我建议用Java做任何与网络相关的事情,它们的示例和文档都很好,并且易于理解。祝你好运

谢谢。不,我没有被要求和我们交流。我刚刚被要求启动一个线程,该线程应该在套接字上侦听,而不是在这个套接字上侦听。它将只有一个线程,并且将有助于最小化CPU使用量。如果我的方式正确的话。