Java服务器非阻塞查询
我使用以下代码从Android客户端读取一些数据。一切都很好。但是现在我被要求使这个服务器代码不阻塞。对此有什么建议吗?我试图使用线程,但不知道如何使用?我是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.
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使用量。如果我的方式正确的话。