10-flink-java实现nc(netcat)程序
背景
flink开发时候,经常用socket作为source;使用linux/mac环境开发,可以在终端中开启 nc -l 9000(开启netcat程序,作为服务端,发送数据);但是如果使用window环境,就比较麻烦,因为window环境没有nc程序;因此,我们可以用 java编写一个nc程序,以便发送数据,供flink程序使用。
什么是nc
nc是netcat的缩写,有着网络界的瑞士军刀美誉。因为它短小精悍、功能实用,被设计为一个简单、可靠的网络工具。
nc作用
- 数据传输
- 文件传输
- 机器之间网络测速
Java实现nc
public class NcServer {
// 定义端口号
private static final int PORT = 9000;
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(PORT);
Socket socket = server.accept();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("[" + simpleDateFormat.format(new Date()) + "]" + socket.getInetAddress() + "已建立连接!");
//监控连接是否断开线程
new Thread(new CheckClientThread(socket)).start();
//输出流
OutputStream outputStream = socket.getOutputStream();
//控制台输入
Scanner in = new Scanner(System.in);
while (true) {
String str = in.nextLine() + "\n";
outputStream.write(str.getBytes());
outputStream.flush();
}
}
// 监控连接程序是否断开 线程类
static class CheckClientThread implements Runnable {
private Socket socketClient;
public CheckClientThread(Socket socketClient) {
this.socketClient = socketClient;
}
@Override
public void run() {
while (true) {
try {
socketClient.sendUrgentData(0xFF);
} catch (IOException e) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("[" + simpleDateFormat.format(new Date()) + "]" + socketClient.getInetAddress() + "连接已关闭!");
// 断开后退出程序
System.exit(0);
}
}
}
}
}
flink socket流程序
public class SocketStreamTest {
public static void main(String[] args) throws Exception {
//获取执行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
//界面上指定参数(本地测试可以忽略,设置了默认值)
final ParameterTool params = ParameterTool.fromArgs(args);
String hostName = params.get("hostname", "localhost");
int port = params.getInt("port", 9000);
//数据来源(获取sourceStream)
DataStream<String> sourceStream = env.socketTextStream(hostName, port, "\n");
//数据去向(打印到控制台)
sourceStream.print();
//执行
env.execute("SocketStreamTest");
}
}
测试
-
开启nc程序(上文中Java实现nc程序)
控制台无内容
开启flink socket流程序(上问中flink socket流程序)
-
查看nc程序控制台,是否建立连接
[2019-11-23 21:38:30]/127.0.0.1已建立连接!
-
nc程序显示连接后,控制台中模拟输入需要发送到数据
[2019-11-23 21:38:30]/127.0.0.1已建立连接!
hello flink -
查看flink socket程序控制它,是否接收到
12> hello flink