2017-09-26 94 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(); 
     } 

下面是在服务器代码中提到的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冻结不被允许完成处理?

另外,我怎么可能允许多个客户端登录到服务器,并且他们的所有请求仍然安全地处理?

谢谢。

+0

你如何为服务器和客户端创建套接字,为服务器创建服务器套接字...... – Audi

+0

我刚刚添加了我的服务器套接字代码,供您在编辑中查看。 – Duckman

+0

你对客户端和服务器都使用单一的类..你的代码中的coz我看到你正在服务器类中创建客户端套接字..看看下面的链接为一个简单的例子..我会推荐使用单独的课程。 https://systembash.com/a-simple-java-tcp-server-and-tcp-client/ – Audi

回答

0

如果你正在编写一个Swing程序,你的套接字通信应该在它自己的SwingWorker线程上。

让我们忽略它,并假装它只是调试代码,不打算留下来。

DISLog.readLine()将读取,直到它到达换行符或输入流的结尾。服务器执行(说)以下内容:

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

没有换行符。并且flush()未关闭流;它只是确保发送所有字符,而不是保留在缓冲区中与下一组要发送的字符组合。

Catch-22?对!客户端正在等待\n,并且服务器正在等待来自客户端的更多命令。

更改客户端使用readUTF()

更新看起来你需要更改服务器以使用readUTF()以及。服务器可能没有通过new StringTokenizer(DISLog.readLine())调用,除非客户端关闭套接字。

+0

因此,我将\ n添加到包含在writeUTF(现在的:DOS.writeUTF(txtName.getText()+“”+ txtPassword.getText()+“\\ n”);)和I也改变了readLine为readUTF,但我想出了一个不同的错误。它指向新的JOptionPane.showMessageDialog(null,DISLog.readUTF());在客户端,并说'连接重置'。 – Duckman

+0

不要介意上面的评论,我只是添加了新的更改。 – Duckman

+0

太棒了。有用。非常感谢;) – Duckman