Java与Python进行Web与机器学习分析跨平台数据传输的讲解

news/2024/5/17 20:22:33 标签: TCP, java, python, socket

代码已上传至Github:https://github.com/2NaCl/java_py_TCP

首先说明一下,此项目基于TCP原理,也就是使用Socket实现的。实验背景是这样的,我现在在做JavaWeb前后端开发,但是这个接口的数据需要一定的数据分析,于是我用Python实现了数据分析的部分,但是分析的结果数据,我需要传回JavaWeb后端,然后后端传给前端(这里没有展示),于是就有了如下的代码。

在这里,Java相当于一个客户端,Python相当于一个服务端,因为我们Python需要随时开放着,等待数据的进入和回传。至此,我们可以用Java编写一个TCP客户端,用Python编写我们的Server端。

并且附带Python机器学习所需要的相关数据与模型,上传到了Github。

python"># -*- coding: UTF-8 -*-
from socket import *
from time import ctime
import jieba
from jieba import posseg
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split, cross_validate


material_userdict = 'material_userdict.txt'
device_userdict = 'device_userdict.txt'
worker_userdict = 'worker_userdict.txt'
question_file = 'questions.txt'

#model_file = 'forest'
model_file = 'forest_test'

question_row = 'questions'
question_cut_row = 'questions_cut'

POS = ['mmm', 'mmd', 'mmw', 'm']

HOST = ''
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)

jieba.load_userdict(material_userdict)
jieba.load_userdict(device_userdict)
jieba.load_userdict(worker_userdict)


def cut(string):
    return ' '.join(jieba.cut(string))


questions = pd.read_csv(question_file, sep='\t', encoding='utf-8')


questions[question_cut_row] = questions[question_row].apply(cut)



import pickle

with open(model_file, 'rb') as training_model:
    model = pickle.load(training_model)


def abstract_str(test_string):
    seg = jieba.posseg.cut(test_string)
    l = []
    for i in seg:
        l.append((str(i.word), str(i.flag)))
        tcpCliSock.send(((str(i.word) + ',' + str(i.flag) + " ").encode()))
    print(l)
    # print(l[0][0])
    fin_str = ''
    variable = ''

    for j in range(len(l)):
        if l[j][1] == POS[0]:
            fin_str += POS[0]
            variable = l[j][0]
        elif l[j][1] == POS[1]:
            fin_str += POS[1]
            variable = l[j][0]
        elif l[j][1] == POS[2]:
            fin_str += POS[2]
        else:
            fin_str += l[j][0]
    return fin_str, variable


def vectorized_str(test_string):
    test_cut = cut(test_string)
    test_feature = vectorizer.transform([test_cut]).toarray()
    return test_feature


vectorizer = CountVectorizer()
data_features = vectorizer.fit_transform(questions[question_cut_row]).toarray()

tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)

while True:
    print('把客户端启动一下啊')
    tcpCliSock, addr = tcpSerSock.accept()
    print('ip:', addr)

    while True:
        data = tcpCliSock.recv(BUFSIZ).decode()
        if not data:
            break
        print('get client data:%s\n[%s]' % (data, ctime()))
        test_string = data
        a_s, variable = abstract_str(test_string)
        v_s = vectorized_str(a_s)
        result = model.predict(v_s)
        result = str(result) + '\n' + str(variable)
        send_str=('server send data:%s\n[%s]' % (result, ctime()))
        tcpCliSock.send(result.encode())
        if data == 'session_close':
            break
    tcpCliSock.close
tcpSerSock.close
java">package com.techfantasy.qs.socket;

import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class SocketClient {

    public static void main(String[] args) throws IOException {
        try {
            Socket socket = new Socket("localhost",21567);
            while (true) {
                //获取输出流,向服务器端发送信息
                OutputStream os = socket.getOutputStream();//字节输出流
                PrintWriter pw = new PrintWriter(os);//将输出流包装为打印流
                System.out.print("> ");
                Scanner instr = new Scanner(System.in);

                pw.write(instr.nextLine());//前端要填的参数
                pw.flush();
                System.out.println("\n");
                //socket.shutdownOutput();//关闭输出流

                InputStream is = socket.getInputStream();
                BufferedReader in = new BufferedReader(new InputStreamReader(is));
                String[] s = in.readLine().split(" ");

                List<List<String>> arrlist2 = new ArrayList<>();
                for (String str : s) {
                    List<String> arrayList = new ArrayList<>();
                    arrayList.add(str);
                    arrlist2.add(arrayList);
                }
                System.out.println(arrlist2);
//                is.close();
//                in.close();
//                socket.close();
            }
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


http://www.niftyadmin.cn/n/784250.html

相关文章

总结QT信号与槽的手动绑定

我们用一个四则运算的demo来做一个小小的学习总结 首先也是来到mainwindow.ui界面添加line Edit&#xff0c;共四个&#xff0c;分别为&#xff1a; l1填第一个数字&#xff0c;l2填符号位&#xff0c;l3填第三个数字&#xff0c;l4填结果。 最后再来一个pushbutton。然后我…

typedef关键字

typedef关键字 typedef typedef为C语言的关键字&#xff0c;跟if &#xff0c;while。。等等一样 这里的数据类型包括内部数据类型&#xff08;int&#xff0c;char等&#xff09;和自定义的数据类型&#xff08;struct等&#xff09;。 和 struct 来匹配为了代码编写简洁 和…

剑指Offer(线程)——Thread中start方法和run方法的区别

首先我们先来写一个程序&#xff0c;看看运行的结果 先使用run方法&#xff1a; 输出为&#xff1a; 可以看出&#xff0c;不管是主方法还是其他的方法&#xff0c;在run方法下执行的线程都是用主线程去执行。 而start方法&#xff1a; 我们可以看出&#xff0c;线程被切换了…

Linux常用初级指令介绍和使用

Linux常用初级指令介绍和使用 VI编辑器的使用gcc 编译工具ls&#xff08;list的意思&#xff08;名单&#xff09;&#xff0c;列出当前文件夹下有那下文件&#xff09;运行 VI编辑器的使用&#xff1b; 模式&#xff1b; 1.命令行模式&#xff1b; 进入Ubuntu 打开&#xf…

定向输出,算数运算,正则表达式

定向输出&#xff0c;算数运算&#xff0c;正则表达式 shell的特性之十&#xff1a;输入输出定向和管道 I/O,设备&#xff0c;寄存器 I/O portLinux:一切皆文件 文件描述符&#xff1a;file descriptor FD 追踪被打文件的各种属性 INPUT&#xff1a;标准输入,(stdin) FD …

HDU - 2665 Kth number 主席树/可持久化权值线段树

题意 给一个数列,一些询问,问$[l,r]$中第$K$大的元素是哪一个 题解: 写法很多,主席树是最常用的一种之一 除此之外有:划分树,莫队分块,平衡树等 主席树的定义其实挺模糊, 一般认为就是可持久化线段树/函数式线段树的这种实现方式 被用来求区间第$K$大的时候,是可持久化的权值线…

剑指Offer(线程)——Thread和Runnable是什么关系

从本质上来说&#xff0c;Thread是jdk的一个类&#xff0c;而Runnable是一个interface。而Thread内部又实现了Runnable接口。 我们同样也是写一个Demo。 首先把线程执行的内容写出来&#xff08;单纯的10次循环&#xff0c;打印执行此任务的线程名&#xff09;&#xff1a; 然…

Linux常用初级指令介绍和使用2

Linux常用初级指令介绍和使用2 1.ls &#xff1b;列出当前文件夹下有那下文件 2.ls -a;显示所有文件&#xff0c;包括隐藏的文件 3.pwd ;显示当前路径命令 4.mkdir&#xff1b;创建文件夹&#xff0c;举例&#xff1b;mkdir xiaowang&#xff08;文件夹名字 xiaowang&#xff0…