多线程Java通过套接字TCP处理大数据接收



我有一个服务器Socker,每秒钟,客户端都会向服务器发送数据。数据是一个包含大约5000行的字符串,我想把数据分成5个部分,由5个线程同时处理。

private void listening() {
while (true) {
try {
clientSocket = serverSocket.accept();
System.out.println(clientSocket.getInetAddress());
BufferedReader os = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
new Thread(() -> {
try {
while (true) {
String data = os.readLine();
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
} catch (Exception e) {
e.printStackTrace();
}
}
}

下面是示例代码,我应该如何将数据拆分为5个部分?

示例数据:NVL01_120210624045425172.67.216.1465027227.1.50.528870212.133.114.732017NVL01_120210624045425193.253.536313216.243.182394445227.236.233.18882528NVL01_120210624045425111.176240.1642254,53.3.85.55382972.195.203.2208903NVL01_120210624045425223.224.123.1731596237.81.112.22566925.193.178.65719NVL01_120210624045425178.89.46.197489140.87.132.1747721572.63.1363045NVL01_12021062404542525201.145.2263004234.138.243.226831107.122.49.809609NVL01_120210624045425,94.163.66.1086041,37.190.105.11928089.212.205.1377483NVL01_120210624045425,90.119.3.948881,96.137.66.2672811.99.109.1759525NVL01_120210624045425106.11.39.2331280196.62.122.91164960.112.241.2536697NVL01_120210624045425179.187.138.1813870,62.38.25.158427274.152.247.345220NVL01_120210624045425204.11.249.304749234.133.240.87808105.192.120.299638NVL01_120210624045425,2.99.210.826924206.153.6.1657520,81.157.119.2487638NVL01_12021062404542584.205.46.704275188.189.1434304172.70.59.81226NVL01_120210624045425,38.133.52.221957787.183.254.2449694230.209.104.133164NVL01_120210624045425,13.43.85.592894,10.190.222.1132948,96.155.28.151991NVL01_120210624045425,16.79.32.727628,57.163.233.173113867.131.445079NVL01_12021062404542599.123.115.1845113197.56.206.979480222.162.213.2309564NVL01_120210624045425133.126.151.2874373.80.234.1835566235.50.191.69744NVL01_12021062404542571.86.226.12852212163.29.130.86954160.182.239.311622NVL01_120210624045425145.78.71.652124197.135.78.117340247.187.243.1246136NVL01_120210624045425145.208.217.49493,8.138.165.8897511.13.156.1466828NVL01_12021062404542546.23.207.136532815.1927.17382353.221.4.927230NVL01_120210624045425189.204.114.1076709,44.199.81.1165490178.66.79.371437NVL01_120210624045425114.48.39.253960227.38.239.2231566224.207.76.2031899NVL01_120210624045425,42.55.138.384812,51.93.10.2783695.189.159.2409574NVL01_120210624045425141.24.136.19422248.144.61.2202427138.88.193.2402284NVL01_120210624045425146.176.78685219.8.41.131.881094227.242.134.1065715NVL01_120210624045425134.47.77.1687825 90.1.25.819125175.143.184.945291NVL01_120210624045425131180.238.244740820.87.233.210592148.178.232.142782NVL01_120210624045425127..144.113.1361375197.9.246.617113181.163.124.514290NVL01_120210624045425131.204.107.1007185192.181.253.82237207.147.69.1814239NVL01_120210624045425123.28.17.195432,89.11.193.31928234.193.75.1808747NVL01_120210624045425,96.24.44.20391673.65.43.1104013174.193.2.2418762NVL01_120210624045425164.248.38.53122245.59.114.855106231212.210.948837NVL01_120210624045425144.86.166.148583123.127.122.398625、6.132.12.1581653NVL01_120210624045425195.6.162.2543597,24.218.41.173135724.55.15.35921NVL01_120210624045425,75.13.49.2199779,9.202.212.168230911.142.118.221955NVL01_120210624045425.132.44.1229659,12.116.75.11917258,88.91.180.732457NVL01_120210624045425223.31.193.2255257194.245.334567197.134.216.136327NVL01_120210624045425.30.222.1884178106.83.17.524045142.99.100.1746164NVL01_120210624045425209.115.15.2489416124.213.26.22128145.6.9.2102801NVL01_120210624045425189.174.30.1647052,24.191.53.1848172,20.57.226.308362NVL01_120210624045425235.148.200.1745072162.253.12.1697542205.85.11.196553NVL01_120210624045425164.121.163.2419549,60.225.45.427108255.147.26.907637NVL01_120210624045425145.3.148.1427128,76.29.166.836432152.25.4.2421605NVL01_120210624045425194.17.050.2196973229.63.113.1685698164.5.6.1016650NVL01_120210624045425,39.184.47.229367,17.180.188.2245841,70.42.225.2416074NVL01_120210624045425,36.62.110.272587105.252.86.14577262,57.63.203.2474518NVL01_120210624045425.173.252.2174651177.84.2234614,62.203.148.1027514NVL01_120210624045425146.128.170.11241176.187.243.1474396224.224.170.324872NVL01_120210624045425,27.209.1517444614,0.125.68.119242739.208.125.100940NVL01_120210624045425,88.90.208.193772235.102.2553604214.45.25.1897213NVL01_12021062404542596.33.115.2315202128.192.0.704048160.221.24.373806NVL01_12021062404542584.26.118.1092940109.36.178.603276170.183.57.806159NVL01_120210624045425.67.85.903034,73.62.181.13429197.92.65.1656845NVL01_120210624045425160.17.7222.985610134.70.105.214,65,24.69.80.755193NVL01_120210624045425142.49.198.597820176.83.196.1802107,40.68.245.299761NVL01_12021062404542559.199.111.242734222.236.118.317964210.83.178.1844373NVL01_120210624045425115.106.166.2295409 77.171.38.15026114.217.213.1489342NVL01_120210624045425,18.54.5.1579803,48.47.15.1084348224.211.21.2086431NVL01_120210624045425135.21.210.963068203.5.250.839397221.89.166.1283374NVL01_120210624045425191.223.45.1339746227.252.45.2272955105.23104.844350NVL01_120210624045425113.39.211.171268863.230.236.1392083213.155.51.1851973NVL01_120210624045425,92.242.126.24743430.44.168.1463950177.251.17.2147967NVL01_120210624045425194.134.48.2328858、14.13.21.1829196236.92.11.139344NVL01_120210624045425130.3.48.1969380112.89.242.216645157.199.7.2001790NVL01_120210624045425229.360.488815116.98.169.138505134.232.82.65727NVL01_120210624045425,67.133.95.1717594214.33.143.109564971.73.166.2173153NVL01_120210624045425.153.10.775447139.209.199.1282845,71.108.112.2314144NVL01_120210624045425108.253.199.773088203.38.1028689138.78.85.1947954NVL01_120210624045425,48.242.189.77,49,56.20.207.1229542179.159.117.2409634NVL01_12021062404542547.46.208.1959766145.154.85.142952189.187.53.1867724NVL01_12021062404542595.124.222.1979549227.219.232.2554794161.166.17.2424141


使用data.split(),然后像这样为每个数据创建一个线程怎么样?
//this will split the data in 5 where the text is marked by /'/
String[] splitdata = data.split("/'/", 5);
for(int i=0;i<5;i++)
startThread(splitdata[5]);

呼叫

public void startThread(String data){
//starts the thread with the split data
}

这里有一个例子:

String data="...NVL01_...5719 /'/NVL01_...3045... etc."
String[] splitdata = data.split("/'/", 5);
System.out.println(splitdata[0]) //...NVL01_...5719
System.out.println(splitdata[1]) //...NVL01_...3045
etc.

在发送数据之前,您只需要在希望拆分字符串的位置放置某种符号。

通过这个例子,您可以完成这项工作。

public static String[] splitFive(String data) {
int factor = 1;
String [] parts = new String[5];
if(data.length() >= 5){
//
factor = data.length() / 5;
parts[0] = data.substring(0, factor);
parts[1] = data.substring(factor, factor * 2);
parts[2] = data.substring(factor*2, factor * 3);
parts[3] = data.substring(factor*3, factor * 4);
parts[4] = data.substring(factor*4);
} else {
for(int i = 0; i  <  data.length(); i++){
parts[i] = String.valueOf(data.charAt(i));
}
}
return parts;
}
String [] result = splitFive("1234");
String [] result2 = splitFive("12345678901234567890--");

将返回:

field String[] result = String[5] { "1", "2", "3", "4", null }
field String[] result2 = String[5] { "1234", "5678", "9012", "3456", "7890--" }

编辑的使用行的示例方法:

public static List[] splitFive(String data) {
List [] parts = new List [5];
String [] allLines = data.split("n");
int factor = 1;
List<String> allLinesList = Arrays.asList(allLines);
if(allLines.length >= 5){
factor = allLines.length / 5;
parts[0] = allLinesList.subList(0, factor);
parts[1] = allLinesList.subList(factor, factor * 2);
parts[2] = allLinesList.subList(factor*2, factor * 3);
parts[3] = allLinesList.subList(factor*3, factor * 4);
parts[4] = allLinesList.subList(factor*4, allLinesList.size());
} else {
for(int i = 0; i  < allLines.length ; i++){
parts[i] =  Collections.singletonList(allLinesList.get(i));
}
}
return parts;
}

StringBuilder sb = new StringBuilder();
for(int i = 0; i <10; i++){
sb.append("Line-"+i+"n");
}
List [] result = splitFive("1234n4567n464646464654654n");
List [] result2 = splitFive(sb.toString());

这将返回

field List[] result = List[5] { [1234], [4567], [464646464654654], null, null }
field List[] result2 = List[5] { [Line-0, Line-1], [Line-2, Line-3], [Line-4, Line-5], [Line-6, Line-7], [Line-8, Line-9] }

最新更新