简体   繁体   English

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

[英]Network problem!(multithreaded client/server)

this is my Main class which belongs to the server application! 这是我的Main类,它属于服务器应用程序! but it is really surprizing that without running the client application,these sentences will be written in the console.would you please help me why?thanks. 但是确实令人惊讶的是,如果不运行客户端应用程序,这些语句将被写入控制台。请您帮我个忙吗?谢谢。

my Main class: 我的主班:

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

in the console: 在控制台中:

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

you create a Socket and declare that the client is connected before accepting a connection : 您创建一个Socket并在接受连接之前声明客户端已连接:

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

you should print 你应该打印

client is connected 客户端已连接

after this line 在这行之后

client = server.accept();

which blocks until a client actually connects 阻塞直到客户端实际连接

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM