java - 如何保持套接字连接直到服务器处理它?

标签 java sockets serversocket

我正在编写Socket程序,这里客户端通过Stream发送一个字符串,服务器处理它并写回客户端。我的问题是,服务器处理 String 后,它写回 Stream,但在客户端中它无法读取 Stream,它在 while: java.net.SocketException 中将其显示为 Exception :套接字关闭这是我的代码,

客户端,

  public void run() {
    while (true) {
        try {
            // Open your connection to a server, at port 1231
            s1 = new Socket("localhost", 1231);

            OutputStream s1out = s1.getOutputStream();
            DataOutputStream dos = new DataOutputStream(s1out);
            InputStream in=s1.getInputStream();
            DataInputStream dis=new DataInputStream(in);

            String s = br.readLine();
         dos.writeUTF(s);
         dos.flush();
         dos.close();

            System.out.println(dis.readUTF());//it is the String from Server after processing
            dis.close();

        } catch (IOException ex) {
            //  Logger.getLogger(SimpleClient.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Exception in while: " + ex);
        }
    }

在服务器中

  public void run()
    {


        while(true){
            try {

                 System.out.println("Waiting for connect to client");
                 s1=serverSocket.accept();


                 s1In = s1.getInputStream();
                 dis = new DataInputStream(s1In);

                 out=s1.getOutputStream();
                 dos=new DataOutputStream(out);

                 String clientData=dis.readUTF();

                 //processing task String

              dos.writeUTF("Bus Registered Successfully");
              dos.flush();

            }
          }

在这里,我无法在客户端读取总线注册成功。如何解决这个问题?

最佳答案

你的程序中有很多地方不对劲。但首先让我回答你的问题......你在写入流后关闭套接字......所以服务器抛出异常,只需在 dos 之后删除 dos.close(); .flush();。它将运行良好。

现在回到编程实践......

1) 服务器应该在 while(true) 循环中接受连接,然后创建一个新线程。因此以下语句不应该是 run 方法的一部分。

             System.out.println("Waiting for connect to client");
             s1=serverSocket.accept();


             s1In = s1.getInputStream();
             dis = new DataInputStream(s1In);

             out=s1.getOutputStream();
             dos=new DataOutputStream(out);

2)客户端不需要run方法。因为每个新客户端都是一个新程序,有自己的变量套接字

关于java - 如何保持套接字连接直到服务器处理它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27918226/

相关文章:

c++ - QTcpSocket - 扩展 QRunnable 时指定了无效句柄

sockets - 在 Android NDK 中使用 Socket()

java - 当我从套接字接收到一些数据时,为什么会附加大量空格?

java - Spring Data JPA - 删除子实体而不是在更新时设置为空?

java - 启动 Stardog 服务器时出错

python - 拥有子进程允许 rpc-server 在子进程存活时重新启动

c - 使用 C 在服务器端读取从客户端发送的文本文件

java - 使用 ObjectIOStreams 的 Java ServerSocket 和套接字会丢包吗?

java - JNI目录结构c和java

java - int vs long 的迭代速度