如果使用 Java 接收数据,如何制作一个从服务器接收数据并向服务器发送数据的程序

How to make a program that receives data from the server and sends data to the server if data is received with Java

我有一个从服务器接收数据并打印数据的程序。如何将程序变成接收数据后发回其他数据的程序?我尝试将 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();
        
    }
    
}

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

您需要为 Rx、Tx 和连接操作创建单独的线程。原因是套接字阻塞了当前线程并等待数据。所以你把 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

上有一个 link 的实现

有趣的是,oracle 制作了一个 EchoServer.java 教程...https://docs.oracle.com/javase/tutorial/networking/sockets/examples/EchoServer.java

我开始为您制作模型,但意识到它的复杂性并停止了。