Socket 基本知识
Posted Agonia
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Socket 基本知识相关的知识,希望对你有一定的参考价值。
1.Socket基础知识
2. Socket的传输模式
Socket有两种主要的操作方式:面向连接的和无连接的。(TCP/UDP)
由此可见,无连接的操作是快速高效的,但是数据安全性不佳;面向连接的操作效率较低,但数据的安全性较好。
3. Socket的构造方法
Java在包java.net中提供了两个类Socket和ServerSocket,分别用来表示双向连接的Socket客户端和服务器端。
Socket的构造方法如下:
(1)Socket(InetAddress address, int port);
(2)Socket(InetAddress address, int port, boolean stream);
(3)Socket(String host, int port);
(4)Socket(String host, int port, boolean stream);
(5)Socket(SocketImpl impl);
(6)Socket(String host, int port, InetAddress localAddr, int localPort);
(7)Socket(InetAddress address, int port, InetAddrss localAddr, int localPort);
ServerSocket的构造方法如下:
(1)ServerSocket(int port);
(2)ServerSocket(int port, int backlog);
(3)ServerSocket(int port, int backlog, InetAddress bindAddr);
Java给我们提供的网络功能有四大类:
· InetAddress:用于标识网络上的硬件资源
· URL:统一资源定位符,通过URL可以直接读取或者写入网络上的数据
· Socket和ServerSocket:使用TCP协议实现网络通信的Socket相关的类
· Datagram:使用UDP协议,将数据保存在数据报中,通过网络进行通信
TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,即在收发数据钱,都需要与对面建立可靠的链接,这也是面试经常会问到的TCP的三次握手以及TCP的四次挥手! 三次握手:建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立,在Socket编程中,这一过程由客户端执行connect来触发
· 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server, Client进入SYN_SENT状态,等待Server确认。
· 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位 SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
· 第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK 置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了
· 第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入 FIN_WAIT_1状态
· 第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
· 第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK 状态。
· 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。另外也可能是同事发起主动关闭的情况
UDP(User Datagram Protocol)用户数据报协议,非连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。相比TCP就是无需建立链接,结构简单,无法保证正确性,容易丢包
Socket通信实现步骤解析:
1:创建ServerSocket和Socket
2:打开连接到的Socket的输入/输出流
3:按照协议对Socket进行读/写操作
4:关闭输入输出流,以及Socket
服务端实现步骤:(TCP)
1:创建ServerSocket对象,绑定监听的端口
2:调用accept()方法监听客户端的请求
3:连接建立后,通过输入流读取客户端发送的请求信息
4:通过输出流向客户端发送响应信息
5:关闭相关资源
客户端实现步骤:(TCP)
2:链接建立后,通过输出流向服务器发送请求信息
3:通过输出流获取服务器响应的信息
4:关闭相关资源
服务端实现步骤:(UDP)
1:创建DatagramSocket,指定端口号
2:创建DatagramPacket
3:接收客户端发送的数据信息
4:读取数据
客户端实现步骤:(UDP)
1:定义发送信息
2:创建DatagramPacket,包含将要发送的信息
3:创建DatagramSocket
4:发送数据
端口
1. 用于区分不同的应用程序
2. 端口号的范围为0-65535,其中0-1023未系统的保留端口,我们的程序尽可能别使用这些端口!
4. 常用协议使用的端口:HTTP:80,FTP:21,TELNET:23
Socket控制台小型聊天系统(源码):http://www.zuidaima.com/share/3867762931321856.htm
java简单Socket通讯(源码):
http://www.zuidaima.com/share/3601851916471296.htm
以上是关于Socket 基本知识的主要内容,如果未能解决你的问题,请参考以下文章