Java通信客户端/服务器

时间:2012-05-03 12:38:18

标签: java stream client-server

这是我的客户:

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)

3 个答案:

答案 0 :(得分:2)

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

更新:为了清楚起见,我的意思是在客户端而不是服务器中将out.close()带走(或移到最后)。

答案 1 :(得分:2)

'out.print(name +“,”+ pass);'似乎没有发出行终止符,因此客户端中的'readLine()'将不会返回。尝试'println'并摆脱关闭的小屋。

答案 2 :(得分:2)

我做了几件事,所以提供所有代码。

  • 稍后放置缓冲的阅读器,以防止阻塞。
  • 添加了编码,因此它不使用默认的OS编码(不同操作系统上的客户端)。
  • 是否打印了i.o.打印。
  • Autoflushing。
  • Inportant:没有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!");
    }
    }