Java 和 Python 之間的 Socket 通訊

Brewin 發表於 2020-09-15

code 服務碼,根據code呼叫相應服務

status 狀態碼,根據執行結果返回狀態碼

socket之間使用json字串通訊

Java socket客戶端

package com.brewin.hammer.system.util.socket;

import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

import com.alibaba.fastjson.JSON;
/**   
 * Java socket客戶端  
 * @author Brewin 
 * @date 2020年5月20日 上午11:27:04   
 *   
 */
public class SocketClient {
    // 服務端IP地址
    public static final String HOST = "127.0.0.1";
    // 服務端埠
    public static final int PORT = 50001;

    public static void main(String args[]) throws Exception {

        // 傳送給服務端的引數
        Map<String, String> paramMap = new HashMap<String, String>();
        //圖片轉換服務
        paramMap.put("code", "100");
        paramMap.put("url", "C:/Users/Brewin/Pictures/avatar/1.jpg");
        // map轉成json字串,需要引入fastjson依賴
        String param = JSON.toJSONString(paramMap);

        // 接收服務端返回的資訊
        String socketServerMsg = getSocketServerMsg(HOST, PORT, param);
        System.out.println("服務端資訊:" + socketServerMsg);
        // json字串轉成map,需要引入fastjson依賴
        Map resultMap = (Map) JSON.parse(socketServerMsg);
//        for (Object map : resultMap.entrySet()) {
//            System.out.println(((Map.Entry) map).getKey() + ":" + ((Map.Entry) map).getValue());
//        }

        String code=String.valueOf(resultMap.get("code"));
        System.out.println("服務碼  : "+code);
        int status=(int) resultMap.get("status");
        System.out.println("狀態碼  : "+status);
        switch (code) {
            //圖片轉換服務
            case "100":
                System.out.println("圖片轉換服務");
                switch (status) {
                //成功
                case 10:
                    System.out.println("執行成功");
                    break;
                //失敗
                case 20:
                    System.out.println("執行失敗");
                    break;
                //預設
                default:
                    System.out.println("預設執行");
            }
                break;
            //資料庫備份服務
            case "200":
                System.out.println("資料庫備份服務");
                switch (status) {
                //成功
                case 10:
                    System.out.println("執行成功");
                    break;
                //失敗
                case 20:
                    System.out.println("執行失敗");
                    break;
                //預設
                default:
                    System.out.println("預設執行");
            }
                break;
            default:
                System.out.println("無對應服務");

        }
    }

    public static String getSocketServerMsg(String host, int port, String message) throws Exception {
        // 與服務端建立連線
        Socket socket = new Socket(host, port);
        // 獲得輸出流
        OutputStream outputStream = socket.getOutputStream();
        PrintWriter pWriter = new PrintWriter(outputStream);
        pWriter.write(message);
        pWriter.flush();
        // 通過shutdownOutput高速伺服器已經傳送完資料,後續只能接受資料
        socket.shutdownOutput();
        // 獲得輸入流
        InputStream inputStream = socket.getInputStream();

        byte[] bytes = new byte[1024];
        int len;
        StringBuilder sb = new StringBuilder();
        while ((len = inputStream.read(bytes)) != -1) {
            // 注意指定編碼格式,傳送方和接收方一定要統一,建議使用UTF-8
            sb.append(new String(bytes, 0, len, "UTF-8"));
        }
        inputStream.close();
        outputStream.close();
        socket.close();

        return sb.toString();
    }

}

Python socket服務端

from socket import *
import json
import random
HOST = '127.0.0.1'
PORT = 50000
BUFSIZ = 1024
ADDR = (HOST,PORT)
tcpServerSock = socket(AF_INET,SOCK_STREAM)
tcpServerSock.bind(ADDR)
tcpServerSock.listen(5)
while True:
    print('等待連線')
    tcpClientSock, addr = tcpServerSock.accept()
    print('接收到來自 :', addr,' 的連線')
    while True:
        request_data = tcpClientSock.recv(BUFSIZ)
        if not request_data:
            break
        request_data_str = str(request_data, 'UTF-8')
        print("來自客戶端的資料:" +request_data_str)
        # 字串轉換成物件
        data = json.loads(request_data_str)

        response_data = {}
        response_data['code'] = data['code']
        response_data['status'] = 20
        # 圖片轉換服務
        if data['code']=='100':
            if random.randint(0, 900)<300:
                response_data['status'] = 10
                response_data['url'] = 'C:/Users/Brewin/Pictures/avatar/3.jpg'
            elif random.randint(0, 900)<600:
                response_data['status'] = 20
            else:
                response_data['status'] = 0

        # 資料儲存服務
        elif data['code']=='200':
            if random.randint(0, 900) < 300:
                response_data['status'] = 10
                response_data['url'] = 'C:/Users/Brewin/Pictures/avatar/3.jpg'
            elif random.randint(0, 900) < 600:
                response_data['status'] = 20
            else:
                response_data['status'] = 0
        # 無對應服務
        else:
            response_data['code'] = '000'
            response_data['status'] = 10


        # 物件轉換成字串
        response_data_str=json.dumps(response_data)
    tcpClientSock.send(bytes(response_data_str, encoding = "utf8"))
    tcpClientSock.close()
tcpServerSock.close()

Java socket服務端

package com.brewin.hammer.system.util.socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**   
 * Java socket服務端   
 * @author Brewin 
 * @date 2020年5月20日 上午11:08:32   
 *   
 */
public class SocketServer {
    // 服務端埠
    public static final int PORT = 50001;
    public static void main(String[] args) {
        try {
            //初始化服務端socket
            ServerSocket server = new ServerSocket(PORT);
            System.out.println("Java socket服務端開啟!");
            //阻塞等待, 直到一個客戶端 socket過來
            Socket socket = server.accept(); 
            System.out.println("有客戶端socket連線!");
            //輸入,接收來自客戶端socket的資料
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    socket.getInputStream())); 
            //輸出,傳輸資料至 客戶端socket
            PrintWriter out = new PrintWriter(socket.getOutputStream()); 
            // 列印 客戶 socket 發過來的字元,按行(\n,\r,或\r\n)
            System.out.println(in.readLine()); 
            // to 客戶端,輸出
            out.println("{\"code\": \"100\", \"status\": 10, \"url\": \"C:/Users/Brewin/Pictures/avatar/3.jpg\"}"); 
            out.flush(); 
            socket.close();
            server.close();
            System.out.println("服務結束!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

Python socket客戶端

import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost',5000))
print('Python客戶端開啟!')
# str 型別 -> bytes 型別,傳送,\n 千萬不要少了,因為前面的 server 是按行讀取的
sock.send(bytes('Python客戶端:你好\n',encoding='utf-8'))
# bytes 型別 -> str 型別,接受
print(str(sock.recv(1024),encoding = 'utf-8'))
sock.close()
print('Python客戶端結束!')
# json字串轉換成物件
json2object = json.loads(json)

# 物件轉換成json字串
object2json=json.dumps(object)
// json字串轉成map,需要引入fastjson依賴
Map json2map = (Map) JSON.parse(json);

// map轉成json字串,需要引入fastjson依賴
String map2json = JSON.toJSONString(map);
本作品採用《CC 協議》,轉載必須註明作者和本文連結