Java TCP Client-Server - 在两个应用程序中陷入无限循环[重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

我有一个实习任务,我已经完成了大部分要求,我只是遇到了最后一个问题。

我有一个客户端和一个服务器,他们应该以两种方式进行通信。一切运作良好,客户端将一些信息发送到服务器,服务器使用该信息做了一些事情。现在我尝试实现服务器回复。在我尝试实现之后,两个程序现在都停留在无限循环中,等待来自另一方的信息。

我知道在这里复制代码更常见,但我认为为这个问题发送图片会更合乎逻辑。

https://imgur.com/a/Td1jK

程序卡在服务器端的第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();
}

我没有添加整个项目,因为它的大部分与问题无关,并且它有很多代码,再次感谢高级!

java tcp client-server
1个回答
0
投票

您的服务器在readLine()上阻塞。它阻止了行终止符。客户端只发送一个原始字符串。解决方案是使用每个原始字符串发送行终止符。当服务器响应客户端时也是如此。

正如西蒙指出的那样,如果您的消息协议是传递行终止字符串,那么打印编写器将是一个不错的选择。

© www.soinside.com 2019 - 2024. All rights reserved.