-4

こんにちは、サーバーに問題があります。「dload」を呼び出すたびにファイルがダウンロードされますが、null として返されるため、他のコマンドを使用できません。コードで問題を確認できる人はいますか?

サーバー:

public class TCPServer {

    public static void main(String[] args) {

        ServerSocket server = null;
        Socket client;
        // Default port number we are going to use
        int portnumber = 1234;
        if (args.length >= 1) {
            portnumber = Integer.parseInt(args[0]);
        }
        // Create Server side socket
        try {
            server = new ServerSocket(portnumber);
        } catch (IOException ie) {
            System.out.println("Cannot open socket." + ie);
            System.exit(1);
        }
        System.out.println("ServerSocket is created " + server);
        // Wait for the data from the client and reply

        boolean isConnected = true;

        try {
            // Listens for a connection to be made to
            // this socket and accepts it. The method blocks until
            // a connection is made
            System.out.println("Waiting for connect request...");
            client = server.accept();
            System.out.println("Connect request is accepted...");
            String clientHost = client.getInetAddress().getHostAddress();
            int clientPort = client.getPort();
            System.out.println("Client host = " + clientHost
                    + " Client port = " + clientPort);

            // Read data from the client
            while (isConnected == true) {

                InputStream clientIn = client.getInputStream();

                BufferedReader br = new BufferedReader(new InputStreamReader(
                        clientIn));
                String msgFromClient = br.readLine();
                System.out.println("Message received from client = "
                        + msgFromClient);

                // Send response to the client

                if (msgFromClient != null
                        && msgFromClient.equalsIgnoreCase("sum")) {
                    OutputStream clientOut = client.getOutputStream();
                    PrintWriter pw = new PrintWriter(clientOut, true);
                    Double[] list;
                    list = new Double[5];
                    String value;
                    int i;
                    try {

                        for (i = 0; i < 5; i++) {
                            pw.println("Input number in arrayslot: " + i);
                            value = br.readLine();
                            double DoubleValue = Double.parseDouble(value);
                            list[i] = DoubleValue;
                        }
                        if (i == 5) {
                            Double sum = 0.0;
                            for (int k = 0; k < 5; k++) {
                                sum = sum + list[k];
                            }
                            pw.println("Sum of array is " + sum);
                        }
                    } catch (NumberFormatException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                }

                if (msgFromClient != null
                        && msgFromClient.equalsIgnoreCase("max")) {
                    OutputStream clientOut = client.getOutputStream();
                    PrintWriter pw = new PrintWriter(clientOut, true);
                    Double[] list;
                    list = new Double[5];
                    String value;
                    int i;
                    try {

                        for (i = 0; i < 5; i++) {
                            pw.println("Input number in arrayslot: " + i);
                            value = br.readLine();
                            double DoubleValue = Double.parseDouble(value);
                            list[i] = DoubleValue;
                        }
                        if (i == 5) {
                            Arrays.sort(list);
                            pw.println("Max integer in array is " + list[4]);
                        }
                    } catch (NumberFormatException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                }

                if (msgFromClient != null
                        && msgFromClient.equalsIgnoreCase("time")) {
                    OutputStream clientOut = client.getOutputStream();
                    PrintWriter pw = new PrintWriter(clientOut, true);
                    Calendar calendar = GregorianCalendar.getInstance();
                    String ansMsg = "Time is:, "
                            + calendar.get(Calendar.HOUR_OF_DAY) + ":"
                            + calendar.get(Calendar.MINUTE);
                    pw.println(ansMsg);
                }
                if (msgFromClient != null
                        && msgFromClient.equalsIgnoreCase("date")) {
                    OutputStream clientOut = client.getOutputStream();
                    PrintWriter pw = new PrintWriter(clientOut, true);
                    Calendar calendar = GregorianCalendar.getInstance();
                    String ansMsg = "Date is: " + calendar.get(Calendar.DATE)
                            + "/" + calendar.get(Calendar.MONTH) + "/"
                            + calendar.get(Calendar.YEAR);
                    ;
                    pw.println(ansMsg);
                }
                if (msgFromClient != null
                        && msgFromClient.equalsIgnoreCase("c2f")) {
                    OutputStream clientOut = client.getOutputStream();
                    PrintWriter pw = new PrintWriter(clientOut, true);
                    String celciusValue;
                    boolean ifRead = false;

                    try {

                        pw.println("Input celcius value");
                        celciusValue = br.readLine();
                        ifRead = true;
                        if (ifRead == true) {
                            double celcius = Double.parseDouble(celciusValue);
                            celcius = celcius * 9 / 5 + 32;

                            pw.println(celcius);
                        }
                    } catch (NumberFormatException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                }

                if (msgFromClient != null
                        && msgFromClient.equalsIgnoreCase("dload")) {

                    OutputStream outToClient = client.getOutputStream();
                    if (outToClient != null) {
                        File myFile = new File("C:\\ftp\\pic.png");
                        byte[] mybytearray = new byte[(int) myFile.length()];

                        FileInputStream fis = new FileInputStream(myFile);

                        BufferedInputStream bis = new BufferedInputStream(fis);

                        try {
                            bis.read(mybytearray, 0, mybytearray.length);
                            outToClient.write(mybytearray, 0,
                                    mybytearray.length);

                            outToClient.flush();
                            outToClient.close();
                            bis.close();
                            fis.close();

                        } catch (IOException ex) {
                            // Do exception handling
                        }

                        System.out.println("test");

                    }
                }

                if (msgFromClient != null
                        && msgFromClient.equalsIgnoreCase("quit")) {
                    client.close();
                    break;
                }
                // if (msgFromClient != null
                // && !msgFromClient.equalsIgnoreCase("bye")) {
                // OutputStream clientOut = client.getOutputStream();
                // PrintWriter pw = new PrintWriter(clientOut, true);
                // String ansMsg = "Hello, " + msgFromClient;
                // pw.println(ansMsg);
                // }

                // Close sockets
                if (msgFromClient != null
                        && msgFromClient.equalsIgnoreCase("bye")) {
                    server.close();
                    client.close();
                    break;
                }

                msgFromClient = null;
            }
        } catch (IOException ie) {
        }
    }
}

クライアント:

   import java.io.*;
import java.net.*;

public class TCPClient {
 public static void main(String args[]) {

  boolean isConnected = true;
  Socket client = null;
  int portnumber = 1234; // Default port number we are going to use
  if (args.length >= 1) {
   portnumber = Integer.parseInt(args[0]);
  }
  try {

   String msg = "";
   // Create a client socket
   client = new Socket("127.0.0.1", 1234);
   System.out.println("Client socket is created " + client);
   // Create an output stream of the client socket

   OutputStream clientOut = client.getOutputStream();
   PrintWriter pw = new PrintWriter(clientOut, true);
   // Create an input stream of the client socket
   InputStream clientIn = client.getInputStream();
   BufferedReader br = new BufferedReader(new InputStreamReader(
     clientIn));
   // Create BufferedReader for a standard input
   BufferedReader stdIn = new BufferedReader(new InputStreamReader(
     System.in));

   while (isConnected == true) {
    System.out
      .println("Commands: \n1. TIME\n2. DATE\n3. C2F\n4. MAX\n5. SUM\n6. DLOAD\n7. QUIT");
    // Read data from standard input device and write it
    // to the output stream of the client socket.
    msg = stdIn.readLine().trim();
    pw.println(msg);
    // Read data from the input stream of the client socket.



    if (msg.equalsIgnoreCase("dload")) {
        byte[] aByte = new byte[1];
        int bytesRead;
        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        if (clientIn != null) {



            try {
                FileOutputStream fos = new FileOutputStream("C:\\ftp\\pic.png");
                BufferedOutputStream bos = new BufferedOutputStream(fos);
                bytesRead = clientIn.read(aByte, 0, aByte.length);

                do {
                    baos.write(aByte, 0, bytesRead);
                    bytesRead = clientIn.read(aByte);
                } while (bytesRead != -1);

                bos.write(baos.toByteArray());
                bos.flush();
                bos.close();

                System.out.println("File is successfully downloaded to your selected directory"+ "\n" +"*-----------------*"+ "\n" );

            } catch (IOException ex) {
                System.out.println("Couldn't dowload the selected file, ERROR CODE "+ex);
            }

        }
    }else{

        System.out.println("Message returned from the server = "
                  + br.readLine());
    }
    if (msg.equalsIgnoreCase("bye")) {

     pw.close();
     br.close();
     break;
    }
   }
  } catch (Exception e) {

  }

 }
}
4

2 に答える 2

0

初めにすること:

if (args.length >= 1) {
    portnumber = Integer.parseInt(args[0]);
}

これは NumberFormatException をスローする可能性があり、args[0] はユーザーによって渡されるため、これを処理する必要があります。コードを読むと、これも問題になりました:

double DoubleValue = Double.parseDouble(value); // LINE 104

サーバーにコマンドとして c2f を与えると、NumberFormatException がスローされます。コード内の任意の場所でこの例外を処理し、次のような適切な応答をクライアントに与える必要があります。

try{
    double DoubleValue = Double.parseDouble(value);
}catch(NumberFormatException e){
    // TELL THE CLIENT "ops, the number you inserted is not a valid double numer
}

(短い例では、これからコードを拡大する必要があります)


while (isConnected == true) {

見えない!なぜこれを使わないのですか?

while (isConnected) {

if (msgFromClient != null && msgFromClient.equalsIgnoreCase("sum")){

次のことができます。

if("sum".equalsIgnoreCase(msgFromClient)){

この場合、NullPointerException に問題はありません。(msgFromClient が null の場合、ステートメントは false です)。


ちなみに、日付と時刻のコマンドはうまく機能しています。他の人をチェックしてください。

dload を修正するには、次の行を削除する必要があると思います。

outToClient.close();

(編集:同じ回答でmaxhaxに申し訳ありません。これを書いている間、あなたの回答が表示されませんでした)

于 2012-10-15T11:57:27.053 に答える
0

コードをデバッグし、2 つのヒントがあります。

1)

例外を抑制しないでください。それらを処理してください!最初のステップはスタックトレースを出力することであり、SO に関するこの質問は決して開かれません;-) コードをデバッグしてください!

2)

outToClient.flush();
outToClient.close(); //is closing the socket implicitly
bis.close();
fis.close();

したがって、2 回目の呼び出しでは、サーバー側のソケットは既に閉じられています。

于 2012-10-15T11:22:12.490 に答える