Socket 基本知识

Posted Agonia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Socket 基本知识相关的知识,希望对你有一定的参考价值。

1.Socket基础知识

 

2. Socket的传输模式

Socket有两种主要的操作方式:面向连接的和无连接的。(TCP/UDP

  由此可见,无连接的操作是快速高效的,但是数据安全性不佳;面向连接的操作效率较低,但数据的安全性较好。


3. Socket的构造方法

Java在包java.net中提供了两个类SocketServerSocket,分别用来表示双向连接的Socket客户端和服务器端。

Socket的构造方法如下:

  (1Socket(InetAddress address, int port);

  (2Socket(InetAddress address, int port, boolean stream);

  (3Socket(String host, int port);

  (4Socket(String host, int port, boolean stream);

  (5Socket(SocketImpl impl);

  (6Socket(String host, int port, InetAddress localAddr, int localPort);

  (7Socket(InetAddress address, int port, InetAddrss localAddr, int localPort);

ServerSocket的构造方法如下:

  (1ServerSocket(int port);

  (2ServerSocket(int port, int backlog);

  (3ServerSocket(int port, int backlog, InetAddress bindAddr);

 

Java给我们提供的网络功能有四大类:

·        InetAddress用于标识网络上的硬件资源

·        URL统一资源定位符,通过URL可以直接读取或者写入网络上的数据

·        SocketServerSocket使用TCP协议实现网络通信的Socket相关的类

·        Datagram使用UDP协议,将数据保存在数据报中,通过网络进行通信

 

TCPTransmission Control Protocol,传输控制协议)是面向连接的协议,即在收发数据钱,都需要与对面建立可靠的链接,这也是面试经常会问到的TCP三次握手以及TCP四次挥手 三次握手建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立,Socket编程中,这一过程由客户端执行connect来触发

 

·        第一次握手Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server Client进入SYN_SENT状态,等待Server确认。

·        第二次握手Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位 SYNACK都置为1ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求Server进入SYN_RCVD状态。

·        第三次握手Client收到确认后,检查ack是否为J+1ACK是否为1,如果正确则将标志位ACK 置为1ack=K+1,并将该数据包发送给ServerServer检查ack是否为K+1ACK是否为1,如果正确则连接建立成功,ClientServer进入ESTABLISHED状态,完成三次握手,随后ClientServer之间可以开始传输数据了

 

·        第一次挥手Client发送一个FIN,用来关闭ClientServer的数据传送,Client进入 FIN_WAIT_1状态

·        第二次挥手Server收到FIN后,发送一个ACKClient,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。

·        第三次挥手Server发送一个FIN,用来关闭ServerClient的数据传送,Server进入LAST_ACK 状态。

·        第四次挥手Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACKServer,确认序号为收到序号+1Server进入CLOSED状态,完成四次挥手。另外也可能是同事发起主动关闭的情况

 

UDP(User Datagram Protocol)用户数据报协议,非连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。相比TCP就是无需建立链接,结构简单,无法保证正确性,容易丢包



 

Socket通信实现步骤解析

1:创建ServerSocketSocket

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:80FTP21TELNET23

 


Socket控制台小型聊天系统(源码):http://www.zuidaima.com/share/3867762931321856.htm


java简单Socket通讯(源码):

http://www.zuidaima.com/share/3601851916471296.htm

以上是关于Socket 基本知识的主要内容,如果未能解决你的问题,请参考以下文章

PHP socket编程需要了解的一些基本知识

socket基本编程

JAVA基础知识|Socket

socket基本概念

Socket的基本认识

Java千百问_02基本使用(011)_如何编写单线程Socket程序