2017-09-18 21 views
2

クライアントからローカルホストサーバーにオブジェクトを送信してデータベースに追加し、オブジェクトが正常に送信されたかどうかを返信します。オブジェクトは正常に送信されましたが、サーバーは結果をクライアントに返さず、サーバーからの応答を待つためにクライアントフレームフォームがハングしました。自分のコードに何が問題なのか分かりません。これを解決する方法を教えていただけますか?ここでJava - TCP/IP - サーバーはクライアントにメッセージを返信できません。

は、結果を送信する機能である:送信結果関数が呼び出される

public void sendResult(String result) { 
    try { 
     Socket clientSocket = myServer.accept(); 
     System.out.println("Connected to client"); 
     ObjectOutputStream os = new ObjectOutputStream(clientSocket.getOutputStream()); 

     os.writeObject(result); 
     System.out.println("Result sent"); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

:また

public void service() { 
    try { 
     if (receiveStudent() != null) { 
      Student std = receiveStudent(); 
      if (dao.addStudent(std)) { 
       System.out.println("OK"); 
       sendResult("OK"); 
      } else { 
       System.out.println("FAILED"); 
       sendResult("FAILED"); 
      } 
     } 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

は、サービス機能では、コンソールは「OK」のプリント、 if条件が満たされたことを意味します。

は学生法受け取る:そして、あなたが必要なとき

PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); //for sending String messages 
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); //for getting String messages 

...と:あなたはちょうどこのようなものを使用していない理由をオブジェクトとして文字列を送信したい場合は

public Student receiveStudent() { 
    Student s = new Student(); 

    try { 
     Socket clientSocket = myServer.accept(); 
     System.out.println("Connect to client successfully"); 
     ObjectInputStream ois = new ObjectInputStream(clientSocket.getInputStream()); 

     Object o = ois.readObject(); 
     if (o instanceof Student) { 
      s = (Student) o; 
      return s; 
     } 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
    return null; 
} 
+0

ReceiveStudent()メソッドのコードを表示 – shazin

+1

'sendResult()'メソッドは、 'accept()'のためにクライアントが接続するのを待ちます。それは逆にするべきです、サーバーはクライアントに接続する必要があります。 –

+0

@LucianovanderVeekensつまり、クライアントをサーバーに再接続する必要がありますか? –

答えて

2

sendResult()にはmyServer.accept()が含まれていますので、サーバはクライアント接続の受信をもう一度待っていますが、これはすでにreceiveStudent()に発生しています。その接続を再利用してください。

receiveStudent()で取得したクライアントソケットを、たとえば、フィールドに変換して共有します。

public Student receiveStudent() { 
    ... 

    try { 
     clientSocket = myServer.accept(); 
     ... 
    } catch (Exception ex) { 
     ... 
    } 
    ... 
} 

このソケットをsendResult()に再利用して、結果をクライアントに送信します。

public static void sendResult(String result) { 
    try { 
     ... 
     ObjectOutputStream os = new ObjectOutputStream(clientSocket.getOutputStream()); 
     ... 
    } catch (Exception ex) { 
     ... 
    } 
} 
+0

私はこの解決策について上記のあなたのコメントに気付き、それを完了し、今すぐ動作します。どうもありがとう! –

+0

「サーバーをクライアントに接続しません」。 *クライアント*は*サーバー*に接続します。サーバー*は、クライアントからの*接続*を受け入れます。答えは無意味です。 – EJP

+0

あなたは@EJPです。そのビットを変更し、それはひどく書かれました。 –

1

out.println(textToServer"); // send to server - don't forget LN in println. 
out.flush(); // to clean buffer 

あなたがする必要があることを行う必要があります。
そして、あなたのクライアントクラスがあなたが送っているのを待っていることを確認してください。クライアント側の問題かもしれないので、それを忘れないでください。
クライアントが着信ソケットオブジェクトを受け入れるObjectInputStreamまたはBufferedReaderであるかどうかにかかわらず、クライアントは受信Socketを受け入れていない可能性があります。

受信ソケットが受け入れられていないかどうかを確認できるように、Clientクラスを提供することができます。

メソッドの最後にストリームとソケットを閉じてください。詳細については

out.close(); 
in.close(); 
socket.close(); 

thisthisthisを確認してください。私は助けてくれることを願っています:)

+1

それは良い考えです。しかし、私は自分の問題は、サーバーソケットとクライアントソケットの間の接続だと思う。彼らが接続されていない場合、データを送信するためにどの方法を使用しても、それらのどれも受信しません。私はsendResultメソッドでローカルのものを作成するのではなく、クライアントソケットをグローバル変数にしました。 –

+0

次に、サーバーとソケットの接続を確認しましたか? サーバをServerSocketで設定してクライアントを受け入れる場合、クライアントと正しいポートでサーバに接続していますか? 'ServerSocket welcomeSocket = new ServerSocket(1234);'
'ソケットclientSocket =新しいソケット(" localhost "、1234);'
あなたは完全なコードを提供できますか? –

+1

彼らは正しいホストとポートに接続されていると確信しています。私は、結果の送信メソッドで新しいクライアントソケットを作成して、接続したいクライアントソケット以外のクライアントソケットにサーバーソケットを誤って接続したと思います。 –

1

あなたはaccept()を2回呼び出しています。これは無意味です。

  1. 接続を受け入れる必要があります。これはSocketを返します。
  2. 要求を読み、応答を作成します。
  3. (1)で承諾した同じSocketを介して、応答を送信します。

あなた受け入れられたソケットあたりの新しいスレッドを作成したい、とあなたも、そのスレッド内のすべてのI/Oをしたい、ObjectInputStreamObjectOutputStreamを作成含む。それ以外の場合は、サーバーが適切にマルチスレッド化されておらず、マルチクライアントでもありません。

+0

ありがとう!クライアントソケットをグローバル変数に変えて問題を解決しました。 –

関連する問題