Java通信客户端/服务器

标签 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)

最佳答案

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

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

关于Java通信客户端/服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10431550/

相关文章:

java - 如何缩放PNG图像直到达到目标文件大小

java - 如何用jcommander执行解析后的命令?

java - AWS EMR - Java 运行时内存不足

java - Java 中的简单 Web 代理

c++ - 如何使用 Eclipse 在 C++ 中测试和运行客户端服务器程序

java - 我的 Activity onPause/OnResume 方法每分钟无故调用一次

java - mp3 文件流上的 getDuration : java. io.IOException:不支持标记/重置

html - html流分块文件大小未知

java - 为什么这个只能工作一次?

c - 在 C 中使用 UDP 发送数据包并测量耗时