Socket简介:
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。
Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作”套接字“,用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。
Socket连接过程:
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
(1)服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
(2)客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
(3)连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
Java Socket编程:
对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是Socket。服务端和客户端之间通过Socket建立连接,之后它们就可以进行通信了。首先ServerSocket将在服务端监听某个端口,当发现客户端有Socket来试图连接它时,它会accept该Socket的连接请求,同时在服务端建立一个对应的Socket与之进行通信。这样就有两个Socket了,客户端和服务端各一个。
对于Socket之间的通信其实很简单,服务端往Socket的输出流里面写东西,客户端就可以通过Socket的输入流读取对应的内容。Socket与Socket之间是双向连通的,所以客户端也可以往对应的Socket输出流里面写东西,然后服务端对应的Socket的输入流就可以读出对应的内容。
两种常用的Socket类型:
- 流式Socket(STREAM):
是一种面向连接的Socket,针对于面向连接的TCP服务应用,安全,但是效率低 - 数据报式Socket(DATAGRAM):
是一种无连接的Socket,对应于无连接的UDP服务应用.不安全(丢失,顺序混乱,在接收端要分析重排及要求重发),但效率高.
Socket在网络层中的位置:
Socket聊天室的简介:
通过Socket(套接字)的通信原理,可以制作socket服务器和socket客户端,一个服务器又可以接入多个客户端,服务器和客户端通过输入流输出流实现数据读取写入,从而实现聊天的功能。
Socket通信过程:
- 服务器端:通过申请一个socket,绑定到一个IP地址和一个端口上,开启侦听,等待接收连接。
- 客户端:通过申请一个socket,连接服务器(通过指定IP地址和端口号),服务器端接到连接请求后,产生一个新的Socket(端口号大于1024)与客户端建立连接并进行通信,原端口继续监听。
聊天室功能简介:
通过学习socket原理,建立了简单的聊天室,实现的功能是通过一个客户端发送消息,其他客户端能同时收到这个消息。
在这个聊天室中涉及的知识有:socket原理,添加鼠标事件,键盘事件,界面布局,输入流输出流的操作等。
Socket服务器代码解释:
服务器监听代码:
1 | package socket服务器; |
ChatSocket服务器数据处理:
1 | package socket服务器; |
ServerManager服务器管理模块:
1 | package socket服务器; |
服务器启动模块:
1 | package socket服务器; |
socket客户端代码解释:
启动客户端代码:
1 | package Socket客户端; |
ChatManager聊天管理代码:
1 | package Socket客户端; |
客户端主窗体代码:
1 | package Socket客户端; |