荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Peter (小飞侠), 信区: Program
标  题: 用Java编写Socket客户机端程序
发信站: BBS 荔园晨风站 (Thu Jan 21 22:38:28 1999), 转信


  本文通过一个Java程序介绍利用Java编写Client/Server结构中客
户端Socket程序的方法。

    Socket的概念
    Mail、ftp、telnet、name和finger都是网络上的计算机提供的
服务器(这些服务器均是软件)。每种服务器都是在一个专用的公开的
端口上提供的,通过连接到这些端口,客户程序就能够访问这些服务器
。这与现实生活是相似的——当需要干洗衣服的时候,找干洗店;当需
要取钱的时候,去银行,等等。除了专用于特定服务器的端口外,计算
机还有其它的端口让程序员创建他们自己的服务器。
    端口一般是编号的,通过指定服务器的端口号,客户程序可以连接
到该端口上。每种服务器或端口要有特定的协议,为了让客户的请求
能够被理解和响应,客户必须以这种服务器特有的方式形成客户请求

    Socket是网络上运行的两个程序间双向通信连接的一端。Socket
这个词的一般意义是自然的或人工的插口,如家用电器的电源插口等

    客户程序可以向Socket写请求,服务器将处理此请求,然后通过So
cket把结果返回给客户。
    Socket是一种底层连接。客户机和服务器通过写入到Socket的字
节流进行通信。它们必须有共同的协议,也就是说,通过Socket相互传
送信息时所用的语言必须是协定好的。
    如果客户正试图连接到WWW,那么类URL及相关类(URL Connection
、URL Encoder)比较适合。相对来说,URL是对Web的高层连接,并且把
Socket用作低层实现的一部分。
    Java开发环境中的java.net软件包提供了Socket类。Socket类实
现客户Java程序和网络上的另一程序间的双向连接的用户端。下面谈
谈怎样使用Socket和ServerSocket类。
    利用Socket类编写客户端Java程序
    下面的简单程序说明了怎样借助Socket建立从客户端程序到服务
器程序的连接。javan et包中的Socket类是客户端程序和服务器端程
序间双向通信连接的客户端的实现,它与平台无关。Socket类是覆盖
在一个与平台有关的实现之上的;它把具体的系统细节从客户的Jav程
序中屏蔽掉。因此,当使用Socket类时,应该使用java.net.Socket类,
以便跳过与系统有关的功能。通过这种方式,客户的Java程序将是与
平台无关的。
    EchoTest这个客户程序通过一个Socket连接到标准的Echo服务器
(借助端口8),客户向该Socket进行读写。把用标准输入设备输入的文
本写入到Socket,然后EchoTest向Echo服务器发送整个文本。服务器
通过Socket把所有从客户端接收到的输入返回给客户。客户程序通过
Socket读取从服务器返回的数据并显示从服务器端接收到的所有数据
。程序代码如下
    import java.io.*;
    import java.net.*;
    public class EchoTest{
    public static void main(String[] args){
     try{
     Socket echoSocket=new Socket("hust",8);
     OutputStream os=echoSocket.getOutputStream();
     DataInputStream is=new DataInputStream
     (echoSocket.getInputStream)());
     int c;
    String responseLine;
    while((c=System.in.read())!=-1){
       os.write((byte)c);
       if(c==‘\n’){
     os.flush();
     responseLine=is.readLine();
     System.out.println("echo:"+responseLine);
    }
      }
       os.close();
       is.close();
       echoSocket.close();
      }catch(Exception e){
    System.err.println("Exception:"+e);
      }
     }
    }

    程序分析
    try块内的前三行代码很关键,它们建立了客户机和服务器间的So
cket连接并在Socket上打开了一个输入流和一个输出流。第一行创建
了一个Socket对象并命名为echoSocket。这里所用的类Socket的构造
方法(相当于C++中的构造函数,还有三种)要求指定客户想连接的机器
的名称和端口号。程序中所用的机器名hust是假设的网上的一台机器
,读者可根据自己的环境修改。端口号为8。块try内的第二、三行分
别打开Socket上的一个输出流和输入流。为了利用Socket与服务器通
信,现在EchoTest只需向输出流写数据,从输入流读取数据。程序的其
它语句就实现这个目的。块try中的其它代码从EchoTest的标准输入
流(用户可以在此处输入数据)每次读入一个字符。EchoTest单独地向
连接到Socket的输出流写入每个字符。当用户敲入‘\n’时,EchoTes
t一次就把输出流全部送入,这样就把用户敲入的一整行一次送入了服
务器。下一步,EchoTest从与Socket相连的输入流处读取一行信息。
在执行方法readLine(时,要等到服务器向EchoTest发回消息后才返回
,它返回时,EchoTest向标准输出打印这条消息。这样一直循环EchoTe
st从用户处读取输入、把它发送到Echo服务器再从服务器获得响应后
显示响应信息,直到用户敲入一个结束符。
    好的程序执行完的时候总要进行结束整理,本程序也不例外。循
环后的三行代码关闭与Socket连接的输入输出流,关闭与服务器的Soc
ket连接。这里的代码顺序很重要,必须在关闭Socket之前关闭与之相
连的流。程序中最后两行语句做例外处理。
    以上Echo服务器实现的是一个简单的协议,这段客户程序是很直
观的。客户机向服务器发送文本,然后服务器把它返回给客户机。当
客户程序与更复杂的服务器(如http服务器)通信时,客户程序也将更
复杂。但是,基本的操作是相同的,即:1.打开Socket;2.打开与此Soce
t连接的输入输出流;3.根据服务器的协议向此Socket写数据或从Soc
ket读取数据;4.关闭oc ket和流。

--
※ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: 192.168.1.3]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店