java - 再次重新使用 java 套接字客户端

标签 java sockets

我的问题很简单。我只想再次使用客户端对象套接字。

通常,每当客户端尝试连接服务器时,人们都会创建一个新的套接字:

 Socket test = new Socket (host, port);
 OutputStream out = test.getOutputStream ();
 InputStream in = test.getInputStream ();
 out.writeObject (object)
 out.flush ();
 in.readObject();

在第一个 writeObject 之后,我确实想再次通过重用 out.writeObject(nextObject) 向服务器发送更多信息,但是服务器不再可用。为了让它工作,我必须完成上述所有步骤。为什么?


这是我用来测试我的意思的代码。 “Second Request doesn't ...”之后的代码没有到达服务器。但是,如果我删除这些评论上方的评论,它将通过。为什么我不能在不使用 new Socket() 的情况下重复使用相同的客户端套接字对象。

Class Hello -> Data passed between the server and the client
Class TestClient -> Client
Class TestServer -> Server


package tests;

import java.io.Serializable;


public class Hello implements Serializable {

    String hola = "hello my friend";

    public String getHello () {

        return hola;

    }

    public void setHello (String str) {

        hola = str;

    }

}


package tests;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class TestClient {

    public static void main(String[] args) {


        try {

            ObjectOutputStream clientOutput;
            ObjectInputStream serverInput;
            Hello goingout = new Hello ();

            Socket client = new Socket ("localhost", 5555);
            clientOutput  = new ObjectOutputStream (client.getOutputStream());
            serverInput   = new ObjectInputStream (client.getInputStream());

            clientOutput.writeObject(goingout);
            clientOutput.flush();
            Hello comingin = (Hello) serverInput.readObject();
            System.out.println ("first time received: " + comingin.getHello());


            /*
             * Socket client = new Socket ("localhost", 5555);
               clientOutput  = new ObjectOutputStream (client.getOutputStream());
               serverInput   = new ObjectInputStream (client.getInputStream());
             */

            /*
             * Second request doesn't got through the server
             */
            comingin.setHello("again");
            clientOutput.writeObject(goingout);
            clientOutput.flush();
            comingin = (Hello) serverInput.readObject();
            System.out.println ("second time received: " + comingin.getHello());



        } catch (ClassNotFoundException ex) {
            System.out.println (ex.getMessage());
        } catch (UnknownHostException ex) {
            System.out.println (ex.getMessage());
        } catch (IOException ex) {
            System.out.println (ex.getMessage());
        }


    }

}

public class TestServer {

    public static void main(String[] args) {



        try {

              ServerSocket server = new ServerSocket(5555, 100);
              ObjectInputStream clientInput;
              ObjectOutputStream serverOutput;

              for (;;) {
                  System.out.println ("Listening for connections");
                  Socket fromClient = server.accept();
                  serverOutput = new ObjectOutputStream (fromClient.getOutputStream());
                  clientInput = new ObjectInputStream (fromClient.getInputStream());
                  Hello received = (Hello) clientInput.readObject();
                  serverOutput.writeObject(received);
                  serverOutput.flush();
              }


        } catch (ClassNotFoundException ex) {
            Logger.getLogger(TestServer.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(TestServer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}

最佳答案

您需要使用线程服务器。

一个服务器可以服务多个客户端。每个服务器套接字必须由它自己的线程处理。服务器监听一个已知的套接字,每个客户端使用一个单独的套接字进行连接(因此多个客户端可以在同一台主机上运行)。

首先,JavaDocs 是理解如何或为什么你应该使用一个库的最糟糕的地方之一,它们实际上只告诉你什么这个库做了什么.

只有当您使用 single threaded server 时,您关于不可能的帖子才是正确的.

Oracle 在 Java server sockets 上有一个页面这解释了单个服务器的多个客户端(重用)。

他们还有一个 advanced sockets page更详细。

关于java - 再次重新使用 java 套接字客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8901637/

相关文章:

c - 自己写的web服务器无法被别人电脑访问

javascript - 如何检测 net.Socket 连接是否终止 - node.js

linux - Accept 是否可能为同一台机器上的不同 tcp 连接返回相同的套接字值

C Linux 套接字 : check for existing connections from client side

java - 无法在 SOAPHandler 中记录完整的 SOAP 消息

Java - 类实例化和访问的基础知识

Java SwingWorker 现在更新模型

java jna - 通过引用获取字节数组 java.lang.IndexOutOfBoundsException

java - 对象数组测试但没有得到任何输出

Android 的 PHP 套接字