2012-02-28 3 views
0

次のコードを使用して、Androidクライアントから一部のデータを読み取っています。すべてがうまくいっています。しかし、今私はこのサーバーコードを非ブロックにするように求められています。これに関する提案はありますか?私はスレッドを使用しようとしていたが、どのように知っていないのですか?私は、Java :)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); 
     } 

}で初心者です

答えて

2

あなたのコードは、サーバーを起動し、接続を待ち、最初に接続されたクライアントからのいくつかのデータを読み込み、これを書いた後に終了データをファイルに保存します。

サーバーを非ブロッキングにするように要求されると、非同期IO(おそらくありそうもない)を使用するようにサーバーを変更するよう求められたり、複数のクライアントを処理するように要求される可能性があります。一度に1つのクライアントにしかサービスを提供できず、プログラムが終了するためです。

この質問は、あなたの現在のコードが必要な場所から非常に遠く離れているため、ネットワーキング、ソケット、Javaプログラミングに関する一般的な読書が始まるのが良いようです。

Javaでネットワーク関連の作業を行う場合は、Nettyをお勧めします。そのサンプルとドキュメントは、適切かつ簡単に従うことができます。がんばろう!

+0

ありがとうアルパイン。いいえ、私は非同期IOを要求されていません。私はちょうどこのソケットのリスンの代わりにソケットでリスンするスレッドを開始するように頼まれています。これは1つのスレッドに過ぎず、CPU使用率を最小限に抑えるのに役立ちます。私は正しい方法でいる場合。 –

関連する問題