为什么我的代码不能在java多线程中运行许多客户端?
为什么这个代码没有积累很多客户端? 我是java新手。 它只为一个客户端运行。 有人能解释为什么它不支持多个客户端进行套接字编程吗为什么我的代码不能在java多线程中运行许多客户端?,java,multithreading,Java,Multithreading,为什么这个代码没有积累很多客户端? 我是java新手。 它只为一个客户端运行。 有人能解释为什么它不支持多个客户端进行套接字编程吗 import java.net.*; import java.io.*; /** * Demo Server: Contains a multi-threaded socket server sample code. */ public class ServerDemo extends Thread { final static int _portNu
import java.net.*;
import java.io.*;
/**
* Demo Server: Contains a multi-threaded socket server sample code.
*/
public class ServerDemo extends Thread
{
final static int _portNumber = 5559; //Arbitrary port number
public static void main(String[] args)
{
try {
new ServerDemo().startServer();
} catch (Exception e) {
System.out.println("I/O failure: " + e.getMessage());
e.printStackTrace();
}
}
public void startServer() throws Exception {
ServerSocket serverSocket = null;
boolean listening = true;
try {
serverSocket = new ServerSocket(_portNumber);
} catch (IOException e) {
System.err.println("Could not listen on port: " + _portNumber);
System.exit(-1);
}
while (listening) {
handleClientRequest(serverSocket);
}
serverSocket.close();
}
private void handleClientRequest(ServerSocket serverSocket) {
try {
new ConnectionRequestHandler(serverSocket.accept()).run();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Handles client connection requests.
*/
public class ConnectionRequestHandler implements Runnable{
private Socket _socket = null;
private PrintWriter _out = null;
private BufferedReader _in = null;
public ConnectionRequestHandler(Socket socket) {
_socket = socket;
}
public void run() {
System.out.println("Client connected to socket: " + _socket.toString());
try {
_out = new PrintWriter(_socket.getOutputStream(), true);
_in = new BufferedReader(new InputStreamReader(_socket.getInputStream()));
String inputLine, outputLine;
BusinessLogic businessLogic = new BusinessLogic();
outputLine = businessLogic.processInput(null);
_out.println(outputLine);
//Read from socket and write back the response to client.
while ((inputLine = _in.readLine()) != null) {
outputLine = businessLogic.processInput(inputLine);
if(outputLine != null) {
_out.println(outputLine);
if (outputLine.equals("exit")) {
System.out.println("Server is closing socket for client:" + _socket.getLocalSocketAddress());
break;
}
} else {
System.out.println("OutputLine is null!!!");
}
}
} catch (IOException e) {
e.printStackTrace();
} finally { //In case anything goes wrong we need to close our I/O streams and sockets.
try {
_out.close();
_in.close();
_socket.close();
} catch(Exception e) {
System.out.println("Couldn't close I/O streams");
}
}
}
}
/**
* Handles business logic of application.
*/
public static class BusinessLogic {
private static final int LoginUserName = 0;
private static final int LoginPassword = 1;
private static final int AuthenticateUser = 2;
private static final int AuthSuccess = 3;
private int state = LoginUserName;
private String userName = null;
private String userPassword = null;
public String processInput(String clientRequest) {
String reply = null;
try {
if(clientRequest != null && clientRequest.equalsIgnoreCase("login")) {
state = LoginPassword;
}if(clientRequest != null && clientRequest.equalsIgnoreCase("exit")) {
return "exit";
}
if(state == LoginUserName) {
reply = "Please Enter your user name: ";
state = LoginPassword;
} else if(state == LoginPassword) {
userName = clientRequest;
reply = "Please Enter your password: ";
state = AuthenticateUser;
} else if(state == AuthenticateUser) {
userPassword = clientRequest;
if(userName.equalsIgnoreCase("John") && userPassword.equals("doe")) {
reply = "Login Successful...";
state = AuthSuccess;
} else {
reply = "Invalid Credentials!!! Please try again. Enter you user name: ";
state = LoginPassword;
}
} else {
reply = "Invalid Request!!!";
}
} catch(Exception e) {
System.out.println("input process falied: " + e.getMessage());
return "exit";
}
return reply;
}
}
}
您没有在代码中启动线程 而不是
new ConnectionRequestHandler(serverSocket.accept()).run();
召唤
启动线程时将调用Runnable
类的run()
方法,不应直接调用此run()
方法
相反,您应该通过创建一个线程实例
Thread myThread = new Thread(aRunnableInstance);
然后开始:
myThread.start();
您没有在代码中启动线程 而不是
new ConnectionRequestHandler(serverSocket.accept()).run();
召唤
启动线程时将调用Runnable
类的run()
方法,不应直接调用此run()
方法
相反,您应该通过创建一个线程实例
Thread myThread = new Thread(aRunnableInstance);
然后开始:
myThread.start();
您没有在代码中启动线程 而不是
new ConnectionRequestHandler(serverSocket.accept()).run();
召唤
启动线程时将调用Runnable
类的run()
方法,不应直接调用此run()
方法
相反,您应该通过创建一个线程实例
Thread myThread = new Thread(aRunnableInstance);
然后开始:
myThread.start();
您没有在代码中启动线程 而不是
new ConnectionRequestHandler(serverSocket.accept()).run();
召唤
启动线程时将调用Runnable
类的run()
方法,不应直接调用此run()
方法
相反,您应该通过创建一个线程实例
Thread myThread = new Thread(aRunnableInstance);
然后开始:
myThread.start();
您没有启动新线程,只是在主线程中运行RequestHandler代码 查找
Thread.start()
和Runnable.run()
之间的差异。也许会有帮助
编辑:
您只是缺少了告诉JVM创建一个新线程来执行可运行代码的部分。如果不调用Thread.start(),当前(也是唯一)线程将忙于一次处理一个请求。基本上,每个请求需要一个线程。有更高级的方法可以做到这一点(线程池等等),但这应该可以让您开始
private void handleClientRequest(ServerSocket serverSocket) {
try {
new Thread(ConnectionRequestHandler(serverSocket.accept())).start();
} catch (IOException e) {
e.printStackTrace();
}
}
您没有启动新线程,只是在主线程中运行RequestHandler代码 查找
Thread.start()
和Runnable.run()
之间的差异。也许会有帮助
编辑:
您只是缺少了告诉JVM创建一个新线程来执行可运行代码的部分。如果不调用Thread.start(),当前(也是唯一)线程将忙于一次处理一个请求。基本上,每个请求需要一个线程。有更高级的方法可以做到这一点(线程池等等),但这应该可以让您开始
private void handleClientRequest(ServerSocket serverSocket) {
try {
new Thread(ConnectionRequestHandler(serverSocket.accept())).start();
} catch (IOException e) {
e.printStackTrace();
}
}
您没有启动新线程,只是在主线程中运行RequestHandler代码 查找
Thread.start()
和Runnable.run()
之间的差异。也许会有帮助
编辑:
您只是缺少了告诉JVM创建一个新线程来执行可运行代码的部分。如果不调用Thread.start(),当前(也是唯一)线程将忙于一次处理一个请求。基本上,每个请求需要一个线程。有更高级的方法可以做到这一点(线程池等等),但这应该可以让您开始
private void handleClientRequest(ServerSocket serverSocket) {
try {
new Thread(ConnectionRequestHandler(serverSocket.accept())).start();
} catch (IOException e) {
e.printStackTrace();
}
}
您没有启动新线程,只是在主线程中运行RequestHandler代码 查找
Thread.start()
和Runnable.run()
之间的差异。也许会有帮助
编辑:
您只是缺少了告诉JVM创建一个新线程来执行可运行代码的部分。如果不调用Thread.start(),当前(也是唯一)线程将忙于一次处理一个请求。基本上,每个请求需要一个线程。有更高级的方法可以做到这一点(线程池等等),但这应该可以让您开始
private void handleClientRequest(ServerSocket serverSocket) {
try {
new Thread(ConnectionRequestHandler(serverSocket.accept())).start();
} catch (IOException e) {
e.printStackTrace();
}
}
我不明白这个问题。我不明白这个问题。我不明白这个问题。我不明白这个问题。但是先生。。run()是一个过程。。过程就在那里……?:(
run()
是一种在线程启动时自动调用的方法,该线程是使用可运行实例生成的。您不应直接调用run()
。当您通过myThread.start()启动线程时,将调用该方法。);
如我在回答中所述调用。先生,我将把线程myThread=new Thread(aRunnableInstance)放在哪里;对不起,先生,我是套接字编程新手。先生,即使我没有调用它,run()也会自动执行吗?run()
将在您启动线程时自动调用。请仔细阅读我的回答,特别是关于替换代码的部分。但是,先生..run()是一个过程..进程在那里..?:(run())
是一种在线程启动时自动调用的方法,该线程是使用您的可运行实例生成的。您不应该直接调用run()
。当您通过myThread.start();
调用启动线程时,它将被调用,正如我在回答中所述。先生,我将把线程myThread=新线程放在哪里(aRunnableInstance);对不起,先生,我是套接字编程新手。先生,即使我没有调用run(),它也会自动执行吗?run()
将在您启动线程时自动调用。请仔细阅读我的回答,特别是关于替换代码的部分。但是先生..run())是一个过程。。进程在那里。:(run()
是一个在线程启动时自动调用的方法,该线程是用可运行实例生成的。您不应该直接调用run()
。当您通过myThread.start()启动线程时,将调用该方法。)
如我在回答中所描述的那样打电话。先生,我该把线放在哪里