2017-09-26 13 views
0

こんにちは、ありがとうございます。Java TCP - クライアントサーバーのヘルプ

現在、クライアントからのさまざまな要求に基づいてサーバーがクライアントに応答するクライアントサーバープログラムを作成しようとしています。

ここで私は最初のリクエストに対して何をしようとしているのですか(この問題はすべてのクライアントに対して同じリクエストが送信されるため、これを修正するとすべてを修正できます)

1)クライアントは、サーバ

2)クライアントがサーバ

3)サーバが有効

4)サーバが言っ応答を送信するためのログオン情報をチェックするログオン情報を送信するに接続しますそのログインは成功した。

5)クライアントが応答を受信して​​表示します。

try 
{ 
    mySocket = new Socket("localhost", 2016); 
} 
catch (UnknownHostException e1) 
{ 
    e1.printStackTrace(); 
} 
catch (IOException e1) 
{ 
    e1.printStackTrace(); 
} 

try 
{ 
    DOS = new DataOutputStream(mySocket.getOutputStream()); 
    DOS.writeUTF(txtName.getText() + " " + txtPassword.getText()); 
    DOS.flush(); 
    DOS.close(); 

    DataInputStream DISLog = new DataInputStream(mySocket.getInputStream()); 
    JOptionPane.showMessageDialog(null, DISLog.readLine()); 
} 
catch(IOException e1) 
{ 
    e1.printStackTrace(); 
} 

サーバー:

 System.out.println("Waiting for client...."); 
     ServerSocket myServerSocket = new ServerSocket(2016); 
     Socket mySocket = myServerSocket.accept(); 

     myClientHandler = new EZFILEHandler(mySocket); 

     //Log in check 

     DataInputStream DISLog = new DataInputStream(mySocket.getInputStream()); 

     StringTokenizer ST = new StringTokenizer(DISLog.readLine()); 
     String Name = ST.nextToken(); 
     String Password = ST.nextToken(); 

     //DISLog.close(); 

     boolean Found = myClientHandler.matchUser(Name,Password); 

     DataOutputStream DOS = new DataOutputStream(mySocket.getOutputStream()); 

     if (Found == true) 
     { 
      DOS.writeUTF("You are logged in."); 
      DOS.flush(); 
      LoggedIn = true; 
     } 

     if (Found == false) 
     { 
      DOS.writeUTF("You could not log in."); 
      DOS.flush(); 
     } 
ここ

は、(最初​​のtryブロックは、クライアントフレーム上のボタンのアクションリスナー内の第二、クライアントフレーム内に位置しています)クライアントであります

public EZFILEHandler(Socket newConnectionToClient) 
    { 
     try 
     { 
      mySocket = new Socket("localhost", 2016); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

実行目:ここ

は、サーバーコードで言及ClientHandlerのコードです上記のコードでは、Socket is closedという例外がクライアントの次の行にあります:DataInputStream DISLog = new DataInputStream(mySocket.getInputStream());だから、私はその行をコメントアウトしようとしました:DOS.close();はクライアントでソケットを開いたままにしていますが、クライアントコードを呼び出すボタンがプログラムをフリーズさせます私がプログラムを終了すると、この行を指します:JOptionPane.showMessageDialog(null, DISLog.readLine());

私の質問はこれです:どのように私はクライアントとサーバーがソケットのクローズやjswingが処理を終了できないことからフリーズすることなく、お互いに応答することを許可しますか?

また、複数のクライアントがサーバーにログオンできるようにするにはどうすれば、そのすべての要求も引き続き安全に処理できますか?

ありがとうございます。

+0

どのようにサーバーとクライアントの両方のソケットを作成していますか、サーバー用にサーバーソケットを作成する必要があります。 – Audi

+0

編集時に表示するためにサーバーソケットコードを追加しました。 – Duckman

+0

あなたはクライアントとサーバーの両方に単一のクラスを使用していますか?あなたのコードからcozを参照してください。サーバークラスにクライアントソケットを作成していることがわかります。以下のリンクを参考にしてください。別々のクラス。 https://systembash.com/a-simple-java-tcp-server-and-tcp-client/ – Audi

答えて

0

スイングプログラムを作成する場合、ソケット通信は独自のSwingWorkerスレッド上にある必要があります。

それを無視して、ちょうどコードをデバッグしているかのように振る舞いましょう。

DISLog.readLine()は、改行文字または入力ストリームの最後に到達するまで読み取ります。サーバーは次のように実行しています。

DOS.writeUTF("You are logged in."); 
DOS.flush(); 

ここには改行がありません。 flush()はストリームを閉じません。すべての文字が送信されることを保証するだけで、送信する文字の次のセットと結合するためにバッファに残されません。

catch-22?うん!クライアントは\nを待機しており、サーバーはクライアントからのより多くのコマンドを待機しています。

readUTF()を使用するようにクライアントを変更します。

更新readUTF()を使用するようにサーバーを変更する必要があるようです。クライアントがソケットを閉じるまで、サーバーはおそらくnew StringTokenizer(DISLog.readLine())呼び出しを過ぎていません。

+0

これで、writeUTFに含まれる文字列の最後に\ nを追加しました(現在:DOS.writeUTF(txtName.getText()+ "txtPassword.getText()+" \\ n ");)、 readLineをreadUTFに変更しましたが、別のエラーが発生しました。これは新しいJOptionPane.showMessageDialog(null、DISLog.readUTF())を指します。クライアントに「接続リセット」と表示されます。 – Duckman

+0

上記のコメントを気にしないで、私はあなたの新しい変更を追加しました。 – Duckman

+0

素晴らしいです。できます。ありがとうございます;) – Duckman

関連する問題