需求
- 提供一个 Socket 服务
- 客户端输入一个 eci,返回该 eci 的经纬度
编码
eci.location.csv(部份)
ECI,LONGITUDE,LATITUDE
12345678,121.59314,31.2196
23456789,121.59314,31.2196
34567891,121.479166,31.294166
45678912,121.488,31.198
56789123,121.268094,31.330225
Server.java
package socketrpc;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;
public class Server {
private static HashMap<String, ArrayList<String>> eciMap = new HashMap<String, ArrayList<String>>();
private static void read() throws Exception {
File file = new File("D:\\temp\\eci.location.csv");
//File file = new File("D:\\temp\\a.csv");
BufferedReader reader = new BufferedReader(new FileReader(file));
String line;
while ((line = reader.readLine()) != null) {
HashMap<String,String> hashMap = new HashMap<String, String>();
String[] split = line.split(",");
ArrayList<String> arrayList = new ArrayList<String>();
arrayList.add(split[1]);
arrayList.add(split[2]);
eciMap.put(split[0], arrayList);
}
reader.close();
}
public static void exec() throws Exception {
read();
ServerSocket server = new ServerSocket(9999);
while(true) {
Socket socket = server.accept();
new Thread(()->{
System.out.println("接受一个客户端请求,并提供服务" + socket.getPort());
try {
Scanner scanner = new Scanner(socket.getInputStream());
PrintStream printer = new PrintStream(socket.getOutputStream());
scanner.useDelimiter("\n");
while(true) {
if (scanner.hasNext()) {
String line = scanner.next().trim();
if ("bye".equals(line)) {
System.out.println("客户端主动断开");
break;
}
ArrayList<String> arrayList = eciMap.get(line);
if (arrayList != null) {
printer.println("lon:"+arrayList.get(0)+",lat"+arrayList.get(1));
} else {
printer.println("Nothing was found!");
}
}
}
printer.close();
scanner.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}).start();
}
}
public static void main(String[] args) throws Exception {
Server.exec();
}
}
Client.java
package socketrpc;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("127.0.0.1", 9999);
Scanner cmdScanner = new Scanner(System.in);
cmdScanner.useDelimiter("\n");
Scanner netScanner = new Scanner(socket.getInputStream());
netScanner.useDelimiter("\n");
PrintStream printer = new PrintStream(socket.getOutputStream());
while (true) {
System.out.print("请输入一个eci:");
if (cmdScanner.hasNext()) {
String line = cmdScanner.next().trim();
printer.println(line);
if ("bye".equals(line)) {
System.out.println("系统退出");
break;
}
if (netScanner.hasNext()) {
System.out.println(netScanner.next().trim());
}
}
}
printer.close();
netScanner.close();
cmdScanner.close();
socket.close();
}
}
Client 运行结果:
请输入一个eci:3871253
Nothing was found!
请输入一个eci:123456789
lon:121.59314,lat31.2196
请输入一个eci:bye
系统退出
题外话
eci.location.csv 文件,实际约有 10 万行,大概占 3 MB 大小。
如果把这些内容放到 Map<String, Map<String,String>> 数据结构中,Server 端程序约占 1.18 GB 内存。
如果把这些内容放到 Map<String, List> 数据结构中,Server 端程序约占 110 MB 内存。