网络问题!(多线程客户端/服务器)

时间:2010-01-13 06:22:21

标签: java multithreading networking

这是我的Main类,它属于服务器应用程序!但是如果没有运行客户端应用程序,这些句子将写在控制台中,真是令人惊讶。请你帮我解释一下原因?谢谢。

我的主要课程:

public class Main {

static Socket client = null;
static ServerSocket server = null;

// We can have 10 clients' connections
static ClientThread t[] = new ClientThread[10];

public static void main(String args[]) {
    System.out.println("Server is starting...");
    System.out.println("Server is listening...");
    try {
        server = new ServerSocket(5050);
        System.out.println("Client Connected...");


        while (true) {

            client = server.accept();
            for (int i = 0; i <= 9; i++) {
                if (t[i] == null) {
                    (t[i] = new ClientThread(client, t)).start();
                    break;
                }
            }
        }
    } catch (IOException e) {
        System.out.println(e);
    }
}
}

// This client thread opens the input and the output streams for a particular client,
// ask the client's name, informs all the clients currently connected to the
// server about the fact that a new client has joined the chat room,
// and as long as it receive data, echos that data back to all other clients.
// When the client leaves the chat room this thread informs also all the
// clients about that and terminates.

class ClientThread extends Thread {

DataInputStream is = null;
PrintStream os = null;
Socket clientSocket = null;
ClientThread t[];

public ClientThread(Socket clientSocket, ClientThread[] t) {
    this.clientSocket = clientSocket;
    this.t = t;
}

@Override
public void run() {
    String line;
    String name;
    try {
        is = new DataInputStream(clientSocket.getInputStream());
        os = new PrintStream(clientSocket.getOutputStream());
        os.println("Enter your name.");
        name = is.readLine();
        os.println("Hello " + name + " to our chat room.\nTo leave enter /quit in a new line");
        for (int i = 0; i <= 9; i++) {
            if (t[i] != null && t[i] != this) {
                t[i].os.println("*** A new user " + name + " entered the chat room !!! ***");
            }
        }
        while (true) {
            line = is.readLine();
            if (line.startsWith("/quit")) {
                break;
            }
            for (int i = 0; i <= 9; i++) {
                if (t[i] != null) {
                    t[i].os.println("<" + name + "> " + line);
                }
            }
        }
        for (int i = 0; i <= 9; i++) {
            if (t[i] != null && t[i] != this) {
                t[i].os.println("*** The user " + name + " is leaving the chat room !!! ***");
            }
        }

        os.println("*** Bye " + name + " ***");

        // Clean up:
        // Set to null the current thread variable such that other client could
        // be accepted by the server

        for (int i = 0; i <= 9; i++) {
            if (t[i] == this) {
                t[i] = null;
            }
        }

        // close the output stream
        // close the input stream
        // close the socket

        is.close();
        os.close();
        clientSocket.close();
    } catch (IOException e) {
        System.out.println(e);
    }
}}
控制台中的

init:
deps-jar:
compile-single:
run-single:
Server is starting...
Server is listening...
Client Connected...

1 个答案:

答案 0 :(得分:1)

创建一个Socket,并在接受连接之前声明客户端已连接:

        server = new ServerSocket(5050);
        System.out.println("Client Connected...");

你应该打印

  

客户端已连接

这一行之后

client = server.accept();

阻止直到客户端实际连接