嗨,并提前致谢。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();
}
下面是在服务器代码中提到的ClientHandler的代码:
public EZFILEHandler(Socket newConnectionToClient)
{
try
{
mySocket = new Socket("localhost", 2016);
}
catch(Exception e)
{
e.printStackTrace();
}
}
运行日上面的代码会在客户端的这一行发出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