Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 客户端/服务器应用程序_Java - Fatal编程技术网

Java 客户端/服务器应用程序

Java 客户端/服务器应用程序,java,Java,伙计们,有谁能告诉我我怎么了?下面是四个文件:客户端文件、主文件、服务器文件和主文件。尝试从服务器读取fromServer.readLine()后,客户端出现错误。 错误:客户端软件中的错误导致连接中止:recv失败 package client; import java.io.*; import java.net.*; import java.util.Scanner; p

伙计们,有谁能告诉我我怎么了?下面是四个文件:客户端文件、主文件、服务器文件和主文件。尝试从服务器读取fromServer.readLine()后,客户端出现错误。
错误:客户端软件中的错误导致连接中止:recv失败

            package client;
            import java.io.*;
            import java.net.*;
            import java.util.Scanner;

            public class Client
            {
            private PrintWriter toServer;
            private BufferedReader fromServer;
            private Socket socket;
            public Client( )throws IOException
                {
                socket = new Socket("127.0.0.1",3000);
            }
            public void openStreams() throws IOException
                {

            //
            //        InputStream is = socket.getInputStream();
            //        OutputStream os = socket.getOutputStream();
            //        fromServer = new BufferedReader(new InputStreamReader(is));
            //        toServer = new PrintWriter(os, true);

                toServer = new PrintWriter(socket.getOutputStream(),true);
                fromServer = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            }
            public void closeStreams() throws IOException
                {
                fromServer.close();
                toServer.close();
                socket.close();
            }
            public void run()throws IOException
                {
                openStreams();
                String msg = "";
                Scanner scanner = new Scanner(System.in);
                toServer.println("Hello from Client.");
            //    msg = scanner.nextLine();
                while (msg != "exit")
                {
                    System.out.println(">");
            //        msg = scanner.nextLine();
                    toServer.println("msg");
                    String tmp = fromServer.readLine();
                    System.out.println("Server said: " + tmp);
                }
                closeStreams();
            }
            }



        package server;
        import java.net.*;
        import java.io.*;

        public class Server
        {
        private ServerSocket serverSocket;
        private Socket socket;
        private PrintWriter toClient;
        private BufferedReader fromClient;
        public void run() throws IOException
            {
            System.out.println("Server is waiting for connections...");
            while (true)
            {
                openStreams();
                processClient();
                closeStreams();
            }

        }
        public void openStreams() throws IOException
            {
            serverSocket = new ServerSocket(3000);
            socket = serverSocket.accept();
            toClient = new PrintWriter(socket.getOutputStream(),true);
            fromClient = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        }
        public void closeStreams() throws IOException
            {
            fromClient.close();
            toClient.close();
            socket.close();
            serverSocket.close();
        }
        public void processClient()throws IOException
            {
            System.out.println("Connection established.");
            String msg = fromClient.readLine();
            toClient.println("Client said " + msg);
        }
        }


    package client;

    import java.io.IOException;


    public class Main {

        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            // TODO code application logic here

            try
            {
                 Client client = new Client();
                 client.run();
            }
            catch(IOException e)
            {
                 System.err.println("Error in Client " + e.getMessage());
            }
        }

    }



package server;

import java.io.IOException;


public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Server server = new Server();
        try
        {
        server.run();
        }
        catch(IOException e)
        {
            System.err.println("Error in Server " + e.getMessage());
        }
    }

}

你的服务器端全搞乱了。您需要另一个类,称之为Connection或ConnectedClient,它实现Runnable;将套接字作为构造函数参数;并为特定客户机执行所有服务器端I/O。目前,这些都与服务器类混淆了。您的服务器类所要做的就是创建一个ServerSocket,然后输入一个接受套接字并为其创建连接对象和启动线程的循环。服务器的run()方法中的套接字对象只是一个本地对象,关联的输入/输出流或读/写器属于连接类,而不是服务器类

这样,您就可以同时处理多个客户机,而不必让它们彼此为难

下一个问题是,当另一端关闭连接时,readLine()返回null。每次调用readLine()时,在执行任何其他处理之前,必须先测试此项


接下来,在使用套接字时,任何时候当您收到SocketException或IOException而不是SocketTimeoutException时,它都是死的-关闭它,忘记该客户端,如果它发生在服务器中,则退出线程。

您的服务器端完全混乱。您需要另一个类,称之为Connection或ConnectedClient,它实现Runnable;将套接字作为构造函数参数;并为特定客户机执行所有服务器端I/O。目前,这些都与服务器类混淆了。您的服务器类所要做的就是创建一个ServerSocket,然后输入一个接受套接字并为其创建连接对象和启动线程的循环。服务器的run()方法中的套接字对象只是一个本地对象,关联的输入/输出流或读/写器属于连接类,而不是服务器类

这样,您就可以同时处理多个客户机,而不必让它们彼此为难

下一个问题是,当另一端关闭连接时,readLine()返回null。每次调用readLine()时,在执行任何其他处理之前,必须先测试此项


接下来,当您在使用套接字时收到SocketException或IOException而不是SocketTimeoutException时,它是死的-关闭它,忘记该客户端,如果它发生在服务器中,则退出线程。

发布的代码在客户端无限循环中运行。 在猜测要取消注释的行(Client.java中的最后一行
scanner.nextLine()
)之后,我注意到以下问题:

  • 客户端保持连接打开,但服务器在收到第一条消息后关闭
  • 谓词
    msg!=“exit”
    在Java中始终为true-使用String.equals()
  • 正在工作的Server.processClient是:

    public void processClient()throws IOException
    {
        String msg = null;
        do {
            msg = fromClient.readLine();
            toClient.println("Client said " + msg);
        } while (!"exit".equals(msg));
    }
    
    正在工作的Client.run是:

    public void run()throws IOException
    {
        openStreams();
        String msg = "";
        Scanner scanner = new Scanner(System.in);
        while (!"exit".equals(msg))
        {
            System.out.print(">");
            msg = scanner.nextLine();
            toServer.println(msg);
            String tmp = fromServer.readLine();
            System.out.println("Server said: " + tmp);
        }
        closeStreams();
    }
    


    +评论:我集中精力纠正明显的错误。EJP的回答为您提供了如何改进代码的良好指导,包括处理同步连接、正确使用线程等。

    发布的代码在客户端以无限循环运行。 在猜测要取消注释的行(Client.java中的最后一行
    scanner.nextLine()
    )之后,我注意到以下问题:

  • 客户端保持连接打开,但服务器在收到第一条消息后关闭
  • 谓词
    msg!=“exit”
    在Java中始终为true-使用String.equals()
  • 正在工作的Server.processClient是:

    public void processClient()throws IOException
    {
        String msg = null;
        do {
            msg = fromClient.readLine();
            toClient.println("Client said " + msg);
        } while (!"exit".equals(msg));
    }
    
    正在工作的Client.run是:

    public void run()throws IOException
    {
        openStreams();
        String msg = "";
        Scanner scanner = new Scanner(System.in);
        while (!"exit".equals(msg))
        {
            System.out.print(">");
            msg = scanner.nextLine();
            toServer.println(msg);
            String tmp = fromServer.readLine();
            System.out.println("Server said: " + tmp);
        }
        closeStreams();
    }
    


    +评论:我集中精力纠正明显的错误。EJP的回答为您提供了如何改进代码的良好指导,包括处理同步连接、正确使用线程等。

    您是要告诉我们错误是什么,还是我们猜测呢?@skaffman抱歉,我忘了它。我已经更新了我原来的帖子。@EJP和Miklos感谢你们的回答。你们是要告诉我们错误是什么,还是我们猜对了?@skaffman我很抱歉我忘记了。我已经更新了我原来的帖子。@EJP和Miklos感谢你们的回答。