第4章 基于TCP协议的Socket通信
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
码头A
货物
货物具体如何运送交 给货运公司
货物
码头B
3
Socket数据发送过程
应用程序
① 创建Socket
②通过bind将 Socket信息通 知给网络驱动层
③将要发送的数据 写入到socket中
Socket
④网络驱动层从Socket中 取出数据通过网卡发送出去
网络驱动层
4
Socket数据接收过程
如果ServerSocket关闭后,仍然有发向它的数据,操作系统 并不会立刻关闭它所绑定的端口,等接收完数据后,再关 闭端口。如果此时立刻在同一个主机上重启服务器程序, 由于端口被占用,服务器启动失败抛出BindException。
为了确保一个进程关闭了ServerSocket后,即使操作系统没 有释放端口,同一主机上的其他进程还能重用该端口,调 用setResueAddress(true)方法。 注意:此方法在绑定到特定端口前调用。 14
IOException
UnknownHostException InterruptedException SocketException
SocketTimeoutException
BindException
ConnectException
17
Socket的主要方法
与远程服务器相关:
InetAddress getInetAddress() 返回远程服务器的IP地址 int getPort() 返回远程服务器的端口
远程登录的命令格式: telnet IP地址 端口号
见源文件:tcp\ServerSocketTest.java
11
用telnet验证TCP协议的服务器端程序
在本地计算机上使用telnet功能, 首先按下图方式 将telnet功能打开。
设置ServerSocket的选项
(1) SO_TIMEOUT
6
TCP网络程序通信模型
为客户端1 创建Socket
客户端 Socket1
①向服务器发送请求
服务器端 ServerSocket
客户端 Socket2
为客户端2 创建Socket
7
ServerSocket
public ServerSocket(int port)
创建绑定到特定端口的服务器套接字。 如果port为0,由操作系统分配一
注意:以上三个方法会抛出IOException
三个状态测试方法 boolean isClosed() 已经连接到远程主机,还没有关闭,返回false boolean isConnected() 曾经成功连接到远程主机,返回true boolean isBound() 如果将套接字成功地绑定到一个地址,则返回 true
码头货物货物货物具体如何运送交给货运公司socket数据发送过程应用程序socket网络驱动层创建socket通过bindsocket信息通知给网络驱动层将要发送的数据写入到socket网络驱动层从socketsocket数据接收过程应用程序socket网络驱动层创建socket通过bindsocket信息通知给网络驱动层socket中将数据读出网络驱动层将网络中与socket对应的数据接收并放socket相关的类相关类在javanetserversocket类位于服务器端的tcp通信socket类位于服务器端和客户端的tcp通信datagramsocket类支持udp通信协议tcp网络程序通信模型服务器端serversocket客户端socket1客户端socket2向服务器发送请求为客户端创建socket为客户端创建socketpublicserversocketintport创建绑定到特定端口的服务器套接字
ObjectOutputStream ObjectInputStream 传递文件
2
4. 一些注意事项
套接字(Socket)
Socket是网络驱动层提供给应用程序编程的接口和一 种数据发送、接收机制。Socket由应用程序创建, 与网络驱动层建立绑定机制,告诉网络驱动层当前 应用程序所对应的IP地址和端口号。
boolean isBound()
判断服务器是否曾经与端口成功绑定过。
10
用telnet验证TCP协议的服务器端程序
Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆 服务的标准协议和主要方式。它为用户提供了在本地计算机 上完成远程主机工作的能力。
telnet程序位于本机 C:\Windwos\System32目录中。
bindAddr表示套接字所绑定的计算机IP地址,此构造方法适合一台计算机有多 个网卡的情况。
注意:这些构造方法都将抛出例外IOException。
8
ServerSocket
public ServerSocket()
此方法创建的Socket不与任何本地端口绑定,需要通过调 用bind()方法与特定端口绑定。
关闭输出流。对于 TCP 套接字,任何以前写入的数据都将被 发送,并且后跟 TCP 的正常连接终止序列。 此时在向套 接字的输出流写入数据,则该流将抛出 IOException。
boolean isInputShutdown() boolean isOutputShutdown()
20
TCP协议Socket通信过程
22
设置Socket的选项
(2) SO_REUSEADDR
void setReuseAddress(boolean on) throws SocketException
boolean getReuseAddress() throws SocketException
见源文件:ServerSocket选项设置/TimeOutTest.java
13
设置ServerSocket的选项
(2) SO_REUSEADDR
void setReuseAddress(boolean on) throws SocketException
boolean getReuseAddress() throws IOException
基于TCP协议的Socket通信
本章内容
1. Socket的基本概念及通信过程 2. 服务器端Socket程序的编写
ServerSocket的构造方法及主要方法 利用telnet验证服务器程序的正确性 ServerSocket一些重要选项的设置 3. 客户端Socket程序的编写
Socket的构造方法和主要方法 服务器与客户端的一对一通信 服务器与客户端的一对多通信 在服务器端采用线程池 Socket一些重要选项的设置 在服务器与客户端之间传递对象
void setSoTimeout(int timeout) throws SocketException
int getSoTimeout() throws IOException
用于设置服务器等待客户连接的超时时间。默认为0, 一直等待下去。如果超过了超时时间,服务器端抛出
SocketTimeoutException。
关闭流和套接字
关闭流和套接字
21
设置Socket的选项
(1) TCP_NODELAY
void setTcpNoDelay(boolean on) throws SocketException boolean getTcpNoDelay() throws SocketException
默认情况下,发送数据采用Negale算法,发送 数据先进入缓冲区中,等缓冲区满了后再发出, 并且要等到接收方的回应后,继续发送下一批 数据。适合发送大容量数据的情况。
应用程序
① 创建Socket
②通过bind将 Socket信息通 知给网络驱动层
④从socket中将数据读出 Socket
③ 网络驱动层将网络中与 Socket对应的数据接收并放 入到Socket中
网络驱动层
5
与Socket相关的类
相关类在包中 ServerSocket类位于服务器端的TCP通信 Socket类位于服务器端和客户端的TCP通信 DatagramSocket类支持UDP通信协议
无参构造方法的主要用途是:允许服务器在绑定到特定端 口之前,先设置ServerSocket的选项,因为一旦服务器与 端口绑定,就不能设置ServerSocket的选项了。
ServerSocket serverSocket=new ServerSocket(); serverSocket.setReuseAddress(true); serverSocket.bind(new InetSocketAddress(9000));
19
Socket的主要方法
void shutdownInput() throws IOException
关闭输入流。发送到套接字的输入流端的任数据都将被确 认然后被静默丢弃。 此时再从套接字输入流读取内容将返 回 EOF。
void shutdownOutput() throws IOException
设置ServerSocket的选项
(3) SO_RCVBUF void setReceiveBufferSize(int size) throws SocketException int getReceiveBufferSize() throws IOException
表示服务器端用于接收数据的缓冲区的大小,以字 节为单位。 SO_RCVBUF默认值与操作系统有关。 如果要设置大于64K的缓冲区,必须在 ServerSocket绑定到特定端口之前有效。执行 setReceiveBufferSize()方法相当于对所有accept() 方法返回的Socket设置接收数据的缓冲区的大小。
InetAddress getInetAddress() throws SocketException
返回此服务器套接字的本地地址
int getLocalPort() throws SocketException
返回此套接字的监听端口
boolean isClosed() 只有执行了close(),此方法才返回true。
个端口(匿名端口)。
public ServerSocket(int port, int backlog)
创建服务器套接字并将其绑定到指定的本地端口号。 backlog表示服务器忙时所指定的最大等待连接数。
public ServerSocket(int port, int backlog, InetAddress bindAddr)
9
ServerSocket的主要方法
Socket accept() throws SocketException
监听并接受客户端到此套接字的连接请求,并为客户端的请 求创建一个与之对应的Socket对象 。
void close() throws SocketException
释放ServerSocket占用的端口,断开与所有客户端的连接。
与本地客户端相关:
InetAddress getLocalAddress() 返回本地客户端的IP地址 int getLocalPort() 返回本地客户端的端口
18
Socket的主要方法
InputStream getInputStream() OutputStream getOutputStream() void close()
创建套接字并将其连接到指定主机上的指定端口号。localAddr和 localPort表示当前客户端的IP和端口,此方法适合客户端有多个网卡的情况。
public Socket(InetAddress address, int port, InetAddress localAddr,int localPort)
服务器端
客户端
创建ServerSocket对象
创建Socket对象,指定 要连接的主机IP和端口号
accept()方法监听客户端连接 连接建立成功,得到Socket对象
Socket建立成功
通过Socket对象创建输入字节流 通过Socket对象创建输出字节流
通过Socket对象创建输出字节流 通过Socket对象创建输出字节流
15
Socket
public Socket(String host, int port)
创建套接字并将其连接到指定主机上的指定端口号。
public Socket(InetAddress address, int port)
创建套接字并将其连接到指定 IP 地址的指定端口号。
public Socket(String host, int port, InetAddress localAddr, int localPort)
创建套接字并将其连接到指定 IP 地址的指定端口号。localAddr和localPort 表示当前客户端的IP和端口,此方法适合客户端有多个网卡的情况。
16
Socket连接服务器端时可能抛出的异常
(1) UnknownHostException:如果无法识别服务器所在主机 的名称或IP地址,就会抛出此异常。 (2) ConnectException:如果没有服务器进程所指定监听的端 口,或者服务器进程拒绝连接,就会抛出此异常。 (3) SocketTimeoutException:如果等待连接超时,就会抛出 此异常。 (4) BindException:如果无法把Socket对象与指定的本地IP 地址或端口绑定,就会抛出此种异常。