Tunneling two sockets in java

I am trying to connect two socket clients connected to the same remote server. The point is this:

  • Client_1] connect to the server
  • Client_2] connect to the server
  • Server] creates a tunnel between Client_1 and Client_2
  • Client_1] write "something"
  • Client_2] (which is waiting for some messages) receives "something" from Client_1

and vice versa.

What is my code:

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()); } } } } 

Can anybody help me? Thanks:)

Update:

clients.size ()> 0 should be> = 2, since you would like to have at least two sockets, not only one - boxed__l 6

Sorry, you're right ... thanks!

Update:

Do you plan to have only 2 clients? Because one thing you can do is when one client sends information to the server, you can transfer this information to another client. If you plan to have multiple clients, I would suggest assigning each client a UID. - Josh M 10 minutes ago

Yes, I would like to make a Point to Point connection between two clients , going to my server, for example a proxy server ...

The server must accept more than two connections and make two threads on the server for writing and reading, which redirect messages from one client to the other two, the processor will be saturated.

(Ps. Sorry for my English XD)

+4
source share
1 answer

I would do it like this (simplified version):

 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(); } } } 
+4
source

Source: https://habr.com/ru/post/1497427/


All Articles