0

サーバー側にこのコードがあります:

サーバ側:

 ServerSocket listenTransferSocket = new ServerSocket(6000);
          Socket connectionTransferSocket = listenTransferSocket.accept();

     DataOutputStream outTransferToClient =
         new DataOutputStream(connectionTransferSocket.getOutputStream());
        {
    .......................   (Some code)
    .......................
           }
    outTransferToClient.write(fileInBytes,0,numOfBytes);
           System.out.println("File send");
       **// outTransferToClient.close();**

        BufferedReader inFromClientR =
                 new BufferedReader(new InputStreamReader(connectionTransferSocket.getInputStream()));

クライアント側:

Socket fileTransferSocket = new Socket("localhost",6000);
     DataInputStream in = new DataInputStream(new BufferedInputStream(
                                                 fileTransferSocket.getInputStream()));

OutputStream out = new FileOutputStream(new File("./TransferedFiles/"+fileName));

byte[] by = new byte[numOfBytes];

while ((read = in.read(by, 0, numOfBytes)) != -1) {

       out.write(by,0,read); 
   }

  DataOutputStream outToServerR = 
       new DataOutputStream(fileTransferSocket.getOutputStream()); 
     System.out.println("checkC");
        outToServerR.writeBytes("Transfer completed \n");

そして、これを閉じると BufferedReader を開こうとすると、次の例外が発生します: outTransferToClient.close();

Exception in thread "main" java.net.SocketException: Socket is closed
        at java.net.Socket.getInputStream(Socket.java:788)
        at Server.main(Server.java:92)

クライアント側のwhileループが止まらない場合..何か助けて????

4

2 に答える 2

1

close()DataOutputStream は、メソッドを持つ FilterOutputStream を拡張します。

ドキュメントから

Closes this output stream and releases any system resources associated with the stream.
The close method of FilterOutputStream calls its flush method, and then calls the close method of its underlying output stream.

余談ですが、finally ブロックに close() のようなメソッドを含めることは常に良い習慣です。

于 2013-04-04T08:23:47.943 に答える
0

はい、DataOutputStream閉じると原資産も閉じますOutputStream。状態の Javadoc DataOutputStream#close():

FilterOutputStream の close メソッドは、その flush メソッドを呼び出してから、基になる出力ストリームの close メソッドを呼び出します。

さらに、sまたはを閉じると、関連するソケットも閉じるとJavadoc にSocket記載されています。SocketinputStreamoutputStream

DataOutputStreamそのため、いずれかのストリームをラップした を閉じた後、ソケットを再利用することはできません。

于 2013-04-04T08:25:54.407 に答える