2012-05-03 94 views
1

这是我的客户:的Java通信客户端/服务器

public static void logIn(String name, String pass) { 
try { 
    Socket s = new Socket("localhost", 9000); 
    PrintStream out = new PrintStream(s.getOutputStream()); 
    BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream())); 
    out.print(name + "," + pass); 
    out.flush(); 
    out.close(); 

    System.out.println(in.readLine()); 

    in.close(); 
    s.close(); 
} 
catch(UnknownHostException exp) 
{ 
    exp.printStackTrace(); 

} 
catch(java.io.IOException exp) 
{ 
    exp.printStackTrace(); 
} 
} 

,这我在我的服务器:

public static void main(String[] args){ 
boolean clientExists=false; 
ArrayList<User> users = new ArrayList<User>(); 
users.add(new User("jmeno","heslo")); 
ServerSocket ss; 
try { 
    ss = new ServerSocket(9000); 
    while(true) { 
       clientExists=false; 
     Socket s = ss.accept(); 
     BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream())); 
     PrintStream out = new PrintStream(s.getOutputStream()); 
     String xmlpacket=""; 
       String pom; 

       while ((pom = in.readLine())!=null){ 
        xmlpacket+=pom; 
        xmlpacket+="\n"; 
       } 

       for(User us: users) 
        { 
          if(us.isUserNameAndPasswordRight(login, passwd)) 
          { 
            out.print("user is connected"); 
            out.flush(); 
            clientExists=true; 
          } 
        } 
       } 
       if(clientExist != true) 
       out.print("bad login"); 
     out.flush(); 
     out.close(); 
     in.close(); 
     s.close(); 
} 
catch(java.io.IOException exp) 
{ 
    System.out.println("chyba u socketu!"); 
} 

}

它更多钞票,以这样的工作?我不能得到这个工作,因为在客户端尝试从服务器读取答案时出现异常。

编辑: 这是堆栈跟踪:

java.net.SocketException: socket closed 
    at java.net.SocketInputStream.socketRead0(Native Method) 
    at java.net.SocketInputStream.read(Unknown Source) 
    at java.net.SocketInputStream.read(Unknown Source) 
    at sun.nio.cs.StreamDecoder.readBytes(Unknown Source) 
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source) 
    at sun.nio.cs.StreamDecoder.read(Unknown Source) 
    at java.io.InputStreamReader.read(Unknown Source) 
    at java.io.BufferedReader.fill(Unknown Source) 
    at java.io.BufferedReader.readLine(Unknown Source) 
    at java.io.BufferedReader.readLine(Unknown Source) 
    at client.client.logIn(client.java:79) 


    at client.GUI.GUI.jMenuItem1ActionPerformed(GUI.java:379) 
    at client.GUI.GUI.access$5(GUI.java:367) 
    at client.GUI.GUI$5.actionPerformed(GUI.java:151) 
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
    at javax.swing.AbstractButton.doClick(Unknown Source) 
    at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source) 
    at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source) 
    at java.awt.Component.processMouseEvent(Unknown Source) 
    at javax.swing.JComponent.processMouseEvent(Unknown Source) 
    at java.awt.Component.processEvent(Unknown Source) 
    at java.awt.Container.processEvent(Unknown Source) 
    at java.awt.Component.dispatchEventImpl(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Window.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$000(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue$4.run(Unknown Source) 
    at java.awt.EventQueue$4.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 
+1

请提交例外加上堆栈跟踪和突出问题的方法/线路 –

回答

2

我做了几件事情,所以给所有的代码。

  • 稍后放置缓冲读取器,以防止阻塞。
  • 增加了编码,因此它不使用默认的操作系统编码(不同操作系统上的客户端)。
  • Did println i.o.打印。
  • 自动清理。
  • 重要:没有PrintStream,但PrintWriter。
  • xmlpacket上没有循环;那是后来的代码。

    public static void logIn(String name, String pass) { 
    try { 
        Socket s = new Socket("localhost", 9000); 
        //PrintStream out = new PrintStream(s.getOutputStream(), true, "UTF-8"); 
        PrintWriter out = new PrintWriter(new OutputStreamWriter(s.getOutputStream(), "UTF-8"), true); 
        out.println(name + "," + pass); 
        out.flush(); 
    
        BufferedReader in = new BufferedReader(new InputStreamReader(
          s.getInputStream(), "UTF-8")); 
    
        System.out.println(in.readLine()); 
    
        out.close(); 
        in.close(); 
        s.close(); 
    } catch (UnknownHostException exp) { 
        exp.printStackTrace(); 
    
    } catch (java.io.IOException exp) { 
        exp.printStackTrace(); 
    } 
    } 
    
    
    public static void main(String[] args) { 
    ArrayList<User> users = new ArrayList<User>(); 
    users.add(new User("jmeno", "heslo")); 
    ServerSocket ss; 
    try { 
        ss = new ServerSocket(9000); 
        while (true) { 
         Socket s = ss.accept(); 
         System.out.println("Accept..."); 
         BufferedReader in = new BufferedReader(new InputStreamReader(
           s.getInputStream(), "UTF-8")); 
         PrintWriter out = new PrintWriter(new OutputStreamWriter(s.getOutputStream(), "UTF-8"), true); 
         String xmlpacket = ""; 
         String pom; 
    
         pom = in.readLine(); 
         //while ((pom = in.readLine()) != null) { 
          xmlpacket += pom; 
          xmlpacket += "\n"; 
         //} 
         int commaPos = xmlpacket.indexOf(','); 
         int newlinePos = xmlpacket.indexOf('\n'); 
         String login = xmlpacket.substring(0, commaPos); 
         String passwd = xmlpacket.substring(commaPos + 1, newlinePos);       
    
         boolean clientExists = false; 
         for (User us : users) { 
          if (us.isUserNameAndPasswordRight(login, passwd)) { 
           out.println("user is connected"); 
           clientExists = true; 
           break; 
          } 
         } 
         if (!clientExists) 
          out.println("bad login"); 
         out.close(); 
         in.close(); 
         s.close(); 
        } 
    } catch (java.io.IOException exp) { 
        System.out.println("chyba u socketu!"); 
    } 
    } 
    
2

尝试带走了out.close()看看会发生什么。我相信关闭OutputStream也会关闭相关的套接字。在阅读回复之前,你不想这样做。

更新:只是要清楚,我的意思是带走(或移动到末尾)在客户端,而不是服务器的out.close()

+0

这就是想的太多,但是当我把它添加到末尾,则客户端没有响应,并与登录服务器鸵鸟政策GET消息和密码。 –

+1

你只是打败了我! –

+0

@Bibo - 如果你已经做了一些调试,那么你应该告诉我们关于它的事情!如果你不给我们所有的信息,我们只是在浪费我们的时间。 –

2

'out.print(name +“,”+ pass);'似乎不会发出行结束符,因此您的客户端中的'readLine()'将不会返回。尝试'println'并摆脱封闭的陷阱。

+0

@MartnJames不错的一个! –

+0

仍然无法通过。我用该println读取所有数据,但不能继续使用代码。 –

+0

它看起来像in.ReadLine()仍然在等待更多的线条阅读,或者我不知道为什么在debbuger我在,然后当它应该去下一行的代码,但绿线在debbuger错过(我使用日食)和gui在客户端没有响应。 –