利用Socket进行Java与Python的通信

Python端

import socket
import sys
import threading
import json
import numpy as np

def main():

    # 创建服务器套接字
    serversocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

    # 获取本地主机名称
    host = socket.gethostname()

    # 设置端口号
    port = 12345

    # 将套接字与本地主机和端口绑定
    serversocket.bind((host,port))

    # 设置监听最大连接数
    serversocket.listen(5)

    # 获取本地服务器的连接信息
    myaddr = serversocket.getsockname()

    print("服务器地址:%s"%str(myaddr))

    # 循环等待接受客户端信息
    while True:

        # 获取一个客户端连接
        clientsocket,addr = serversocket.accept()
        print("连接地址:%s" % str(addr))

        try:
            #为每一个请求开启一个处理线程
            t = ServerThreading(clientsocket)
            t.start()
            pass
        except Exception as identifier:
            print(identifier)
            pass
        pass
    serversocket.close()
    pass

class ServerThreading(threading.Thread):

    def __init__(self,clientsocket,recvsize=1024*1024,encoding="utf-8"):
        threading.Thread.__init__(self)
        self._socket = clientsocket
        self._recvsize = recvsize
        self._encoding = encoding
        pass

    def run(self):
        print("开启线程.....")
        try:
            #接受数据
            msg = ''
            while True:
                # 从Java端读取recvsize个字节
                rec = self._socket.recv(self._recvsize)

                # 解码成字符串
                msg += rec.decode(self._encoding)
                print("解码后数据:")
                print(msg)

                # 文本接受是否完毕,因为python socket不能自己判断接收数据是否完毕
                # 所以需要自定义协议标志数据接受完毕
                if msg.strip().endswith('over'):
                    msg=msg[:-4]
                    break

            # 将字符串解析成JSON格式数据
            re = json.loads(msg)
            print("解析成JSON数据:")
            print(re)
            
            # 修改JSON数据并转换成字符串
            re["content"] = "world"
            sendmsg = json.dumps(re)
            print("修改JSON数据并发送:")
            print(sendmsg)

            # 发送字符串数据给Java端
            self._socket.send(("%s"%sendmsg).encode(self._encoding))
            pass
        except Exception as identifier:
            self._socket.send("500".encode(self._encoding))
            print(identifier)
            pass
        finally:
            self._socket.close() 
        print("任务结束.....")
        
        pass

    def __del__(self):
        
        pass
if __name__ == "__main__":
    main()

Java端

package cn.edu.xxx.computer.XXX.socket;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.io.*;
import java.net.Socket;
import java.util.logging.Logger;

public class PythonSocket {

    public PythonSocket() {
    }

    public Object remoteCall(String content) {
        String HOST = "192.168.219.1";
        Integer PORT = 12345;
        Logger log = Logger.getLogger(this.getClass().getName());
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("content", content);
        String str = jsonObject.toJSONString();
        System.out.println("发送内容(JSONObject):" + jsonObject);
        System.out.println("发送内容(String):" + str);
        // 访问服务进程的套接字
        Socket socket = null;
        // List<Question> questions = new ArrayList<>();
        log.info("调用远程接口:host=>" + HOST + ",port=>" + PORT);
        try {
            // 初始化套接字,设置访问服务的主机和进程端口号,HOST是访问python进程的主机名称,可以是IP地址或者域名,PORT是python进程绑定的端口号
            socket = new Socket(HOST, PORT);
            // 获取输出流对象
            OutputStream os = socket.getOutputStream();
            PrintStream out = new PrintStream(os);
            // 发送内容
            out.print(str);
            // 告诉服务进程,内容发送完毕,可以开始处理
            out.print("over");
            // 获取服务进程的输入流
            InputStream is = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is, "utf-8"));
            String tmp = null;
            StringBuilder sb = new StringBuilder();
            // 读取内容
            while ((tmp = br.readLine()) != null)
                sb.append(tmp).append('\n');
            // 解析结果
            System.out.println("接收数据:" + sb.toString());

            // 解析成数组
            // JSONArray res = JSON.parseArray(sb.toString());

            // 解析成对象
            JSONObject res = JSON.parseObject(sb.toString());
            return res;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (socket != null) {
                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            log.info("远程接口调用结束");
        }
        return null;
    }
}

Java端发送数据

package cn.edu.xxx.computer.XXX.socket;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class PythonSocketTests {

    @Test
    public void testremoteCall() throws Exception {
        PythonSocket pythonSocket = new PythonSocket();
        pythonSocket.remoteCall("hello");
    }

}

Java端控制台输出

发送内容(JSONObject):{"content":"hello"}
发送内容(String):{"content":"hello"}
2021-07-30 20:27:40.781  INFO 7340 --- [           main] c.e.u.c.G.socket.PythonSocket            : 调用远程接口:host=>192.168.219.1,port=>12345
接收数据:{"content": "world"}

2021-07-30 20:27:40.836  INFO 7340 --- [           main] c.e.u.c.G.socket.PythonSocket            : 远程接口调用结束

Python端控制台输出

服务器地址:('192.168.219.1', 12345)
连接地址:('192.168.219.1', 64874)
开启线程.....
解码后数据:
{"content":"hello"}over
解析成JSON数据:
{'content': 'hello'}
修改JSON数据并发送:
{"content": "world"}
任务结束.....

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Socket编程是一种在计算机网络中实现进程通信的方法。在Java中,可以使用java.net包中的Socket类来创建一个客户端。编写Socket客户端程序的过程包括以下几个步骤: 1. 导入必要的类:导入java.net包中的Socket和IOException类。 2. 创建Socket对象:使用Socket构造函数创建一个Socket对象。构造函数需要传入服务器的IP地址和端口号。 3. 获取输入输出流:通过Socket对象的getInputStream()方法获取输入流和getOutputStream()方法获取输出流。 4. 发送和接收数据:使用输出流向服务器发送数据,并使用输入流接收服务器返回的数据。 5. 关闭Socket连接使用Socket对象的close()方法关闭连接。 下面是一个简单的Java Socket客户端程序示例: ```java import java.io.*; import java.net.*; public class SocketClient { public static void main(String[] args) { try { // 创建Socket对象,指定服务器的IP地址和端口号 Socket socket = new Socket("服务器IP地址", 端口号); // 获取输出流 OutputStream outputStream = socket.getOutputStream(); // 向服务器发送数据 String message = "需要发送的数据"; outputStream.write(message.getBytes()); // 获取输入流 InputStream inputStream = socket.getInputStream(); // 接收服务器返回的数据 byte[] buffer = new byte[1024]; int length = inputStream.read(buffer); String response = new String(buffer, 0, length); System.out.println("服务器返回的数据:" + response); // 关闭连接 socket.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 在Python中,可以使用socket模块来创建一个服务端。编写Socket服务端程序的过程包括以下几个步骤: 1. 导入必要的模块:导入socket模块。 2. 创建Socket对象:使用socket.socket()函数创建一个socket对象。 3. 绑定地址和端口:使用socket对象的bind()方法绑定服务器的IP地址和端口号。 4. 开始监听:使用socket对象的listen()方法开始监听,等待客户端连接。 5. 建立连接使用socket对象的accept()方法接收客户端的连接请求,并返回客户端的Socket对象和地址。 6. 接收和发送数据:通过客户端的Socket对象进行数据的接收和发送。 7. 关闭连接使用socket对象的close()方法关闭连接。 下面是一个简单的Python Socket服务端程序示例: ```python import socket # 创建socket对象 s = socket.socket() # 绑定地址和端口 host = '0.0.0.0' port = 20000 s.bind((host, port)) # 开始监听 s.listen(6) # 建立连接 conn, addr = s.accept() # 接收数据 data = conn.recv(1024) print(data.decode()) # 发送数据 data_last = data.decode() conn.send(f"{data_last},也算我一个,青鸟是我的!".encode()) # 关闭连接 s.close() conn.close() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值