Java网络客户端只发送一条消息

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

我正在学习Java,我正在编写一个示例客户端 - 服务器应用程序。 sokcket连接很好,一切正常,直到来自客户端应用程序的第二条消息。它没有到达服务器。如果我启动另一个客户端,它也会在第一条消息上成功,并在第二条消息时失败。

有人有想法吗?提前致谢!

服务器代码:

package networking;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    private static Socket socket;

    public static void main(String[] args) {
        try {

            int port = 25000;
            ServerSocket serverSocket = new ServerSocket(port);
            System.out.println("Server Started and listening to the port 25000");

            //Server is running always. This is done using this while(true) loop
            while (true) {
                //Reading the message from the client
                socket = serverSocket.accept();
                InputStream is = socket.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                String incomingMessage = br.readLine();
                System.out.println("((( " + incomingMessage);

                String returnMessage = incomingMessage;

                //Sending the response back to the client.
                OutputStream os = socket.getOutputStream();
                OutputStreamWriter osw = new OutputStreamWriter(os);
                BufferedWriter bw = new BufferedWriter(osw);
                bw.write(returnMessage + "\n");
                bw.flush();
                System.out.println("))) " + returnMessage);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                socket.close();
            } catch (Exception e) {
            }
        }
    }
}

和客户

package networking;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Client {

    private static Socket socket;

    public static void main(String args[]) {
        try {
            String host = "localhost";
            int port = 25000;
            InetAddress address = InetAddress.getByName(host);
            socket = new Socket(address, port);

            //Send the message to the server
            OutputStream os = socket.getOutputStream();
            OutputStreamWriter osw = new OutputStreamWriter(os);
            BufferedWriter bw = new BufferedWriter(osw);

            BufferedReader console = new BufferedReader(new InputStreamReader(System.in));

            InputStream is = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);

            String message = "";
            /*
            while(!message.equals("q")) {

                System.out.print("Message: ");
                message = console.readLine();
                bw.write(message + "\n");
                bw.flush();
                System.out.println("))) " + message);
                //Get the return message from the server
                String incomingMessage = br.readLine();
                System.out.println("((( " + incomingMessage);
            }
             */
            for (int i = 0; i < 10; i++) {
                bw.write(i + "\n");
                bw.flush();
                System.out.println("))) " + i);
                String incomingMessage = br.readLine();
                System.out.println("((( " + incomingMessage);
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        } finally {
            //Closing the socket
            try {
                socket.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}
java networking
2个回答
2
投票

您的while在您的服务器代码中放错了位置,实际上您需要2个while循环:

  • 一个接受新客户
  • 一个用于管理客户端的多条消息

在伪代码中它给你:

while (true):
    accept new client
    while (client connected):
        read message from client
        write back message to client
    close client socket

如果你想使用线程,那么你必须委托给一个新线程的内部while循环任务。

注意:accept阻止,直到新客户端到来。这就是为什么你只能通过客户端发送一条消息。


2
投票

您的服务器未设置为处理此问题。您正在读取一行,然后丢弃GC的连接,而不关闭它。服务器读取一行,然后忽略所有其他行并开始侦听下一个连接。

另外,请考虑使用线程。

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