本文共 1371 字,大约阅读时间需要 4 分钟。
主机名 | IP | 操作系统 |
host1 | 192.168.110.1 | Windows |
host2 | 192.168.110.13 | Linux |
首先在host2上使用nc命令打开端口7777,之后在host1上运行代码
import org.apache.spark._import org.apache.spark.streaming._object Test { def main(args: Array[String]): Unit = { val conf = new SparkConf().setMaster("local[*]").setAppName("no_name") val ssc = new StreamingContext(conf, Seconds(5)) val lines = ssc.socketTextStream("192.168.110.13", 7777) // 将流的内容原封不动打印 if (lines != null) { lines.print() println("start!") } ssc.start() ssc.awaitTermination() }}
在host2上开启一个新的终端,使用nc命令连接至本地的7777端口,发现拒绝连接(使用-v参数)。各命令如下:
host2开启并监听7777端口的命令:
nc -l -p 7777
在代码启动后,在host2上尝试新建一个到localhost:7777的socket失败,如下图:
nc命令默认是一个端口对应于一个socket,即一个端口只能建立一条TCP连接。
将在host2上开启并监听7777端口的命令改为如下:
nc -lk -p 7777
-k参数意为可以支持多条连接
在解决了问题一的基础之上,先在host2上开启7777端口(以-k参数开启),再在host2上另一个终端使用nc命令创建一个到 localhost:7777的socket,最后在host1运行代码。在host2中的两个终端相互发送数据,发现host1的代码无任何输出,如下图:
host2两个终端交互数据:
host1上运行代码:(无任何流内容输出)
代码中的socketFileStream,之前我以为的是监听host2上的7777端口。如果这个ip上的这个端口收到了任何信息,则这些信息将会被输入到socketFileStream。现在看来,其实不是这样的。它只是单纯地创建了一个与host2:7777的socket,如果host2向这个socket发送消息,这个消息才会进入socketFileStream
先在host2上开启7777端口,再运行代码,再在host2上开启7777端口的终端中输入任意信息,则host1会输出相应信息
我发现在开启7777端口的终端中输入的数据,会把数据发送到第一个与其建立连接的socket中,当这个socket断开后,之后的数据会发送给接下来的一个socket(第二个连接的socket),相当于有一个队列存储着各个socket。
转载地址:http://haesi.baihongyu.com/