鉴于TCP的Java Socket通信服务器

时间:2022-10-19 07:03:05

鉴于TCP的Java Socket通信服务器

1TCP与Socket[1]

在Internet的通信协议中,TCP/IP协议是一组至关重要的协议,TCP和UDP又是TCP/IP中两个非常重要协议。TCP被称为传输控制协议,它是面向连接的通信协议,采用TCP协议通信的两台计算机必须首先建立连接,然后再进行数据传送,最后释放连接。TCP协议提供了端到端、全双工通信模式,这种通信模式能保证为应用程序提供可靠的、无差错的通信连接,使一台计算机发出的字节流准确无误地发送到网络中的其它计算机,对可靠性要求高的数据通信系统,一般采用TCP协议传送数据。UDP被称为用户数据报协议,是与TCP相对应的协议。它是面向无连接的协议,数据发送前不需要建立连接,而是直接就把数据包发送给接收方。

Socket被称为套接字,在计算机网络中以双工方式通信的两个进程,总要保持一个连接,从而实现服务程序和客户程序之间的稳健通信,这两个被连接的端点被称为套接字。Socket通信就是两个进程之间基于TCP连接的、端到端的通信,这种通信是双向的。TCP连接提供数据通信所需的字节流服务,这种服务是可靠的,一方发出的字节流确保能够到达对方并被接收,同时也能够保证数据的完整性。

套接字主要负责两个进程之间的通信,客户程序向套接字里写入连接请求和服务请求,然后服务器会接收连接请求,并处理这个请求,最后,服务器把处理结果写入套接字送回客户程序。具体来说,一个Socket服务器应用程序会监听某一特定端口,等待Socket客户程序的连接请求。当一个连接请求到达时,服务器和客户就建立一个通信连接。在连接过程中,客户被分配一个本地端口号,并通过该端口与Socket连接,客户通过读写Socket与服务器交换数据信息,同样,服务器也被分配一个新的端口号,它需要通过这个新的端口号,来继续监听原端口上的其它连接请求。服务器也给它的本地端口连接一个Socket,通过读写它与客户交换数据信息,以实现服务器和客户机的通信目的。

目前,用户可以使用两类套接字,即TCP协议采用的流套接字和UDP协议采用的数据报套接字。流套接字提供了双向的、有序的、无重复并且无记录边界的数据流服务。数据报套接字支持双向的数据流,但不保证是可靠的、有序的、无重复的。

2Socket通信工作原理[2]

Socket数据通信按照以下步骤进行:首先,建立Socket连接。通信正式开始之前,双方必须相互确认身份,在彼此认可对方后,建立一条专用的Socket虚拟连接通道。其次,数据通信。利用Socket虚拟连接通道发送和接收数据,从而实现服务器和客户端的通信。最后,关闭连接。通信任务完成后,将所建立的Socket虚拟连接将被拆除,释放系统资源。在Java面向对象程序设计语言中,开发包提供的ServerSocket类和Socket类及其方法,可实现上述操作。Socket工作原理如图1所示,服务器端的通信进程首先选择一个端口号,然后调用accept()方法对此端口进行监听,等待客户通信进程提出连接申请。客户端通信进程需要先创建Socket对象,在创建Socket对象时,必须指定服务器端的地址和通信端口号,这个地址和端口号必须与服务器监端保持一致。如果客户端的申请得到服务器端认可后,双方就建立了连接,那么服务器就利用accept()方法获取得客户端Socket对象,并通过该对象双方进行数据交换和数据通信。

3JavaSocket通信模型[3]

3.1建立Socket连接

首先,在服务器端创建一个ServerSocket类的实例对象,该对象用于监听客户端的连接请求,代码如下:ServerSocketserversocket;try{serversocket=newServerSocket(8888);}catch(Exceptionexcept){System.out.println("Errormessage:"+except);}在服务器端建立ServerSocket对象实例时,必须使用try...catch语句进行异常处理,以防止程序出错时能及时处理。在生成ServerSocket对象时,必须选择一个合法的端口号,该端口号应在1024和65535之间选择,以免与常用服务程序的端口号发生冲突,上例中选用8888作为端口号。

其次,在服务器端调用ServerSocket类的serversocket对象的accept()方法进行监听,等待客户端程序的连接请求。在连接请求到达之前,线程一直处于阻塞状态,当一个连接请求到来时,初始化连接Socket类的socketobject对象,程序实现如下:Socketsocketobject;try{socketobject=serversocket.accept();}catch(Exceptionexcept){System.out.println("Errormessage:"+except);}如果连接成功,accept方法将返回客户端的socketobject对象实例。在一般情况下,通过必要的数据信息交换,将由另外的服务程序专门为该连接提供相应的信息服务,而serversocket对象实例将被释放出来,继续监听其它客户端的连接请求。

最后,在客户端建立一个Socket类的socketobject对象,请求建立连接:Socketsockettobject;try{socketobject=newSocket("Serveraddress",8888);}catch(Exceptionexcept){System.out.println("Errormessage:"+except);}在客户端建立Socket类的socketobject对象实例时,必须处理可能发生异常情况,连接服务器的地址和端口号必须与服务器端保持一致,否则,连接将会失败。

3.2获得输入/输出数据流

连接成功后,用Socket类提供的getInputStream()和getOutputStream()方法创建输入输出数据流对象,同时要在trycatch块中进行异常处理,代码如下:try{InputStreaminputstr=socketobject.getInputStream();OutputStreamoutputstr=socketobject.getOutputStream();}catch(Exceptionexcept){System.out.println("Errormessage:"+except);}

3.3读写数据

在获取socket对象的输入输出流后,为了便于进行读写操作,需要在这两个流对象基础上建立易于操作的数据流DataInputStream、DataOuputStream或PrintStream,用下面的程序代码实现:DataInputStreamdatainstr=newDataInputStream(inputstr);BufferedReaderbufferrd=newBufferedReader(datainstr);DataOuputStreamdataoutstr=newDataOuputStream(outputstr);PrintStreamprintstr=newPrintStream(outputstr);要读取一字符串,然后将字符串的长度写入输出流,操作语句如下:Stringstring1=bufferrd.readLine();dataos.println(string1.length());

3.4断开连接

在通信结束时必须断开连接,释放所占用的资源,关闭socket。Java提供了close()方法来完成该项任务,语句如下:socketobject.close();//关闭Socket对象serversocket.close();//关闭ServerSocket对象

4结语

Java具有纯面向对象、跨平台、多线程、可移植等诸多优点,是目前最为优秀的编程语言。Java最适用开发网络环境下的应用软件,Java提供的类库支持网络环境,可以适应TCP/IP和UDP等多种网络协议编程。基于TCP协议的Javasocket通信技术,虽然在连接时需要占用一点点时间,但连接成功后就可准确的、快速的、同步的进行数据传输,大大提高了传输效率,是Java网络编程最常采用的通信模式和通信技术。

上一篇:加强国有建筑企业的执行力途径 下一篇:移动通信技术更新必要性