问题描述
我试图实现多线程与我一直在努力的客户端/服务器程序。我需要允许多个客户端同时连接到服务器。我目前有4个类:一个客户端,一个服务器,一个协议和一个工人来处理线程。以下代码是我为这些类:
SocketServer类:
public class SocketServer {
public static void main(String [] args)throws IOException {
int portNumber = 9987;
try(
ServerSocket serverSocket = new ServerSocket(portNumber);
Socket clientSocket = serverSocket.accept();
PrintWriter out =
new PrintWriter clientSocket.getOutputStream(),true);
BufferedReader in = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));
){
= new Thread(new ClientWorker(clientSocket));
thread.start(); // start thread
String inputLine,outputLine;
//启动与客户端的会话
协议prot = new Protocol();
outputLine = prot.processInput(null);
out.println(outputLine);
while((inputLine = in.readLine())!= null){
outputLine = prot.processInput(inputLine);
out.println(outputLine);
if(outputLine.equals(quit))
break;
}
} catch(IOException e){
System.out.println(尝试在端口
+ portNumber +上侦听或侦听连接时捕获到异常 );
System.out.println(e.getMessage());
}
}
}
SocketClient类别:
public class SocketClient {
public static void main(String [] args)throws IOException
{
String hostName =localhost;
int portNumber = 9987;
try(
Socket socket = new Socket(hostName,portNumber);
PrintWriter out = new PrintWriter(socket.getOutputStream(),true);
BufferedReader = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
){
BufferedReader stdIn =
new BufferedReader(new InputStreamReader(System.in)
String fromServer;
String fromUser;
while((fromServer = in.readLine())!= null){
System.out.println(Server:+ fromServer);
if(fromServer.equals(quit))
break;
fromUser = stdIn.readLine();
if(fromUser!= null){
System.out.println(Client:+ fromUser);
out.println(fromUser);
}
}
} catch(UnknownHostException e){
System.err.println(Do not know about host+ hostName);
System.exit(1);
} catch(IOException e){
System.err.println(无法获得I / O的连接到+
hostName);
System.exit(1);
}
}
}
协议类别:
public class Protocol {
private static final int waiting = 0;
private static final int sentPrompt = 1;
private int status = waiting;
public String processInput(String theInput){
String theOutput = null;
if(status == waiting){
theOutput =请输入您想要检索的内容:'customer'或'product'
status = sentPrompt;
}
else if(status == sentPrompt){
if(theInput.equalsIgnoreCase(product)){
File f = new File(product.txt) ;
Scanner sc = null;
try {
sc = new Scanner(f);
} catch(FileNotFoundException ex){
Logger.getLogger(Protocol.class.getName())。log(Level.SEVERE,null,ex);
}
while(sc.hasNextLine()){
String line = sc.nextLine();
theOutput =当前产品条目是:+ line;
}
return theOutput;
}
else if(theInput.equalsIgnoreCase(customer)){
File f = new File(customer.txt);
Scanner sc = null;
try {
sc = new Scanner(f);
} catch(FileNotFoundException ex){
Logger.getLogger(Protocol.class.getName())。log(Level.SEVERE,null,ex);
}
while(sc.hasNextLine()){
String lines = sc.nextLine();
theOutput =当前客户条目是:+ line;
}
return theOutput;
}
else if(theInput.equalsIgnoreCase(quit)){
returnquit;
}
else {
returnquit;
}
}
return theOutput;
}
}
ClientWorker类:
public class ClientWorker implements Runnable {
private final Socket client;
public ClientWorker(Socket客户端){
this.client = client;
}
@Override
public void run(){
String line;
BufferedReader in = null;
PrintWriter out = null;
try {
System.out.println(Thread started with name:+ Thread.currentThread()。getName());
in = new BufferedReader(new InputStreamReader(client.getInputStream()));
out = new PrintWriter(client.getOutputStream(),true);
} catch(IOException e){
System.out.println(in或out failed);
System.exit(-1);
}
while(true){
try {
System.out.println(Thread running with name:+ Thread.currentThread()。getName ));
line = in.readLine();
//将数据发送回客户端
out.println(line);
//将数据附加到文本区
} catch(IOException e){
System.out.println(Read failed);
System.exit(-1);
}
}
}
}
我运行服务器和客户端,一切工作正常如预期。然后当我尝试运行另一个客户端,它只是挂在那里,并不提示客户端给出响应。
您的服务器代码应该实现以下功能。
-
继续接受
-
通过传递客户端套接字(即) p>
-
在客户端套接字线程中执行IO处理,例如
ClientWorker
请查看此
您的代码应为
ServerSocket serverSocket = new ServerSocket(portNumber);
while(true){
try {
Socket clientSocket = serverSocket.accept();
线程线程= new ClientWorker(clientSocket);
thread.start(); // start thread
} catch(Exception err){
err.printStackTrace();
}
}
I am trying to implement multi threading with a client/server program I have been working on. I need to allow multiple clients to connect to the server at the same time. I currently have 4 classes: a Client, a Server, a Protocol and a Worker to handle the threads. The following code is what I have for those classes:
SocketServer Class:
public class SocketServer {
public static void main(String[] args) throws IOException {
int portNumber = 9987;
try (
ServerSocket serverSocket = new ServerSocket(portNumber);
Socket clientSocket = serverSocket.accept();
PrintWriter out =
new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));
) {
Thread thread = new Thread(new ClientWorker(clientSocket));
thread.start(); //start thread
String inputLine, outputLine;
// Initiate conversation with client
Protocol prot = new Protocol();
outputLine = prot.processInput(null);
out.println(outputLine);
while ((inputLine = in.readLine()) != null) {
outputLine = prot.processInput(inputLine);
out.println(outputLine);
if (outputLine.equals("quit"))
break;
}
} catch (IOException e) {
System.out.println("Exception caught when trying to listen on port "
+ portNumber + " or listening for a connection");
System.out.println(e.getMessage());
}
}
}
SocketClient Class:
public class SocketClient {
public static void main(String[] args) throws IOException
{
String hostName = "localhost";
int portNumber = 9987;
try (
Socket socket = new Socket(hostName, portNumber);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
) {
BufferedReader stdIn =
new BufferedReader(new InputStreamReader(System.in));
String fromServer;
String fromUser;
while ((fromServer = in.readLine()) != null) {
System.out.println("Server: " + fromServer);
if (fromServer.equals("quit"))
break;
fromUser = stdIn.readLine();
if (fromUser != null) {
System.out.println("Client: " + fromUser);
out.println(fromUser);
}
}
} catch (UnknownHostException e) {
System.err.println("Don't know about host " + hostName);
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection to " +
hostName);
System.exit(1);
}
}
}
Protocol Class:
public class Protocol {
private static final int waiting = 0;
private static final int sentPrompt = 1;
private int status = waiting;
public String processInput(String theInput) {
String theOutput = null;
if (status == waiting) {
theOutput = "Please enter what you would like to retrieve: 'customer' or 'product' ";
status = sentPrompt;
}
else if ( status == sentPrompt ) {
if ( theInput.equalsIgnoreCase("product")) {
File f = new File("product.txt");
Scanner sc = null;
try {
sc = new Scanner(f);
} catch (FileNotFoundException ex) {
Logger.getLogger(Protocol.class.getName()).log(Level.SEVERE, null, ex);
}
while ( sc.hasNextLine() ) {
String line = sc.nextLine();
theOutput = "The current product entries are : " + line;
}
return theOutput;
}
else if ( theInput.equalsIgnoreCase("customer")) {
File f = new File("customer.txt");
Scanner sc = null;
try {
sc = new Scanner(f);
} catch (FileNotFoundException ex) {
Logger.getLogger(Protocol.class.getName()).log(Level.SEVERE, null, ex);
}
while ( sc.hasNextLine() ) {
String line = sc.nextLine();
theOutput = "The current customer entries are : " + line;
}
return theOutput;
}
else if ( theInput.equalsIgnoreCase("quit")) {
return "quit";
}
else {
return "quit";
}
}
return theOutput;
}
}
The ClientWorker Class:
public class ClientWorker implements Runnable {
private final Socket client;
public ClientWorker( Socket client ) {
this.client = client;
}
@Override
public void run() {
String line;
BufferedReader in = null;
PrintWriter out = null;
try {
System.out.println("Thread started with name:"+Thread.currentThread().getName());
in = new BufferedReader(new InputStreamReader(client.getInputStream()));
out = new PrintWriter(client.getOutputStream(), true);
} catch (IOException e) {
System.out.println("in or out failed");
System.exit(-1);
}
while (true) {
try {
System.out.println("Thread running with name:"+Thread.currentThread().getName());
line = in.readLine();
//Send data back to client
out.println(line);
//Append data to text area
} catch (IOException e) {
System.out.println("Read failed");
System.exit(-1);
}
}
}
}
When I run the server and client, everything works fine as expected. Then when I try to run another client, it just hangs there and does not prompt the client to give a response. Any insight into what I am missing is greatly appreciated!
Your server code should address implement below functionalities.
Keep accepting socket from ServerSocket in a while loop
Create new thread after accept() call by passing client socket i.e Socket
Do IO processing in client socket thread e.g
ClientWorker
in your case.
Have a look at this article
Your code should be
ServerSocket serverSocket = new ServerSocket(portNumber);
while(true){
try{
Socket clientSocket = serverSocket.accept();
Thread thread = new ClientWorker(clientSocket);
thread.start(); //start thread
}catch(Exception err){
err.printStackTrace();
}
}
这篇关于客户端服务器程序的多线程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!