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

Java网络客户端只发送一条消息,java,networking,Java,Networking,我正在学习Java,并且正在编写一个客户机-服务器应用程序的示例。 Sok凯特连接正常,在客户端应用程序发出第二条消息之前,一切正常。它无法到达服务器。如果我启动另一个客户端,它也会在第一条消息中成功,而在第二条消息中失败 有人有主意吗?提前谢谢 服务器代码: package networking; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStream; import j

我正在学习Java,并且正在编写一个客户机-服务器应用程序的示例。 Sok凯特连接正常,在客户端应用程序发出第二条消息之前,一切正常。它无法到达服务器。如果我启动另一个客户端,它也会在第一条消息中成功,而在第二条消息中失败

有人有主意吗?提前谢谢

服务器代码:

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.io.BufferedReader;
导入java.io.BufferedWriter;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入java.io.OutputStream;
导入java.io.OutputStreamWriter;
导入java.net.ServerSocket;
导入java.net.Socket;
公共类客户端{
专用静态插座;
公共静态void main(字符串参数[]){
试一试{
String host=“localhost”;
int端口=25000;
InetAddress=InetAddress.getByName(主机);
套接字=新套接字(地址、端口);
//将消息发送到服务器
OutputStream os=socket.getOutputStream();
OutputStreamWriter osw=新的OutputStreamWriter(os);
BufferedWriter bw=新的BufferedWriter(osw);
BufferedReader控制台=新的BufferedReader(新的InputStreamReader(System.in));
InputStream=socket.getInputStream();
InputStreamReader isr=新的InputStreamReader(is);
BufferedReader br=新的BufferedReader(isr);
字符串消息=”;
/*
而(!message.equals(“q”)){
系统输出打印(“消息:”);
message=console.readLine();
写入(消息+“\n”);
bw.flush();
System.out.println(“)”+消息);
//从服务器获取返回消息
字符串incomingMessage=br.readLine();
System.out.println(“(“+输入消息”);
}
*/
对于(int i=0;i<10;i++){
写入(i+“\n”);
bw.flush();
System.out.println(“)”+i);
字符串incomingMessage=br.readLine();
System.out.println(“(“+输入消息”);
}
}捕获(异常){
异常。printStackTrace();
}最后{
//合上插座
试一试{
socket.close();
}捕获(例外e){
e、 printStackTrace();
}
}
}
}

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


也可以考虑使用线程。

没有设置服务器来处理这个问题。您正在读取一行,然后放弃GC的连接,而不关闭它。服务器读取一行,然后忽略所有其他行,开始监听下一连接。


也可以考虑使用线程。

< p>您的<代码> 在您的服务器代码中被错误放置,并且实际上您需要2代码>而Roo:

  • 一个是用来接受新客户的
  • 一个用于通过客户端管理多条消息
在伪代码中,它为您提供:

while (true):
    accept new client
    while (client connected):
        read message from client
        write back message to client
    close client socket
如果要使用线程,则必须将内部
while
循环任务委托给新线程


注意:
accept
在新客户端到来之前一直处于阻止状态。这就是为什么客户端只能发送一条消息。

您的
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
在新客户端到来之前一直处于阻止状态。这就是为什么客户端只能发送一条消息。

在服务器上,在完成连接后关闭conn。否则,它将使您更容易受到DDoS攻击!在服务器上,在完成连接后关闭conn。否则,它将使您更容易受到DDoS攻击re!我将尝试使用线程重写它,然后返回结果。谢谢!我将尝试使用线程重写它,然后返回结果。谢谢!但是如果没有线程,您一次不能使用多个客户端…但是如果没有线程,您一次不能使用多个客户端。。。