This blog presents a way to establish socket connection between two processes written in Java (server) and Python (client). This solution was originally written by Martin Cazares and currently used in my Multi-disciplinary Design Project in school.
Java socket server
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Thread serverSocketThread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Starting socket server...");
try {
serverSocket = new ServerSocket(8888);
} catch (IOException e) {
e.printStackTrace();
}
try {
while (true) {
socket = serverSocket.accept();
System.out.println("Socket connected...");
PrintWriter out = new PrintWriter(socket.getOutputStream());
InputStream is = socket.getInputStream();
break_loop = false;
while (!Thread.currentThread().isInterrupted() && !break_loop) {
int availableBytes = is.available();
while (availableBytes < 1 && !break_loop) {
try{Thread.sleep(100);}catch(InterruptedException ie){ie.printStackTrace();}
availableBytes = is.available();
}
if (availableBytes == 0) break;
byte[] buffer = new byte[availableBytes];
int is_result = is.read(buffer, 0, availableBytes);
if (is_result < 0) break;
String read = new String(buffer);
for (String line : read.split("\n")) {
System.out.println("line:" + line);
process(line);
}
}
System.out.println("Socket disconnected.");
is.close();
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
if (serverSocket != null) {
try {
serverSocket.close();
} catch (IOException e) {e.printStackTrace();}
}
}
});
serverSocketThread.start();
Python client
import socket
import threading
import thread
class Client(threading.Thread):
def __init__(self, host, port):
super(Robot, self).__init__()
self.daemon = True
self.host = host
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.port = port
def run(self):
try:
self.sock.connect((self.host, self.port))
except socket.error:
print "Socket connection refused."
thread.exit()
print "Socket connected."
while 1:
#Now receive data
buf = self.sock.recv(4096)
if not buf:
break
try:
for line in buf.strip().split('\n'):
obj = json.loads(line)
self.handler(obj)
except ValueError:
print buf
def send(self, message):
try:
#Set the whole string
self.sock.sendall(message)
print "Sent: " + message
except socket.error:
#Send failed
print 'Socket connection error.'
thread.exit()
def close(self):
self.sock.close()