Skip to content

Commit 28d95e2

Browse files
committed
add better tcp connection establishment example and support
1 parent 90a284c commit 28d95e2

5 files changed

Lines changed: 110 additions & 0 deletions

File tree

src/main/java/net/sharksystem/asap/ASAPEncounterManagerImpl.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import net.sharksystem.asap.utils.PeerIDHelper;
77
import net.sharksystem.utils.streams.StreamPair;
88
import net.sharksystem.utils.Log;
9+
import net.sharksystem.utils.tcp.StreamPairCreatedListener;
910

1011
import java.io.*;
1112
import java.util.*;
@@ -294,7 +295,13 @@ public synchronized void asapConnectionTerminated(Exception terminatingException
294295
}
295296
}
296297

298+
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
299+
// utils //
300+
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
301+
297302
public String toString() {
298303
return this.asapConnectionHandler.toString();
299304
}
305+
306+
300307
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package net.sharksystem.asap.apps;
2+
3+
import net.sharksystem.asap.ASAPEncounterManager;
4+
import net.sharksystem.asap.EncounterConnectionType;
5+
import net.sharksystem.utils.Log;
6+
import net.sharksystem.utils.streams.StreamPair;
7+
import net.sharksystem.utils.tcp.SocketFactory;
8+
import net.sharksystem.utils.tcp.StreamPairCreatedListener;
9+
10+
import java.io.IOException;
11+
12+
public class TCPServerSocketAcceptor implements StreamPairCreatedListener {
13+
private final ASAPEncounterManager encounterManager;
14+
15+
public TCPServerSocketAcceptor(int portNumber, ASAPEncounterManager encounterManager) throws IOException {
16+
this.encounterManager = encounterManager;
17+
SocketFactory socketFactory = new SocketFactory(portNumber, this);
18+
19+
Log.writeLog(this, "start socket factory");
20+
new Thread(socketFactory).start();
21+
}
22+
23+
@Override
24+
public void streamPairCreated(StreamPair streamPair) {
25+
Log.writeLog(this, "new stream pair created");
26+
try {
27+
this.encounterManager.handleEncounter(streamPair, EncounterConnectionType.INTERNET);
28+
} catch (IOException e) {
29+
Log.writeLogErr(this, "exception when asking for new connection handling: "
30+
+ e.getLocalizedMessage());
31+
}
32+
}
33+
}

src/main/java/net/sharksystem/utils/tcp/SocketFactory.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
//import net.sharksystem.asap.ASAPEncounterHelper;
44

5+
import net.sharksystem.utils.streams.StreamPairImpl;
6+
57
import java.io.IOException;
68
import java.io.InputStream;
79
import java.io.OutputStream;
@@ -11,11 +13,17 @@
1113

1214
public class SocketFactory implements Runnable {
1315
private final ServerSocket srv;
16+
private StreamPairCreatedListener listener = null;
1417
InputStream is;
1518
OutputStream os;
1619
private Thread waitForConnectionThread = null;
1720
private String remoteAddress;
1821

22+
public SocketFactory(int portNumber, StreamPairCreatedListener listener) throws IOException {
23+
this(new ServerSocket(portNumber));
24+
this.listener = listener;
25+
}
26+
1927
public SocketFactory(ServerSocket srv) {
2028
this.srv = srv;
2129
}
@@ -35,6 +43,10 @@ public void run() {
3543
//this.waitForConnectionThread.interrupt();
3644
this.waitForConnectionThread.notify();
3745
}
46+
if(this.listener != null) {
47+
this.listener.streamPairCreated(
48+
StreamPairImpl.getStreamPairWithEndpointAddress(this.is, this.os, this.remoteAddress));
49+
}
3850
} catch (IOException e) {
3951
e.printStackTrace();
4052
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package net.sharksystem.utils.tcp;
2+
3+
import net.sharksystem.utils.streams.StreamPair;
4+
5+
public interface StreamPairCreatedListener {
6+
void streamPairCreated(StreamPair streamPair);
7+
}

src/test/java/howto/ConnectPeers.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package howto;
22

33
import net.sharksystem.asap.*;
4+
import net.sharksystem.asap.apps.TCPServerSocketAcceptor;
5+
import net.sharksystem.utils.streams.StreamPairImpl;
46
import net.sharksystem.utils.tcp.SocketFactory;
57
import net.sharksystem.utils.testsupport.TestConstants;
68
import net.sharksystem.utils.testsupport.TestHelper;
@@ -89,4 +91,53 @@ public void connectAliceAndBob() throws IOException, ASAPException, InterruptedE
8991
// give it some time to run an encounter.
9092
Thread.sleep(5);
9193
}
94+
95+
@Test
96+
public void connectAliceAndBobWithEncounterManager_Preferred() throws IOException, ASAPException, InterruptedException {
97+
// supported formats
98+
Collection<CharSequence> formats = new ArrayList<>();
99+
formats.add(EXAMPLE_APP_FORMAT);
100+
101+
// test folder for this test run
102+
String rootFolder = TestHelper.getFullTempFolderName(TEST_FOLDER, true);
103+
104+
////////////////////////// set up peers
105+
// set up alice
106+
String aliceFolder = rootFolder + "/" + TestConstants.ALICE_ID;
107+
ASAPConnectionHandler alice = new ASAPPeerFS(TestConstants.ALICE_ID, aliceFolder, formats);
108+
// set up bob
109+
String bobFolder = rootFolder + "/" + TestConstants.BOB_ID;
110+
ASAPConnectionHandler bob = new ASAPPeerFS(TestConstants.BOB_ID, bobFolder, formats);
111+
112+
////////////////////////// encounter manager
113+
ASAPEncounterManager aliceEncounterManager = new ASAPEncounterManagerImpl(alice);
114+
ASAPEncounterManager bobEncounterManager = new ASAPEncounterManagerImpl(bob);
115+
116+
////////////////////////// set up server socket and handle connection requests
117+
int portNumberAlice = TestHelper.getPortNumber();
118+
TCPServerSocketAcceptor aliceTcpServerSocketAcceptor =
119+
new TCPServerSocketAcceptor(portNumberAlice, aliceEncounterManager);
120+
121+
int portNumberBob = TestHelper.getPortNumber();
122+
TCPServerSocketAcceptor bobTcpServerSocketAcceptor =
123+
new TCPServerSocketAcceptor(portNumberBob, bobEncounterManager);
124+
125+
// give it a moment to settle
126+
Thread.sleep(5);
127+
128+
// now, both side wit for connection establishment. Example
129+
130+
// open connection to Bob
131+
Socket socket = new Socket("localhost", portNumberBob);
132+
133+
// let Alice handle it
134+
aliceEncounterManager.handleEncounter(
135+
StreamPairImpl.getStreamPair(socket.getInputStream(), socket.getOutputStream()),
136+
EncounterConnectionType.INTERNET);
137+
138+
// give it a moment to run ASAP session
139+
Thread.sleep(5);
140+
141+
// There is just one peer in a real app.
142+
}
92143
}

0 commit comments

Comments
 (0)