2016-10-06 16 views
1

サーバ・クラスにデータを送信する際にソケットが常に近くにある理由: プログラムは、クライアントからのデータを受信して​​から返信しようとしています。サーバーは大丈夫ですが、問題はサーバーがクライアントに応答を送信するときです。クライアントは常に「ソケットが閉じる」と言います。私はsecketのcloseステートメントを削除しようとしますが、結果は同じです..出力には 'ソケットが閉じています'と表示されます。したがって、この問題を解決するために私を助けて...私はJavaのTCP

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.PrintStream; 
import java.net.BindException; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class Nomor3Server { 

    public static final int SERVICE_PORT = 2020; 

public static void main(String[] args) { 
    try { 
     ServerSocket server = new ServerSocket(SERVICE_PORT); 
     System.out.println("DAytime service started"); 

     for (;;) { 
      Socket nextClient = server.accept(); 

      BufferedReader pesan = new BufferedReader(new InputStreamReader(nextClient.getInputStream())); 
      String messageIn = pesan.readLine(); 
      System.out.println("Received request from " 
        + nextClient.getInetAddress() + " : " 
        + nextClient.getPort() 
        + "\nIsi Pesan : " + messageIn); 
      String messageOut = "انا لا ادر"; 

      switch (messageIn) { 
       case "saya": 
        messageOut = "أنا"; 
        break; 
       case "kamu": 
        messageOut = "أنت"; 
        break; 
       default: 
        break; 

      } 

      OutputStream out = nextClient.getOutputStream(); 
      PrintStream pout = new PrintStream(out); 

      pout.print(messageOut); 

      out.flush(); 
      out.close(); 
      System.out.println("Message sent"); 
      //nextClient.close(); 
     } 
    } catch (BindException e) { 
     System.err.println("Server Already Running on port : " + SERVICE_PORT); 
    } catch (IOException ioe) { 
     System.err.println("error : " + ioe); 

    } 
} 

} 

クライアントクラス下さい:返されたOutputStreamを閉じる

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.PrintStream; 
import java.net.Socket; 


public class Nomor3Client { 

    public static final int SERVICE_PORT = 2020; 

public static void main(String[] args) { 
    try { 
     String hostname = "localhost"; 

     System.out.println("Connection Established"); 

     //for (;;) { 

      System.out.println("Enter Your Message : "); 
      BufferedReader read = new BufferedReader(new InputStreamReader(System.in)); 
      String pesan = read.readLine(); 
      Socket daytime = new Socket(hostname, SERVICE_PORT); 

      if (pesan.equals("exit")) { 
       System.exit(0); 
      } else { 

       daytime.setSoTimeout(2000); 

       OutputStream out = daytime.getOutputStream(); 
       PrintStream pout = new PrintStream(out); 

       pout.print(pesan); 

       out.flush(); 
       out.close(); 



       BufferedReader messageIn = new BufferedReader(new InputStreamReader(daytime.getInputStream())); 
       System.out.println("Respond : " + messageIn.readLine()); 
       System.out.println("diterima"); 


      } 


      daytime.close(); 
     //} 

    } catch (IOException e) { 
     System.err.println("Error : " + e); 
    } 
} 

} 
+3

ループ –

答えて

0

ソケットは、このような状況で閉じます:

  • あなたはソケットを閉じたとき、
  • あなたが入力または出力ソケットストリームを閉じると、
  • あなたがあるオブジェクトを、閉じたとき直接的または間接的に入力または出力ソケットストリームをラップします。 BufferedReaderまたはScanner
-1

サーバ・クラス

  OutputStream out = nextClient.getOutputStream(); 
      PrintStream pout = new PrintStream(out); 

      pout.print(messageOut); 

      out.flush(); 
      out.close(); //Don't close this 

クライアントコード:

OutputStream out = daytime.getOutputStream(); 
PrintStream pout = new PrintStream(out); 

pout.print(pesan); 

out.flush(); 
out.close(); //Don't close this 
+0

のための内部のソケットを閉じないでくださいコードのコメントにあなたの答えを隠しません。 – EJP

+0

@EJP何か間違っている?説明してください –

関連する問題