こんにちは、ありがとうございます。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が処理を終了できないことからフリーズすることなく、お互いに応答することを許可しますか?
また、複数のクライアントがサーバーにログオンできるようにするにはどうすれば、そのすべての要求も引き続き安全に処理できますか?
ありがとうございます。
どのようにサーバーとクライアントの両方のソケットを作成していますか、サーバー用にサーバーソケットを作成する必要があります。 – Audi
編集時に表示するためにサーバーソケットコードを追加しました。 – Duckman
あなたはクライアントとサーバーの両方に単一のクラスを使用していますか?あなたのコードからcozを参照してください。サーバークラスにクライアントソケットを作成していることがわかります。以下のリンクを参考にしてください。別々のクラス。 https://systembash.com/a-simple-java-tcp-server-and-tcp-client/ – Audi