无法在Java中运行多线程服务器程序

时间:2012-04-06 11:05:19

标签: java sockets

这是服务器代码

package echoserver;

import java.net.*;
import java.io.*;

public class EchoServer {

    public static void main(String[] args) {
        try {

            //establish server socket
            ServerSocket s = new ServerSocket(1981);

            //Thread client connectionsincoming
            while (true) {
                //wait for incoming connection
                Socket incoming = s.accept();
                Runnable r = new ThreadedEchoHandler(incoming);
                Thread t = new Thread(r);
                t.start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


package echoserver;

import java.net.*;
import java.util.*;
import java.io.*;

class ThreadedEchoHandler implements Runnable {

    public ThreadedEchoHandler(Socket i) {
        //initializing socket
        incoming = i;
    }

    public void run() {
        try {
            try {
                //recieve input stream from socket
                InputStream inStream = incoming.getInputStream();

                //recieve output stream from socket
                OutputStream outStream = incoming.getOutputStream();

                //Create a scanner from input stream
                Scanner scan = new Scanner(inStream);

                //Create printer writer from output stream and enabled auto flushing
                PrintWriter out = new PrintWriter(outStream, true);

                //prompt users on how to exit program soon as a long in into the server
                out.println("Enter BYE to exit");

                boolean done = false;

                //while done is not true and scanner has next line loop
                while (!done && scan.hasNextLine()) {

                    //reading text that came in from the socket
                    String line = scan.nextLine();

                    //On the server print the ip address of where the text is coming from and the text they typed
                    System.out.println("Recieved from " + incoming.getInetAddress().getHostAddress() + ": " + line);

                    //Echo back the text the client typed to the client
                    out.println("Echo: " + line);

                    //if they type BYE in caps terminate there connection and I also trimmed whitespaces
                    if (line.trim().equals("BYE")) {
                        done = true;
                    }
                }
            } //finally close the socket connection
            finally {
                incoming.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    private Socket incoming;
}

这是客户端的代码

package client;

import java.net.*;
import java.io.*;

public class Client {

    public static void main(String[] args) throws IOException {
        PrintWriter out = null;
        try {
            Socket s = new Socket(InetAddress.getLocalHost(), 1981);
            System.out.println("Connected to server on port 1981");
            out = new PrintWriter(s.getOutputStream());

            out.println("Hello");
            s.close();

        } catch (Exception ex) {
            System.err.println(ex.getMessage());
        }
    }
}

Socktes正在成功创建,但是当控制进入t.start()方法调用时,它不会调用ThreadedEchoHandler类的run()方法。

为什么会这样?任何想法?

2 个答案:

答案 0 :(得分:2)

客户端将"Hello"写入PrintWriter。到目前为止,非常好。

您可能希望PrintWriter将此文本直接发送到套接字,但事实并非如此。 PrintWriter(OutputStream)构造函数中的文档说它创建了PrintWriter 而没有自动行刷新。这意味着,只要您想要实际发送内容,就必须致电out.flush()

在你致电out.flush()之前,文本只存在于某个内部缓冲区中,服务器将无法看到它。

答案 1 :(得分:0)

我的猜测是,acept语句永远阻塞,因为没有客户端连接到服务器。你可以在print中包装accept()来证明或反驳。