Java TCP Client-Server - 在两个应用程序中陷入无限循环[重复]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java TCP Client-Server - 在两个应用程序中陷入无限循环[重复]相关的知识,希望对你有一定的参考价值。
这个问题在这里已有答案:
我有一个实习任务,我已经完成了大部分要求,我只是遇到了最后一个问题。
我有一个客户端和一个服务器,他们应该以两种方式进行通信。一切运作良好,客户端将一些信息发送到服务器,服务器使用该信息做了一些事情。现在我尝试实现服务器回复。在我尝试实现之后,两个程序现在都停留在无限循环中,等待来自另一方的信息。
我知道在这里复制代码更常见,但我认为为这个问题发送图片会更合乎逻辑。
程序卡在服务器端的第89行,客户端的第45行。如果你可以帮我解决这个问题,我将非常感激,在截止日期前我只有两个半小时。提前致谢!!
编辑:无论如何决定上传代码
这是我的服务器端代码:
public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
logger.log(Level.INFO, "args[0]: {0} args[1]: {1} args[2]: {2} args[3] {3}", new Object[]{args[0], args[1], args[2], args[3]});
pathToExcel = args[0];
pathToDatabase = args[1];
numberOfAccounts = Integer.parseInt(args[2]);
portNumber = Integer.parseInt(args[3]);
listIE = new ArrayList<>();
listIE = Loader.getList(numberOfAccounts, pathToExcel);
DBBroker.createTables(pathToDatabase);
System.out.println("Check value: " + DBBroker.checkDB());
if (DBBroker.checkDB() == false) {
DBBroker.insertData();
DBBroker.insertDataBalance();
} else {
System.out.println("Data has already been inserted into the database");
}
startServer();
}
public static void startServer() throws IOException {
//ServerSocket ss = new ServerSocket(portNumber);
ServerSocket ss = new ServerSocket(portNumber);
logger.log(Level.INFO, "Server started on port number: {0}", portNumber);
try {
while (true) {
Socket clientSocket = ss.accept();
BufferedReader input = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
DataOutputStream clientOutput = new DataOutputStream(clientSocket.getOutputStream());
System.out.println("Client connected ");
//***************************************************************************
String answer = input.readLine();
//***************************************************************************
System.out.println("prosao readline");
//logger.info("Client logged in on port " +portNumber);
String[] niz = answer.split("_");
//System.out.println("niz: " +Arrays.toString(niz));
serverPortNumber = Integer.parseInt(niz[0]);
accountName = niz[1];
receiverName = niz[2];
amount = Integer.parseInt(niz[3]);
//System.out.println("Server port number: " +serverPortNumber + " accountname: " +accountName +" receiver name: " +receiverName + " amount: " +amount);
parseRequestFromClient();
System.out.println("Prosao request");
clientOutput.writeBytes("Kraj");
clientSocket.close();
}
//ss.close();
} catch (Exception e) {
e.printStackTrace();
}
}
这是我的客户端代码:
public static void main(String[] args) throws IOException {
String messageFromServer = "";
logger.log(Level.INFO, "args[0]: {0} args[1]: {1} args[2]: {2} args[3] {3}", new Object[]{args[0], args[1], args[2], args[3]});
Socket socket = new Socket("localhost", Integer.parseInt(args[0]));
//logger.info("args[0]: " +args[0] +" args[1]: " +args[1] +" args[2]: " +args[2] +" args[3] " +args[3]);
DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());
BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String dataForServer = args[0]+"_"+args[1]+"_"+args[2]+"_"+args[3];
System.out.println("Data for server: " +dataForServer);
outputStream.writeBytes(dataForServer);
System.out.println("prosao dataforserver");
//***************************************************************************
String answer = input.readLine();
//***************************************************************************
System.out.println("prosao readline");
System.out.println(answer);
socket.close();
}
我没有添加整个项目,因为它的大部分与问题无关,并且它有很多代码,再次感谢高级!
您的服务器在readLine()上阻塞。它阻止了行终止符。客户端只发送一个原始字符串。解决方案是使用每个原始字符串发送行终止符。当服务器响应客户端时也是如此。
正如西蒙指出的那样,如果您的消息协议是传递行终止字符串,那么打印编写器将是一个不错的选择。
以上是关于Java TCP Client-Server - 在两个应用程序中陷入无限循环[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Java不走弯路教程(4.Client-Server模式-Server)
基于线程池消息队列和epoll模型实现Client-Server并发架构
@ERROR: auth failed on module wwwroot rsync error: error starting client-server protocol (code 5) at