当前位置: 首页 > 知识库问答 >
问题:

Java 客户端服务器程序无限接受输入

羊舌琛
2023-03-14

我是java套接字编程的新手,我正在制作一个客户端服务器程序。服务器是多线程的。当客户端与服务器的连接打开时。服务器向客户端发送一个文本块,如下所示:

connection is open with the server....
Welcome Please Chose one of the following Operations
Insert, Read, Update, Delete
Type Exit to terminate connection.

当我键入读取或退出或任何操作时,它工作正常,服务器响应。但是当我选择一个操作即插入时,就会出现问题——

public class Client1 {

public static void main(String[] args) throws IOException {

    Socket socket=null;

    try {

        System.out.println("sending connection request to host 127.0.0.1 at port 2000");
        socket = new Socket("127.0.0.1", 2000);

        System.out.println("connection is open with the server....");

        Scanner scn = new Scanner(System.in);

        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        DataInputStream dis = new DataInputStream(socket.getInputStream());

        while (true) {

            System.out.println(dis.readUTF());
            String tosend = scn.nextLine();
            dos.writeUTF(tosend);

            // If client sends exit,close this connection
            // and then break from the while loop
            if (tosend.equals("Exit")) {
                System.out.println("Closing this connection : " + socket);
                socket.close();
                System.out.println("Connection closed");
                break;
            }

            String received = dis.readUTF();
            System.out.println(received);
        }
        // closing resources
        scn.close();
        dis.close();
        dos.close();
    }

        catch (Exception e ){
        System.out.println(e);
    } finally {

        try {
            if (socket != null) socket.close();
        } catch (Exception e){
            System.out.println(e);
        }
    }
}
public class ServerThread extends Thread{
Socket socket ;
DataInputStream dis;
DataOutputStream dos;

ServerThread(Socket socket,DataInputStream dis,DataOutputStream dos ){
    this.socket = socket;
    this.dis=dis;
    this.dos=dos;
}

@Override
public void run(){

    String received;
    String toreturn;
    String welcomeText = """
            Welcome Please Chose one of the following Operations
            Insert, Read, Update, Delete
            Type Exit to terminate connection.""";

    while (true){

    try {
        // Ask user what he wants
        dos.writeUTF(welcomeText);


        // receive the answer from client
        received = dis.readUTF();


        if(received.equals("Exit"))
        {
            System.out.println("Client " + this.socket + " sends exit...");
            System.out.println("Closing this connection.");
            this.socket.close();
            System.out.println("Connection closed");
            break;
        }

        // write on output stream based on the
        // answer from the client
        switch (received) {
// the problem starts here if I chose insert and wanna print what the user typed, it takes  
//input infinitely from the user
            case "Insert":
                toreturn = "Inserting new info...";
                dos.writeUTF(toreturn);
                String out = dis.readUTF();
                dos.writeUTF("Accepted");
                dos.writeUTF(out);
                break;

            case "Read":
                toreturn = "Reading User Info...";
                dos.writeUTF(toreturn);
                break;

            case "Update":
                toreturn = "Updating User Info...";
                dos.writeUTF(toreturn);
                break;

            case "Delete":
                toreturn = "Deleting User Info";
                dos.writeUTF(toreturn);
                break;


            default:
                dos.writeUTF("Unknown User");

                break;
        }

    } catch ( IOException e) {
        e.printStackTrace();
    }
    }

    try
    {
        // closing resources
        this.dis.close();
        this.dos.close();

    }catch(IOException e){
        e.printStackTrace();
    }
    }
}

我不知道这个循环是如何发生的,特别是因为服务器在选择操作时正确接受输入,但是当选择插入操作时,它只是无限地接受输入,有人能帮忙吗,如果这个问题仍然存在,我无法实现任何操作。

共有1个答案

姬裕
2023-03-14

我认为这是您的客户机,在while循环中,尝试从服务器中删除第二次读取,这是因为您曾经读取了服务器发送的所有内容,当循环再次启动时,您希望从服务器中读取,但没有什么可读取的内容,并变得空闲。

 类似资料:
  • 我想在一些计算机之间建立点对点连接,这样用户就可以在没有外部服务器的情况下聊天和交换文件。我最初的想法如下: 我在服务器上制作了一个中央服务器插座,所有应用程序都可以连接到该插座。此ServerSocket跟踪已连接的套接字(客户端),并将新连接的客户端的IP和端口提供给所有其他客户端。每个客户端都会创建一个新的ServerSocket,所有客户端都可以连接到它。 换句话说:每个客户端都有一个Se

  • 问题内容: 我有一个带有两个服务器端进程的程序。一台服务器只是将ArrayList发送给客户端。另一个服务器首先从客户端获取一个字符串,然后找到与该ID对应的正确记录,然后将记录发回。 我在第二个服务器进程中遇到问题。请参阅下面的println语句,其中显示“卡在此处”。那就是程序挂起的地方。 客户端: 问题答案: 您需要在两端的ObjectInputStream之前创建ObjectOutputS

  • 我已经用serversocket和套接字类在Java语言上创建了一个客户机服务器程序,带有datainputstream和dataoutputstream用于发送和接收数据。 但问题是,当我在LAN(局域网)或本地主机上运行时,它可以正常工作,但当我试图通过WAN(广域网)连接客户端和服务器时,它甚至连服务器都没有连接 并且为了通过WAN连接它,我输入了服务器端程序的ip地址作为socket类的C

  • 问题内容: 我正在编写一个Java包,该包将由另一种语言(matlab)调用。如果我的matlab进程结束,我希望Java进程继续运行。每当MATLAB重新启动时,它都应该能够与现有的运行过程进行通信。因此,我认为我需要让Java应用程序通过客户端/服务器模型中的套接字进行通信。我设想具有一组简单的功能: startServer(主机,端口) runCommand(服务器,命令…) stopSer

  • 问题内容: 我正在尝试以客户端/服务器方式制作Java应用程序。客户端是SWT中的GUI,它显示来自服务器的数据。服务器已连接到数据库。 好的,对此感到抱歉,我确定这是一个经典问题,但我不知道如何开始。 在我为他们工作的一个项目中,他们实施了很多魔术来透明地调用Glassfish服务器。 我不想使用Glassfish服务器。我只想要简单的Java语言。但是代理的概念似乎很酷。 你有这种想法或例子吗

  • 下面是服务器接受多个客户端连接并响应的代码。服务器能够接收客户端的消息,但客户端没有接收服务器消息。我在服务器上使用了多线程概念。我还观察到,除了标有 ####. 的行之外,没有任何工作(即使是println语句)可能是客户端被阻止了...有什么想法吗?服务器代码:公共静态无效main(String artv[])抛出异常{