【问题标题】:How to make a program that receives data from the server and sends data to the server if data is received with Java如果用Java接收数据,如何制作从服务器接收数据并将数据发送到服务器的程序
【发布时间】:2021-01-14 13:53:46
【问题描述】:

我有一个程序从服务器接收数据并打印数据。如何将程序变成一个程序,在接收到数据后发送回其他数据?我尝试将 datainputstream 和 dataoutputstream 添加到这两个程序,但它没有工作,它没有给出错误并且它停止工作,所以我把它删除了。服务器:

package testSocket;
import java.net.*;
import java.io.*;
import javax.swing.JFrame;

public class server {

    public static void main(String[] args) throws IOException {
        
        JFrame jframe = new JFrame("TEST SERVER");
        jframe.setVisible(true);
        jframe.setSize(800, 600);       
        
        try (ServerSocket sws = new ServerSocket(13481)) {
            Socket socket = sws.accept();
            
            OutputStream outs = socket.getOutputStream();
            DataOutputStream douts = new DataOutputStream(outs);
            
            douts.writeUTF("Hello.");
            douts.close();
            outs.close();
        
        } catch (Exception e) {
            System.out.println("Exception : " + e);
        }
        
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
    }
    
}

客户:

package testSocket;
import java.io.*;
import java.net.*;

public class client {

    public static void main(String[] args) throws IOException {
        
        Socket tcs = new Socket("localhost", 13481);
        
        InputStream iss = tcs.getInputStream();
        DataInputStream dis = new DataInputStream(iss);
        
        String str = new String(dis.readUTF());         
        System.out.println("test " + str);
        
        dis.close();
        iss.close();
        tcs.close();
        
    }
    
}

我正在尝试制作一个程序,当我从服务器发送数据时,它会将指定的数据发回给我 您能对此提出一些建议吗?

【问题讨论】:

  • 您需要尝试使用您的套接字资源。还要更具体。究竟是什么没有按预期工作?
  • 我试过:是添加 datainputstream 和 dataoutputstream 到两者,这样他们就可以接收和发送数据,但程序没有工作。也许我把它们添加到程序中时出错了,我不知道.我想做的是类似于上面的代码,在上面的代码中,客户端从服务器接收“hello”字符串变量。我只是想添加代码客户端发送“hi”值到服务器收到“hello”值后。 @RandomCoder_01
  • 您必须对流进行线程化以实现全双工(发送和接收),因为流会阻塞并等待数据输入/输出。
  • 那么我需要在从客户端发送到服务器后将其发送回客户端吗?这样做时,我想通过服务器界面查看信息。

标签: java sockets serversocket data-transfer


【解决方案1】:

您需要为 Rx、Tx 和 Connection 操作创建单独的线程。原因是套接字阻塞了当前线程并坐下来等待数据。所以你把 Rx、Tx、Connection 和消息处理都放到它们自己的线程中(或者更好的是,一个服务)

Thread rxThread = new Thread(()->{
    // read from DataInputStream and cache it (usually into a thread-safe collection)
});

Thread txThread = new Thread(()->{
    // send messages  (usually cached in some thread-safe collection)
});

Thread acceptConnections = new Thread(()->{
   Socket clientConnect = serverSocket.accept();
   // handle your connections here
});

这很复杂。将很多基本的 Java 知识整合到一个应用程序中。

研究 java 并发性、全双工套接字通信以及可能找到的任何回显服务器实现。

java: Single socket on read write operation. Full duplex - 在 github 上有一个实现的链接

好笑,oracle做了一个EchoServer.java教程...https://docs.oracle.com/javase/tutorial/networking/sockets/examples/EchoServer.java

我开始为您制作模型,但意识到它的参与程度并停止了。

【讨论】:

  • 非常感谢您的回答。
猜你喜欢
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多