java中的隧道双套接字客户端
我正在尝试将两个连接到单个远程服务器的套接字客户端互连。 情况是:java中的隧道双套接字客户端,java,multithreading,sockets,tunneling,Java,Multithreading,Sockets,Tunneling,我正在尝试将两个连接到单个远程服务器的套接字客户端互连。 情况是: 客户端\u 1]连接到服务器 客户端\u 2]连接到服务器 服务器]在客户端\u 1和客户端\u 2之间创建隧道 客户_1]写“某物” 客户端_2](正在等待某些消息)接收客户端_1发送的“某物” 维切维萨 这是我的密码: package jtestsock; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOExc
- 客户端\u 1]连接到服务器
- 客户端\u 2]连接到服务器
- 服务器]在客户端\u 1和客户端\u 2之间创建隧道
- 客户_1]写“某物”
- 客户端_2](正在等待某些消息)接收客户端_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());
}
}
}
}
jtestsock包;
导入java.io.BufferedReader;
导入java.io.BufferedWriter;
导入java.io.IOException;
导入java.io.InputStreamReader;
导入java.io.OutputStreamWriter;
导入java.io.PrintWriter;
导入java.net.ServerSocket;
导入java.net.Socket;
导入java.util.List;
/**
*
*@author massimodeluisa
*/
公共类服务器扩展线程{
私人名单客户;
专用服务器套接字服务器;
专用int端口=5001;
专用缓冲读取器输入;
专用打印机输出;
公共服务器(){
试一试{
服务器=新的服务器套接字(端口);
}捕获(IOE异常){
System.out.println(“不可能的istanziare il服务器:+e.getMessage());
}
}
@凌驾
公开募捐{
System.out.println(“等待客户端消息…”);
//
//服务器在此处执行循环以接受服务器启动的所有连接
//客户端应用程序。
//
while(true){
试一试{
Socket=server.accept();
System.out.println(“已收到连接!”);
clients.add(socket);
/*读取响应*/
输入=新的BufferedReader(
新的InputStreamReader(
getInputStream());
输出=新的PrintWriter(
新缓冲写入程序(
新的OutputStreamWriter(
getOutputStream());
如果(clients.size()>0){
套接字优先=新套接字();
第二个套接字=新套接字();
first=clients.get(1);
第二个=客户端。获取(2);/| |第二个=套接字;
//??在两个客户机之间进行隧道输入和输出
}
}捕获(IOE异常){
System.out.println(“客户端连接错误:+e.getMessage());
}
}
}
}
有人能帮我吗?
谢谢:)
更新:
我想在两个客户机之间建立一个点对点连接,传递到我的服务器,就像代理服务器一样
服务器必须接受两个以上的连接,并在服务器上创建两个线程用于写入和读取将消息从一个客户机重定向到另一个客户机,CPU将饱和。
(对我的英文XD表示抱歉)我会这样做(简化版):
怎么了。你在哪里需要帮助?是否会出现错误或异常?您是否计划只使用两个客户端?因为您可以做的一件事是,当一个客户端向服务器发送信息时,您可以将该信息中继到另一个客户端。但是,如果您计划拥有多个客户端,我建议为每个客户端分配一个UID。
clients.size()>0
应该是=2
,因为您希望至少有两个套接字,而不仅仅是一个套接字,但我已经尝试过这种方法,并且CPU只在处理8个客户端时使用150%:(我需要该服务器能够支持20多个客户端。(实际上,我的MacBook Pro配备了2,66Ghz i7和8GB 1067MHz DDR3,但该应用程序将在配备xEon E5-2643的Dell上运行)你确定JVM的CPU使用率一直保持在150%吗?在初始化、类加载、JIT等过程中可能会比较滞后。但是从长远来看,<100个线程用于阻塞IO应该不是一个问题。如果你计划服务于数千个客户端,你可能需要查看非阻塞IO选项,比如or。或者可以作为一个很好的起点T
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();
}
}
}