【问题标题】:send objects from server to client in java sockets在 Java 套接字中将对象从服务器发送到客户端
【发布时间】:2019-06-03 07:32:28
【问题描述】:

我想通过 Java 套接字将对象从服务器发送到客户端。我可以将它们从客户端发送到服务器,但是我正在努力将它们从服务器发送到客户端。我是 Java 新手,所以我还在学习基础知识。我知道我需要做的事情相对较小,但是我现在正在努力解决它。有人可以添加我缺少的代码吗?

【问题讨论】:

  • 您需要发布您迄今为止所尝试的内容,以便我们以有意义的方式为您提供帮助。

标签: java sockets object objectoutputstream


【解决方案1】:

在另一个线程中打开另一个连接,让客户端为服务器,服务器为客户端。因此,在一个线程中发送 A -> B,在另一个线程中打开另一个套接字并开始发送 b B -> A。

低级套接字的问题在于,如果一侧正在写入,另一侧应该正在侦听。这意味着您必须实现命令查询协议,这是一项繁重的任务。因此,根据我的建议,您将使用两个端口,但您知道您将拥有 2 个数据流管道。

A --8888--> B
A <--8889-- B

如果你刚开始使用套接字会更容易。

【讨论】:

    【解决方案2】:

    您可以使用 ObjectOutputStream 通过套接字发送对象并使用 ObjectInputStream 接收:

    private ObjectOutputStream oos; 
    private ObjectInputStream ois;
    
    public SocketHandler(Socket cs) {
        this.oos = new ObjectOutputStream(cs.getOutputStream());
        this.ois = new ObjectInputStream(cs.getInputStream());
    }
    
    public void sendObject(Object o) {
        this.oos.writeObject(o);
        this.oos.flush();
    }
    
    public Object receiveObject() {
        return this.ois.readObject();
    }
    

    这是假设您要发送和接收一个对象。您还可以使用 PrintWriterBufferedReader 发送和接收 String 消息并在解析后:

    private PrintWriter pw;
    private BufferedReader br;
    
    public SocketHandler(Socket cs) {
        this.pw = new PrintWriter(cs.getOutputStream());
        this.br = new BufferedReader(new InputStreamReader(cs.getInputStream()));
    }
    
    public void sendMsg(String msg) {
        this.pw.println(msg);
        this.pw.flush();
    }
    
    public String receiveMsg() {
        return this.br.readLine();
    }
    

    【讨论】:

      【解决方案3】:

      下面我有一个服务器端代码的例子,我之前在一个应用程序中使用过,然后我会解释一下这里发生了什么:

      首先您需要创建您的 ServerSocket 以接受客户端请求(如您所知):

      ServerSocket serverSocket = new ServerSocket(1002);
              while(true) {
      

      然后你需要进入一个while循环,以便在Server程序还活着的时候接收请求

      Socket clientSocket = serverSocket.accept();
      System.out.println("Connection made to: " + clientSocket);
      BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
      PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
      String messageString = "";
      String line;
      System.out.println("Enter while loop to retrieve client message...");
      while((line = br.readLine()) != null) {
              String clientRequestLine = line;
              if(clientRequestLine.contains("check return user credentials")) {
              String userNamePassWord = clientRequestLine.replace("check return user credentials", "");
              userNamePassWord = userNamePassWord.trim();
              String[] userNamePassWordSplitter = userNamePassWord.split(" ");
              String userName = userNamePassWordSplitter[0];
              String passWord = userNamePassWordSplitter[1];
              System.out.println("Username: " + userName + "\nPassword: " + passWord);
                  boolean isValidUserNamePassWord = ReturnPatientCredentials.checkUserNamePassWord(userName, passWord);
              if(isValidUserNamePassWord) {
                      System.out.println("valid");
                      out.println("valid");
                          }
              else {
                      System.out.println("invalid");
                      out.println("invalid");
                          }
                      }
      

      您需要启动一个 BufferedReader 以存储来自客户端套接字的 InputStream(数据)。您还需要创建一个 PrintWriter 以便您可以将数据发送到 OutputStream,并且您需要将您的 clientSocket 作为 OutputStream 的参数传递。接下来,您将创建变量以从客户端获取消息和日期“行”并进入 while 循环。然后,您可以将该行存储在一个变量中并读取数据或您需要做的任何事情。我们使用我们的 PrintWriter (out) 通过 println() 方法将数据发送回,然后我们可以在需要时跳出循环。

      【讨论】:

        猜你喜欢
        • 2012-12-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-16
        • 1970-01-01
        相关资源
        最近更新 更多