一、使用 nc
1.安装nc
在linux服务器上使用yum安装,执行命令
yum -y install nc
启动nc,监听8888端口
nc -lp 8888
2.连接nc
@Test
public void fromSocketTest() throws Exception {
// flink 流执行环境
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
//设置模式 STREAMING
env.setRuntimeMode(RuntimeExecutionMode.STREAMING);
//数据源,socket,连接上nc服务端 ip、port,数据的分隔符是","
env.socketTextStream("172.16.10.159", 8888, ",")
//扁平化
.flatMap(new FlatMapFunction<String, String>() {
@Override
public void flatMap(String value, Collector<String> out) throws Exception {
Arrays.stream(value.split(",")).forEach(v -> out.collect(v));
}
})
//映射
.map(new MapFunction<String, Tuple2<String, Integer>>() {
@Override
public Tuple2<String, Integer> map(String value) throws Exception {
return Tuple2.of(value, 1);
}
})
//分组
.keyBy((KeySelector<Tuple2<String, Integer>, String>) value -> value.f0)
//求和
.sum(1)
//打印结果
.print();
//开始执行
env.execute("flink streaming from socket");
}
在nc命令行上输入参数:
[root@flink-node01 ~]# nc -lp 8888
java,python,c++,
java,python,c#,
java,python,redis,
客户端输出结果:
3> (c++,1)
2> (java,1)
3> (python,1)
1> (
java,1)
3> (python,2)
5> (c#,1)
1> (redis,1)
3> (python,3)
1> (
java,2)
三、使用 SocketServer
1.启动SocketServer
启动 SocketServer ,等待客户端连接上后,每 2s 发送一次消息
public class SocketServer {
public static void main(String[] args) throws IOException {
try {
ServerSocket ss = new ServerSocket(8888);
System.out.println("启动 server ....");
Socket s = ss.accept();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String response = "java,python,c++,";
//每 2s 发送一次消息
while(true){
Thread.sleep(2000);
bw.write(response);
bw.flush();
}
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
2.连接SocketServer
@Test
public void fromSocketServerTest() throws Exception {
// flink 流执行环境
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
//设置模式 STREAMING
env.setRuntimeMode(RuntimeExecutionMode.STREAMING);
//数据源,连接 socketServet
env.socketTextStream("127.0.0.1", 8888, ",")
//扁平化
.flatMap(new FlatMapFunction<String, String>() {
@Override
public void flatMap(String value, Collector<String> out) throws Exception {
Arrays.stream(value.split(",")).forEach(v -> out.collect(v));
}
})
//映射
.map(new MapFunction<String, Tuple2<String, Integer>>() {
@Override
public Tuple2<String, Integer> map(String value) throws Exception {
return Tuple2.of(value, 1);
}
})
//分组
.keyBy((KeySelector<Tuple2<String, Integer>, String>) value -> value.f0)
//求和
.sum(1)
//打印结果
.print();
//开始执行
env.execute("flink streaming from socket");
}
输出结果:
2> (java,1)
3> (python,1)
3> (c++,1)
2> (java,2)
3> (c++,2)
3> (python,2)
2> (java,3)
3> (c++,3)
3> (python,3)