【问题标题】:Tunneling two socket client in java在java中隧道两个套接字客户端
【发布时间】:2023-03-23 00:22:01
【问题描述】:

我正在尝试将连接到单个远程服务器的两个套接字客户端互连。 案例是:

  • Client_1] 连接到服务器
  • Client_2] 连接到服务器
  • 服务器] 在 Client_1 和 Client_2 之间创建隧道
  • Client_1] 写“某事”
  • Client_2](正在等待一些消息)收到 Client_1 的“某物”

反之亦然。

这是我的代码:

package jtestsock;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.List;

/**
 *
 * @author massimodeluisa
*/
public class Server extends Thread{

private List<Socket> clients;
private ServerSocket server;
private int port = 5001;
private BufferedReader input;
private PrintWriter output;

public Server() {
    try {
        server = new ServerSocket(port);
        
    } catch (IOException e) {
        System.out.println("Impossibile istanziare il server: "+e.getMessage());
    }
}

@Override
public void run() {
    System.out.println("Waiting for client message...");

    //
    // The server do a loop here to accept all connection initiated by the
    // client application.
    //
    while (true) {
        try {
            Socket socket = server.accept();
            System.out.println("Connection Received!");
            
            clients.add(socket);
            

            /* read response */
            input = new BufferedReader(
                    new InputStreamReader(
                    socket.getInputStream()));

            output = new PrintWriter(
                    new BufferedWriter(
                    new OutputStreamWriter(
                    socket.getOutputStream())));
            
            if(clients.size()>0){
                Socket first    = new Socket();
                Socket second   = new Socket();
                
                first = clients.get(1);
                second= clients.get(2);     // || second = socket;
                
                // ??? Tunneling input and output between two clients
            }
            
        } catch (IOException e) {
            System.out.println("Client connection error: "+e.getMessage());
        }
    }
}
}

谁能帮帮我? 谢谢:)

更新:

我想在两个客户端之间建立一个点对点连接,像代理服务器一样传递到我的服务器...

服务器必须接受两个以上的连接,并在服务器上创建两个线程用于写入和读取将消息从一个客户端重定向到另一个客户端,CPU将饱和。

(Ps.对不起我的英语XD)

【问题讨论】:

  • 怎么了。你在哪里需要帮助?是否出现错误或异常?
  • 您打算只拥有 2 个客户吗?因为您可以做的一件事是,当一个客户端向服务器发送信息时,您可以将该信息转发给另一个客户端。如果您计划拥有多个客户端,我建议为每个客户端分配一个 UID。
  • clients.size()&gt;0 应该是 &gt;=2 因为您希望至少有两个套接字而不仅仅是一个

标签: java multithreading sockets tunneling


【解决方案1】:

我会这样做(简化版):

class Server extends Thread
    ...
        public void run() {
            while (true) {
                try {
                    Socket s1 = server.accept();
                    Socket s2 = server.accept();
                    new Client(s1, s2).start();  // reads from s1 and redirects to s2
                    new Client(s2, s1).start();  // reads from s2 and redirects to s1
                } catch (IOException e) {
                    System.out.println("Client connection error: " + e.getMessage());
                }
            }
        }

class Client extends Thread {
    Socket s1;
    Socket s2;

    Client(Socket s1, Socket s2) {
        this.s1 = s1;
        this.s2 = s2;
    }

    public void run() {
        try {
            InputStream is = s1.getInputStream(); 
            OutputStream os = s2.getOutputStream();
            for (int i; (i = is.read()) != -1; i++) {
                os.write(i);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } 
    }
}

【讨论】:

  • 谢谢,但我已经尝试过这种方法,并且 CPU 只能使用 8 个客户端的 150%... :( 而且我需要服务器可以支持 20 多个客户端。(实际上是我的 MacBook具有 2,66Ghz i7 和 8GB 1067MHz DDR3 的 Pro 是服务器,但此应用程序将在具有 xEon E5-2643 的戴尔上运行)
  • 你确定JVM的CPU使用率一直是150%吗?在初始化、类加载、JIT 等过程中可能会出现延迟。但对于阻塞 IO 而言,ServerSocketChannel 或 nettyThis NIO echo servernetty's echo server 可以是一个很好的起点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多