Java多客户端服务器不';无法接收来自客户端的消息?

Java多客户端服务器不';无法接收来自客户端的消息?,java,sockets,networking,stream,Java,Sockets,Networking,Stream,我设法设置了一个服务器,它将接受和管理多个套接字客户端。 但是现在,当我尝试发送消息时,服务器没有收到任何消息,但我确实刷新了消息 这是管理客户端的方法: public void run() { while(true) { for (Client c : this.clients) { try { if (c.getStream().read() != -1) { if (c

我设法设置了一个服务器,它将接受和管理多个套接字客户端。 但是现在,当我尝试发送消息时,服务器没有收到任何消息,但我确实刷新了消息

这是管理客户端的方法:

public void run() {

    while(true) {
        for (Client c : this.clients) {
            try {
                if (c.getStream().read() != -1) {
                    if (c.getInputStream() != null) {
                        System.out.println("He sent message");
                        c.sendMessage("hey client");
                    }
                }
            } catch (IOException e) {
                c.destruct();
                this.clients.remove(c); break;
            }
        }

        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
客户名单:

public ArrayList<Client> clients = new ArrayList<Client>(); // client list
和客户端(发送方):

为什么我的服务器没有收到任何东西

有一件事:

如果我发送消息+断开连接,这就是服务器将记录的内容(看起来它只在断开连接时发送消息或其他什么,不,它只在断开连接时进入If块):

我做错了什么?我怎样才能解决这个问题

服务器(主类)


我认为问题在于,你有一份客户名单,并试图以此来管理他们。我查找了
java.net.SocketException:Connection reset
,发现了以下问题:

这个问题的答案是这样的:

在您的情况下,连接似乎已被关闭 连接的服务器端。这可能是请求的一个问题 您正在发送或在其末尾发送一个问题


这让我觉得您并不是每次都保持与客户端的连接。您存储了它,然后又丢失了它,因此邮件不会被发送。要处理更多的客户端,您可能更希望有一个IP列表,而不是客户端,然后在您想要发送消息时进行连接。无法存储套接字连接。它必须是活跃的。Java(JVM)有自己的“垃圾收集”系统,它会杀死它。

客户端正在发送数据,服务器正在读取数据

我认为问题出在Client.getInputStream中

在.inStream.readLine()中,它读取一行文本。 从文件: 读取一行文本。行被视为由换行符('\n')、回车符('\r')或紧跟换行符的回车符中的任意一个终止

如果你改用阅读,也许它会起作用。只需使用一种协议,比如发送消息长度的前1或2个字节。也可以从客户端发送“\n”


顺便说一句,当您在客户端发送和断开连接时,服务器中出现异常的原因可能是由于TCP事实。客户端关闭了连接,可能从服务器收到了TCP ACK。然后,客户端中的TCP发送一个重置段。不过不太确定。服务器位于.inStream.readLine()处,然后收到异常。您是否也收到了“连接被对等方关闭”

我不知道为什么,但我需要使用
out.println(input)out.flush()
而不是
.print()
write()


我无法解释为什么我需要这样做。但是它成功了。

为什么让服务器为客户端发送消息?要设置消息服务器系统,您确实需要一个多线程(即两个并排线程)服务器和客户端,然后在收到消息时使用回调进行更新。我对你的逻辑有点困惑。您的服务器和客户端是两个独立的程序吗?等等。请再解释一下你的设置和问题。@EthanBrouwer是的,这是两个独立的程序,我添加了服务器的主类,经过编辑。不过,
c.sendMessage(“hey client”)。你为什么这么做
c
是对arraylist中某个客户端的引用,因此服务器不应该为其发送消息。我想你的客户机和服务器都搞糟了。@EthanBrouwer我这样做是为了确保它们之间的连接能够正常工作,也就是接收消息和发送消息。这并不是我对应用程序的真正想法,只是测试一下是否一切正常。sendMessage()应将消息刷新到客户端。这是因为您必须添加一条消息,正如我在答复中解释的那样
public class Client {

    private Socket socket;
    private int clientId;
    private BufferedReader inStream;
    private PrintWriter outStream;
    private boolean socketAlive = true;

    public Client(Socket sock) {
        this.socket = sock;
    }

    public void setup() {
        setInputOutputStream();
        System.out.println("New connection: " + this.getIpAddress());
        this.sendMessage("Successfully connected!");
    }

    public BufferedReader getStream() {
        return this.inStream;
    }

    public String getInputStream() {
        String toReturn = "";
        try {
            toReturn = this.inStream.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return toReturn;
    }

    public void destruct() {
        try {
            this.inStream.close();
            this.inStream = null;
            this.outStream.close();
            this.outStream = null;
            System.out.println("Client destruct: " + this.socket.getLocalSocketAddress());
            this.socket.close();
            this.socket = null;
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public Socket getConnection() {
        return this.socket;
    }

    private void setInputOutputStream() {
        try {
            inStream = new BufferedReader(new InputStreamReader(this.socket.getInputStream())); 
            outStream = new PrintWriter(this.socket.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void sendMessage(String s) {
        this.outStream.println(s);
        this.outStream.flush();
    }

    public String getIpAddress() {
        return this.socket.getRemoteSocketAddress().toString();
    }
}
public static void main(String[] args) {
    try {
        System.out.println("Client started");
        Socket sock = new Socket("localhost", 43594);
        Scanner scanner = new Scanner(System.in);
        String input;
        PrintWriter out = new PrintWriter(sock.getOutputStream());
        BufferedReader reader = new BufferedReader(new InputStreamReader(sock.getInputStream()));

        while (true) {
            input = scanner.nextLine();

            if (input != null) {
                out.print(input);
                out.flush();
            }
        }
    } catch (IOException e) {
        System.out.println("Client error");
    }

}
Server is successfully running on port 43594
New connection: /127.0.0.1:57102
He sent message
java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
    at sun.nio.cs.StreamDecoder.read(Unknown Source)
    at java.io.InputStreamReader.read(Unknown Source)
    at java.io.BufferedReader.fill(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    at Client.getInputStream(Client.java:32)
    at ClientHandler.run(ClientHandler.java:21)
Client destruct: 0.0.0.0/0.0.0.0:43594
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.*;
import java.util.ArrayList;

public class Server {

    private int port = 43594;

    public void listen() {
        System.out.println("Trying to listen...");
        try {
            final ServerSocket server = new ServerSocket(port);
            // Create new thread to handle clients I/O
            ClientHandler handler = new ClientHandler(server);
            // START it
            handler.start();
            System.out.println("Server is successfully running on port " + port);
            while (true) {
                // New connection found create a new Client object
                Client cl = new Client(server.accept());
                cl.setup();
                // add it to clietns list in the I/O handler
                handler.clients.add(cl);
            }           
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        // start up
        System.out.println("Starting up..");

        // server instance
        final Server server = new Server();

        // create a new thread for server
        new Thread(new Runnable() {
            @Override
            public void run() {
                // listen for new connections
                server.listen();
            }
        }).start();
    }
}