Java利用利用TCP协议实现客户端与服务器通信协议实现客户端与服务器通信(附通信源码附通信源码)
主要介绍了Java利用TCP协议实现客户端与服务器通信(附通信源码),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着
小编来一起学习学习吧
进行TCP协议网络程序的编写,关键在于ServerSocket套接字的熟练使用,TCP通信中所有的信息传输都是依托ServerSocket类的输入输出流进行的。
上一篇博客和大家分享了在网络编程中要注意的基础知识,关于IP、TCP、UDP以及端口和套接字的一些概念,想了解的小伙伴可以看我的这篇文章“盘点那些进行网络编程必须要知道的基础知识”,那
么今天大灰狼就来和大家分享一下如何使用TCP/IP进行网络程序的开发。
TCP协议概念协议概念
先来了解一下TCP协议的基本概念。
我们知道TCP是可靠而非安全的网络协议。它可以保证数据在从一端送至另一端的时候可以准确的送达,并且抵达的数据的排列顺序和送出时的顺序是相同的。因此在进行TCP协议通信的时候,我们首
先应该保证客户端和服务器之间的连接通畅。
而TCP协议程序的编写,仍然是依靠套接字Socket类来实现的,并且利用TCP协议进行通信的两个程序之间是有主次之分的,即一个是服务器的程序,另一个是客户端的程序。因此两者的功能和编写上
也略有不同。如下图是服务器与客户端之间进行通信的示意图:
以上就是在TCP协议中客户端与服务器建立连接的过程示意图。而在这其中起到关键作用的就是服务器端套接字ServerSocket和客户端套接字Socket。通过这两个套接字来建立服务器和客户端,从而利
用其中的函数进行数据的通信。
在ServerSocket类中有很多需要注意的地方,接下来大灰狼和大家分享一下ServerSocket类的具体用法:
ServerSocket类类
ServerSocket类存在于Java.net包中,表示服务器端的套接字,在使用时需要首先导入这个类,我们也知道ServerSocket类的主要功能就是通过指定的端口等待来自于网络中客户端的请求并且进行连
接。
值得注意的是:服务器套接字一次只能与一个客户端套接字进行连接,因此如果存在多台客户端同时发送连接请求,则服务器套接字就会将请求的客户端存放到队列中去,然后从中取出一个套接字与服
务器建立的套接字进行连接,但是服务器端能够容纳的客户端套接字也不是无限的,当请求连接的数量大于最大容纳量时,那么多出来的请求就会被拒接,一般来说队列的默认大小是50。
ServerSocket类的构造方法通常会抛出IOException异常,具体有以下几种形式:
ServerSocket():创建非绑定服务器套接字
ServerSocket(inr port):创建绑定到特定端口的服务器套接字
ServerSocket(int port, int backlog):利用指定的backlog创建服务器套接字,并将其绑定到指定的服务器端口上
ServerSocket(int port, int backlog, InetAddress bindAddress):使用指定的端口,侦听backlog和要绑定到本地的IP地址创建服务器。这种情况适用于计算机上有多个网卡和多个IP地址的情况,用户
可以明确的规定ServerSocket在哪块网卡或哪个IP地址上等待用户的连接请求。
以下是ServerSocket类中一些常用的方法:
ServerSocket类中常用的方法
方法 返回值 说明
accept() Socket
等待客户机连接,若连
接则创建一个客户端套
接字
isBound() boolean
判断ServerSocket的绑
定状态
getInetAddress() InetAddress
返回此服务器套接字的
本地地址
isClosed() boolean
返回服务器套接字的关
闭状态
close() void 关闭服务器套接字
bind(SocketAddress
endpoint)
void
将ServerSocket绑定到
特定地址(IP地址和端
口号)
getInetAddress() int
返回服务器套接字等待
的端口号
了解了ServerSocket类的基本方法之后,就是如何进行客户端和服务器进行连接的问题了。
在服务器端我们可以调用ServerSocket类的accpet()方法与请求连接的客户机建立连接,这时会返回一个和客户端相连接的Socket对象,这个时候其实已经连接成功了,使用getInetAddress()方法就可以
获取到进行请求的客户机的IP地址。
对于如何进行客户端和服务器端数据的通信,就要用到数据的输入流和输出流了,服务器端的Socket对象使用getOutputStream()方法获取到的输出流,将指向客户端的Socket对象使用getInputStream()
方法获取到的输入流。由此就实现在服务器向客户端发送数据的一个过程,同样的道理,客户端端的Socket对象使用getOutputStream()方法获取到的输出流,将指向服务器端的Socket对象使用
getInputStream()方法获取到的输入流。从而实现由客户端向服务器发送数据的过程。
注意:注意:accpet()方法会阻塞线程的继续执行,如果在对应的接口没有收到客户端的呼叫,则程序会停留在此处,直到获取到客户端的呼叫才会继续向下执行,但是如果服务器没有收到来自客户端的呼叫请
求,并且accpet()方法没有发生阻塞,那么通常情况下就是程序出了问题,一般来说可能是使用了一个已经被其他程序占用了的端口号,导致ServerSocket没有绑定成功!遇到这种情况可以尝试更换新的
评论0