1

これは私のクライアントにあります:

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)
4

3 に答える 3

2

'out.print(名前 + "," + パス);' は行末記号を発行していないように見えるため、クライアントの「readLine()」は返されません。「println」を試して、クローズボッジを取り除きます。

于 2012-05-03T12:55:48.327 に答える
2

私はいくつかのことをしたので、すべてのコードを教えてください。

  • ブロッキングを防ぐために、バッファリングされたリーダーを後で配置しました。
  • エンコーディングが追加されたため、デフォルトの OS エンコーディングは使用されません (別の OS 上のクライアント)。
  • println io で印刷しました。
  • 自動フラッシュ。
  • 重要: 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!");
    }
    }
    
于 2012-05-03T13:57:32.213 に答える
2

を取り除いてみて、out.close()何が起こるか見てみましょう。をOutputStream閉じると、関連するソケットも閉じられると思います。応答を読むまで、それをしたくありません。

更新out.close():明確にするために、サーバーではなくクライアントで削除する(または最後に移動する)ことを意味します。

于 2012-05-03T12:43:26.743 に答える