一种基于Java的网络通信程序
扫描二维码
随时随地手机看文章
在信息化社会发展过程中,计算机网络应用逐渐渗透到各个工程技术领域和社会生活的方方面面。资源共享、文件传输等技术在计算机网络应用中显得尤为重要。浏览器将FTP集成其中之后,用户可轻易利用浏览器通过超链接下载服务器所开放的任意文件,以达到资源共享的目的。FTP不仅允许从远程计算机上获取、下载文件;另一方面,也可将文件从本地机拷贝传输到远程计算机。
Java是一门适合于分布式计算环境、尤其是Inter-net程序设计的语言。Java在计算机网络应用中可以完成资源共享、文件传输这一重要任务。Java不仅具有很好的安全性和可移植性,还为Internet编程提供了丰富的网络类库支持。
1 流式网络通信机制
流式Socket所完成的通信是一种基于连接的通信,即在通信开始之前先由通信双方确认身份并建立一条专用的虚拟连接通道,然后它们通过这条通道传输数据信息进行通信,当通信结束时再将原先所建立的连接拆除。Server端首先在某端口提供一个监听Client请求的监听服务并处于监听状态,当Client端向该Server端口提出服务请求时,Server端和Client端就建立了一个连接和一条传输数据的通道;当通道结束时,这个连接通道将被同时拆除。
连接的建立和拆除增加了程序的复杂性,同时在通信过程中始终保持连接也会占用系统的内存等资源,所以只适用于集中、连续的通信。
ServerSocket类和Socket类是用Java实现流式Socket通信工具。创建一个ServerSocket对象就创建了一个监听服务,创建一个Socket对象就建立了一个Client与Server间的连接。
1.1 ServerSocket类
创建一个ServerSocket类,同时在运行该语句的计算机的指定端口处建立一个监听服务,如:
ServerSocket MyListener=new ServerSocket(600);
这里指定提供监听服务的端口是600,一台计算机可以同时提供多个服务,这些不同的服务之间通过端口号来区别,不同的端口号上提供不同的服务。为了随时监听可能的Client请求,执行如下的语句:
Socket LinkSocket=MyListener.accept();
该语句调用了ServerSocket对象的accept()方法,这个方法的执行将使Server端的程序处于等待状态,程序将一直阻塞直到捕捉到一个来自Client端的请求,并返回一个用于与该Client通信的Socket对象Link-Socket。此后Server程序只要向这个Socket对象读写数据,就可以实现向远端的Client读写数据。结束监听时,关闭ServerSocket对象:
Mylistener.close();
1.2 Socket类
当Client程序需要从Server端获取信息及其他服务时,应创建一个Socket对象:
Socket MySocket=new Socket(“ServerComput-erName”,600);
Socket类的构造函数有两个参数,第一个参数是欲连接到的Server计算机的主机地址,第二个参数是该Server机上提供服务的端口号。
Socket对象建立成功之后,就可以在Client和Server之间建立一个连接,并通过这个连接在两个端点之间传递数据。利用Socket类的方法getOutput-Stream()和getInputStream()分别获得向Socket读写数据的输入/输出流,最后将从Server端读取的数据重新返还到Server端。
当Server和Client端的通信结束时,可以调用Socket类的close()方法关闭Socket,拆除连接。
2 服务器端程序设计
在服务器端,利用ServerSocket类的构造函数ServerSocket(int port)创建一个ServerSocket类的对象,port参数传递端口,这个端口就是服务器监听连接请求的端口,如果在这时出现错误将抛出IOException异常对象,否则将创建ServerSocket对象并开始准备接收连接请求。
服务程序从调用ServerSocket的accept()方法开始,直到连接建立。在建立连接后,accept()返回一个最近创建的Socket对象,该Socket对象绑定了客户程序的IP地址或端口号。
基于上述原理,服务器端的通信程序如下:
上述程序中,使用了多线程机制。JavaServer和service对象本身都是一个线程。JavaServer对象首先创建一个ServerSocket对象,并启动线程的运行。它的run()方法用于监听来自客户机的连接。每当有一个新的客户机连接时,ServerSocket就会创建一个新的Socket类实例,并创建一个service对象,同时启动这个对象的线程。每个service对象用于完成与客户机通信、提供服务的任务。这样服务器可以同时与多个客户机连接,同时为多个客户机提供服务。当从标准输入中接收到quit字符串时,服务器退出运行。
3 客户端程序设计
当客户程序需要与服务器程序通信时,需在客户机创建一个Socket对象。Socket类有构造函数Socket(InetAddress addr,int port)和Socket(String host,intport),两个构造函数都创建了一个基于Socket的连接服务器端流套接字的流套接字。对于第一个InetAd-dress子类对象通过addr参数获得服务器主机的IP地址,对于第二个函数host参数包被分配到InetAddress对象中,如果没有IP地址与host参数相一致,那么将抛出UnknownHostException异常对象。两个函数都通过参数port获得服务器的端口号。假设已经建立连接了,网络API将在客户端基于Socket的流套接字中捆绑客户程序的IP地址和任意一个端口号,否则两个函数都会抛出一个IOException对象。
如果创建了一个Socket对象,那么它可通过get-InputStream()方法从服务程序获得输入流读传送来的信息,也可通过调用getOutputStream()方法获得输出流来发送消息。在读写活动完成之后,客户程序调用close()方法关闭流和流套接字。
在下面客户机端的通信程序中,首先创建一个Socket对象,用于与服务器通信,它从标准输入中读取数据,把这些数据传给服务器,再从服务器读取应答信息,然后把这些应答信息写到标准输出。当读取了5行的数据后,客户机程序将退出运行。
4 结 语
采用Java语言编写网络通信程序非常简捷,缘于Java语言本身就是一门面向对象的网络编程语言,提供了多个可用于访问标准Internet协议的类库,从而支持多种Internet协议,包括:FTP,HTTP,NNTP和WWW等,极大地简化了网络程序设计。事实上,用Java语言还可以方便地编写出功能完善的其他应用程序。