Socket connection between Java and Python programs

September 21, 2014 - 4 minute read -

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