用Java编写Socket客户机端程序

 
用Java编写Socket客户机端程序
 
整理:Ackarlix
 
 
  本文通过一个Java程序介绍利用Java编写Client/Server结构中客户端Socket程序的方法。
 
    Socket的概念
    Mail、ftp、telnet、name和finger都是网络上的计算机提供的服务器(这些服务器均是软件)。每种服务器都是在一个专用的公开的端口上提供的,通过连接到这些端口,客户程序就能够访问这些服务器。这与现实生活是相似的——当需要干洗衣服的时候,找干洗店;当需要取钱的时候,去银行,等等。除了专用于特定服务器的端口外,计算机还有其它的端口让程序员创建他们自己的服务器。
    端口一般是编号的,通过指定服务器的端口号,客户程序可以连接到该端口上。每种服务器或端口要有特定的协议,为了让客户的请求能够被理解和响应,客户必须以这种服务器特有的方式形成客户请求。
    Socket是网络上运行的两个程序间双向通信连接的一端。Socket这个词的一般意义是自然的或人工的插口,如家用电器的电源插口等。
    客户程序可以向Socket写请求,服务器将处理此请求,然后通过Socket把结果返回给客户。
    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块内的前三行代码很关键,它们建立了客户机和服务器间的Socket连接并在Socket上打开了一个输入流和一个输出流。第一行创建了一个Socket对象并命名为echoSocket。这里所用的类Socket的构造方法(相当于C++中的构造函数,还有三种)要求指定客户想连接的机器的名称和端口号。程序中所用的机器名hust是假设的网上的一台机器,读者可根据自己的环境修改。端口号为8。块try内的第二、三行分别打开Socket上的一个输出流和输入流。为了利用Socket与服务器通信,现在EchoTest只需向输出流写数据,从输入流读取数据。程序的其它语句就实现这个目的。块try中的其它代码从EchoTest的标准输入流(用户可以在此处输入数据)每次读入一个字符。EchoTest单独地向连接到Socket的输出流写入每个字符。当用户敲入‘/n’时,EchoTest一次就把输出流全部送入,这样就把用户敲入的一整行一次送入了服务器。下一步,EchoTest从与Socket相连的输入流处读取一行信息。在执行方法readLine(时,要等到服务器向EchoTest发回消息后才返回,它返回时,EchoTest向标准输出打印这条消息。这样一直循环EchoTest从用户处读取输入、把它发送到Echo服务器再从服务器获得响应后显示响应信息,直到用户敲入一个结束符。
    好的程序执行完的时候总要进行结束整理,本程序也不例外。循环后的三行代码关闭与Socket连接的输入输出流,关闭与服务器的Socket连接。这里的代码顺序很重要,必须在关闭Socket之前关闭与之相连的流。程序中最后两行语句做例外处理。
  以上Echo服务器实现的是一个简单的协议,这段客户程序是很直观的。客户机向服务器发送文本,然后服务器把它返回给客户机。当客户程序与更复杂的服务器(如http服务器)通信时,客户程序也将更复杂。但是,基本的操作是相同的,即:
  1.打开Socket;
  2.打开与此Soce t连接的输入输出流;
  3.根据服务器的协议向此Socket写数据或从Socket读取数据;
  4.关闭oc ket和流。
 
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值