在后台运行服务器套接字代码,然后运行客户端代码



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

这是我的代码:

 //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);
        }

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

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

另一个选择是拥有一个单个入口点,但使其启动两个线程,一个用于客户端,一个用于服务器。

您需要进行2类:

  • 一个客户
  • 一台服务器

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

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

或一个类:

创建2个静态内部类实现Runnable,然后您从主类内部开始两者:

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

我会让您进行清理代码...

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

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

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

最新更新