1

将两个文件(客户端和服务器)中的代码合并为一个后,控件不再到达客户端代码。但是,我需要在后台运行服务器代码,然后运行我的客户端代码。

这是我的代码:

 //Server code 

 try {
        ServerSocket serverSocket = null; 

    try { 
         serverSocket = new ServerSocket(10007); 
        } 
    catch (IOException e) 
        { 
         System.err.println("Could not listen on port: 10007."); 
         System.exit(1); 
        } 

    Socket clientSocket = null; 
    System.out.println ("Waiting for connection.....");

    try { 
         clientSocket = serverSocket.accept(); 
        } 
    catch (IOException e) 
        { 
         System.err.println("Accept failed."); 
         System.exit(1); 
        } 

    System.out.println ("Connection successful");
    System.out.println ("Waiting for input.....");

    PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), 
                                      true); 
    BufferedReader in = new BufferedReader( 
            new InputStreamReader( clientSocket.getInputStream())); 

    String inputLine; 

    while ((inputLine = in.readLine()) != null) 
        { 
         System.out.println ("Server: " + inputLine); 
         out.println(inputLine); 

         if (inputLine.equals("Bye.")) 
             break; 
        } 

    out.close(); 
    in.close(); 
    clientSocket.close(); 
    serverSocket.close(); 

  //Client code 
        String serverHostname = new String ("127.0.0.1");
        System.out.println ("Attemping to connect to host " +
                serverHostname + " on port 10007.");
        Socket echoSocket = null;
        try {
            echoSocket = new Socket(serverHostname, 10007);
            out = new PrintWriter(echoSocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(
                                        echoSocket.getInputStream()));
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host: " + serverHostname);               
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for "
                               + "the connection to: " + serverHostname);              
        }

        BufferedReader stdIn = new BufferedReader(
                                   new InputStreamReader(System.in));
        String userInput;

        System.out.print ("input: ");           
            while ((userInput = stdIn.readLine()) != null) {
                out.println(userInput);
                System.out.println("echo: " + in.readLine());
                System.out.print ("input: ");
            }
        out.close();
        try {
            in.close();           
            stdIn.close();           
            echoSocket.close();
        } catch (IOException ex) {
            Exceptions.printStackTrace(ex);
        }

我不明白如何在后台运行我的服务器代码,然后运行我的客户端代码。

4

3 回答 3

0

从技术上讲,您可以通过实例化一个调用服务器代码的线程来在一个源文件中完成这一切

    // Start the Server
    new Thread(new Runnable() {
        public void run() {
            // .. all the server code
        }
    }).start();

    // Start the client

    // .. all the client code

在幕后,Java 可能正在为新的 Runnable() { } 技术等创建匿名内部类。

于 2012-11-08T23:11:58.507 回答
0

在主类中使用public static class Client嵌套。Server它们中的每一个都可以有自己的main方法,因此这是一种在一个文件中实现所有目标的方法,但有两个单独的入口点。

另一种选择是有一个入口点,但让它启动两个线程,一个用于客户端,一个用于服务器。

于 2012-11-08T19:22:48.213 回答
0

你需要做2个类:

  • 一位客户
  • 一台服务器

每个人都有自己的 main() 方法。

像这样你可以启动2个JVM的一个服务器,一个客户端

或在一堂课:

创建 2 个静态内部类实现Runnable,然后从主类内部开始:(我假设您的主类称为 Starter)

public static main(String args [ ]) {
                new Thread(new Starter.Server()).start();
                new Thread(new Starter.Client()).start();
            }

我会让你做清理代码...

于 2012-11-08T19:15:04.623 回答