gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:08:33 26 4
gpt4 key购买 nike

这是我的主类,属于服务器应用程序!但令人惊讶的是,在不运行客户端应用程序的情况下,这些句子将被写入控制台中。请您帮我解释一下为什么?谢谢。

我的主课:

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...

最佳答案

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

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

你应该打印

client is connected

此行之后

client = server.accept();

在客户端实际连接之前会阻塞

关于java - 网络问题!(多线程客户端/服务器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2054842/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com