客户端和服务器端的数据传输

网络应用使用客户端和服务器端模式的方式进行通信。客户端和服务器端的数据传输分成三个步骤:连接、传送、接收。服务器端先启动服务进行等待,客户端应用主动启动通信,申请连接,而服务器应用被动地等待通信,连接成功之后,客户端可以对服务器端进行数据发送或者是申请数据,服务器端针对客户端的请求做出对应的响应。

针对于客户端和服务器端的连接和数据传送接收,有专门的api提供了一系列的方法来实现其中的过程,即套接字API,套接字API是应用程序接口(应用程序与操作系统中通信协议之间的接口称为应用程序接口,即API)中用于网络通信的一组过程。

套接字API中具体包含的部分方法如下:

socket():创建socket

bind():绑定socket到本地地址和端口,通常由服务端调用

listen():TCP专用,开启监听模式

accept():TCP专用,服务器等待客户端连接,一般是阻塞态

connect():TCP专用,客户端主动连接服务器

send():TCP专用,发送数据

recv():TCP专用,接收数据

sendto():UDP专用,发送数据到指定的IP地址和端口

recvfrom():UDP专用,接收数据,返回数据远端的IP地址和端口

closesocket():关闭socket

这里对其中的过程进行一下说明:
客户端先调用过程gethorstbyname将计算机转换成IP地址,再调用getprotobyname将协议名转换为套接字过程中使用的内部二进制形式;然后在调用socket创建一个套接字,在调用connect把这个套接字与服务器建立连接(调用connect会阻塞至TCP能够建立连接);一旦连接成功,客户端反复调用recv来接受来自服务器的信息,直至所有数据都被读取,这种重复直到客户端得到一个文件结束标记(即一组0)后停止;最后,当接收完信息后,调用close关闭套接字。

服务器先调用过程getprotobyname生成协议的内部二进制标志;然后调用socket创建套接字,接着调用bind向该套接字指定一个本协议的端口号,在调用listen把该套接字置于被动模式;这时服务器进入一个无限循环,然后调用accept接收下一个请求(在大部分时间里服务器都是在access处挂起,直至请求到达),在调用send向客户端发送信息;最后调用close终止连接。在关闭连接后,服务器再调用accept读取下一个连接,知道把信息发送完。

Java的socket最主要的相关类


描述

Socket

通信端点,表示TCP的一个套接字,客户端程序通过该端点使用TCP协议连接到服务器

ServerSocket

通信端点,服务程序通过该端点接收客户端的连接请求

DatagramSocket

表示UDP的一个套接字,用于发送或者接收UDP数据包

DatagramPacket

表示一个UDP数据报

InetAddress

表示一个Internet地址

数据传输的方式

TCP数据传输

TCP是基于流的网络通信的方法。TCP套接字分为客户端(Socket)和服务端(ServiceSocket)两类。

客户端套接字绑定到远程计算机上的任何空闲的端口,并连接到特定的服务器端口和主机(可以是本机)上,当套接字被创建时就与主机和端口建立了连接。TCP套接字只在不多于两台计算机之间通信,多余两台计算机通信的时候,应该建立多个套接字连接,为每个计算机建立一个连接。当套接字与另外一台计算机建立连接时,需要绑定远程计算机的IP和端口号。本地计算机的套接字将绑定一个本地IP地址和端口号。

服务端套接字绑定本地计算机上的特定端口,这样就可以实现定位服务。服务端套接字可以响应多个客户端的请求。一旦创建了服务器的套接字,它将绑定本地端口,然后等待接收传入的连接。当客户端试图连接时,将其插入队列中,队列满的时候,拒绝其他客户端的连接。使用accept()方法接收连接请求

UDP数据传输

UDP是基于用户数据报的传输协议。传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。