Socket是CPU进程通信链路的基础组件,概念最初来自于贝尔实验室的Unix系统项目组。Java的创始者们都是Unix的拥趸,所以Java对Socket的支持是纯天然的。Java的web应用服务器在互联网应用产品中一家独大,持续引领了20多年,都只是唯一没有之一。每个服务器通信交互的核心组件实现都是围绕着Socket来展开的----Weblogic、Websphere、JBoss、Tomcat、Jetty、HDFS/Hbase/zookeeper等等,架构上都存在着差异,可都殊路同归。
一、Socket java API基础
Java中Socket是C/S结构的,C/S的概念就是Client端和Server端,Java Socket的服务端API是ServerSocket,似乎Socket就理所当然是Client的概念了(然而,打住,确切地说应该叫endpoint。概念相关的理解很熬人,纠结概念让人面红脖子粗、寝食难安,那就这么着了,爱谁谁谁!!!)。
a.coding准备
JDK、Eclipse、Windows、Linux。
为什么是两个系统平台(Windows、Linux)?为更切合实际网络应用,所以使用两个异构的操作系统。条件允许可以使用两个物理机,但我的条件只允许我安装VMware虚拟机进行测试。但无论如何两台服务器必须物理上网络是连通的,iptables对端口的限制有必要配置放开一些端口的访问。好了,基础设施具备,您现在应该如我这般编写代码:
[b][color=brown]Socket_code1:[/color][/b]
[img]http://dl2.iteye.com/upload/attachment/0124/7479/5c81254e-79fd-373e-942a-d7c748617769.jpg[/img]
[b][color=brown]Socket_code_2:[/color][/b]
[img]http://dl2.iteye.com/upload/attachment/0124/7481/29fcd7fc-a79b-326e-91bf-88aaa351a551.jpg[/img]
code_1是Server端简单得不能再简单的代码了,代码10行创建ServerSocket实例,并在构造方法上传入Server端的端口号,打印System的user.dir是我想看JVM在运行java命令时JVM的工作目录,打印hashcode是想验证是不是每次连接都创建新的ServerSocket,将code_1代码上传到linux服务器,我运行的命令格式是:java -cp .:/opt com.yogreen.socket.SocketServerBoot,在开发环境使用Eclipse运行code_2代码,运行结果如下图:
[img]http://dl2.iteye.com/upload/attachment/0124/7483/54e4982d-21d5-36ec-bb3f-b6dff2084a29.jpg[/img]
可看见每次连接ServerSocket的hashcode都是同一个。而Socket的hashcode却在不断变化。
好的,入门级的Java Socket脑补也就这样了。接下来的系列是对象流的传输,远程方法调用、心跳广播,缓存服务发布和简单并行计算开发。
b.总结
Java Socket 使用一对ServerSocket/Socket API实现两个或两个以上的JVM进程间的通信,由于Java的跨平台的特性,无论进程是在同一物理机或网络中的不同节点的进程,甚至异构系统的平台,开发者都不必关心,只要创建了ServerSocket(需要指定服务端口),Socket可通过ip/端口参数创建与Server的连接,从而达到两个JVM的通信,继而实现两个物理机的通信,从1到2,2到3,3到无穷,网络计算服务由此而来。
一、Socket java API基础
Java中Socket是C/S结构的,C/S的概念就是Client端和Server端,Java Socket的服务端API是ServerSocket,似乎Socket就理所当然是Client的概念了(然而,打住,确切地说应该叫endpoint。概念相关的理解很熬人,纠结概念让人面红脖子粗、寝食难安,那就这么着了,爱谁谁谁!!!)。
a.coding准备
JDK、Eclipse、Windows、Linux。
为什么是两个系统平台(Windows、Linux)?为更切合实际网络应用,所以使用两个异构的操作系统。条件允许可以使用两个物理机,但我的条件只允许我安装VMware虚拟机进行测试。但无论如何两台服务器必须物理上网络是连通的,iptables对端口的限制有必要配置放开一些端口的访问。好了,基础设施具备,您现在应该如我这般编写代码:
[b][color=brown]Socket_code1:[/color][/b]
[img]http://dl2.iteye.com/upload/attachment/0124/7479/5c81254e-79fd-373e-942a-d7c748617769.jpg[/img]
[b][color=brown]Socket_code_2:[/color][/b]
[img]http://dl2.iteye.com/upload/attachment/0124/7481/29fcd7fc-a79b-326e-91bf-88aaa351a551.jpg[/img]
code_1是Server端简单得不能再简单的代码了,代码10行创建ServerSocket实例,并在构造方法上传入Server端的端口号,打印System的user.dir是我想看JVM在运行java命令时JVM的工作目录,打印hashcode是想验证是不是每次连接都创建新的ServerSocket,将code_1代码上传到linux服务器,我运行的命令格式是:java -cp .:/opt com.yogreen.socket.SocketServerBoot,在开发环境使用Eclipse运行code_2代码,运行结果如下图:
[img]http://dl2.iteye.com/upload/attachment/0124/7483/54e4982d-21d5-36ec-bb3f-b6dff2084a29.jpg[/img]
可看见每次连接ServerSocket的hashcode都是同一个。而Socket的hashcode却在不断变化。
好的,入门级的Java Socket脑补也就这样了。接下来的系列是对象流的传输,远程方法调用、心跳广播,缓存服务发布和简单并行计算开发。
b.总结
Java Socket 使用一对ServerSocket/Socket API实现两个或两个以上的JVM进程间的通信,由于Java的跨平台的特性,无论进程是在同一物理机或网络中的不同节点的进程,甚至异构系统的平台,开发者都不必关心,只要创建了ServerSocket(需要指定服务端口),Socket可通过ip/端口参数创建与Server的连接,从而达到两个JVM的通信,继而实现两个物理机的通信,从1到2,2到3,3到无穷,网络计算服务由此而来。