假设一个客户程序,他寻求在端口80与一个服务器进行连接。这个端口通常在一台机器上由HTTPD服务器监视,这台机器安装并运行了这些服务器。为了对一个从端口80接受到的来自客户的格式正确的“GET”请求作出响应,HTTPD服务器可以向客户发回一个web页面(这个页面包含在请求中)。下面讨论如何实现这个功能。
一 客户端如何发送请求
客户如果希望从一个HTTPD服务器(假设端口为80)接受web页面,他可以象下面这样创建一个socket对象:
Socket t=new Socket(webAddr,80);
socket类实在java.net程序包中定义的。
工作原理:这样创建的这个socket对象,在端口80上与服务器
www.sdu.edu.cn进行通信,并向他发送客户的“socket号码”(由客户机的IP和客户所使用的端口号组成),服务器通过向客户机发送自己的Socket号码(服务器的IP和服务器所使用的端口号组成)来确认这个服务请求。如果这个Socket对象的构造函数无法建立一个与服务器的连接,她就抛出一个UnknownHostException异常。
二 发送和读取数据(工作)
一旦客户建立了与服务器的连接之后,客户就可以通过这条通信线路向服务器发送数据以及从服务器读取数据了。从本质上说和在本地机器上读取和写入文件所使用的方法相同。
Socket类提供了两个方法:getInputStream和getOutputStream,他们分别返回一个InputStream和OutputStream。
当然,在可能的情况下,为了方便起见,我们可能希望把二进制I/O流对象转换为Reader或者Writer类型的字符I/O流对象。方法如下:
OutputStream out=socket.getOutputStream();
PrintStream ps=new PrintStream(out,true);
InputStream in=socket.getInputStream();
InputStreamReader in_reader=new InputStreamReader(in);
BufferedReader br=new BufferedReader(in_reader);
Reader对象in_reader把InputStream对象in所输出的字节转换为Unicode字符。把这些数据输入到BufferedReader对象br之后,我们可以调用BufferedReader类效率极高的readLine方法一次输入一行文本。
三 发送经过精确格式化的请求
说明:1、客户-服务器之间的所有通信都是通过端口进行的。端口号0-255保留用于标准网络服务,如Telnet,FTP,Finger,TFTP,ECHO等。255及其以上的端口号可以用于由用户创建的更为特定的服务。
2、三步并不是必须的。并不是所有服务器都需要客户socket向其发送一个精确格式化的请求来产生信息。如,我们在程序中创建一个socket对象,他通过端口13与一个“time-of-day”服务器连接。整个服务器是由xxxx提供的维护的。
Socket socket=new Socket("time-A.timefreq.bldrdoc.gov",13);在上面的程序中,可以直接读取输出流中的时间信息。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。