??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲国产高清美女在线观看 ,亚洲日韩国产一区二区三区在线 ,中文字幕亚洲图片http://www.tkk7.com/yanzhou/category/14798.html喂马, 劈柴, 周游世界zh-cnWed, 28 Feb 2007 14:57:42 GMTWed, 28 Feb 2007 14:57:42 GMT60几种证书格式说明及Keytool命ohttp://www.tkk7.com/yanzhou/archive/2006/12/12/87208.html周游世界周游世界Tue, 12 Dec 2006 04:50:00 GMThttp://www.tkk7.com/yanzhou/archive/2006/12/12/87208.htmlhttp://www.tkk7.com/yanzhou/comments/87208.htmlhttp://www.tkk7.com/yanzhou/archive/2006/12/12/87208.html#Feedback0http://www.tkk7.com/yanzhou/comments/commentRss/87208.htmlhttp://www.tkk7.com/yanzhou/services/trackbacks/87208.html.keystore 证书库,包含用户的公钥、私钥和证书?br />
 1            FileInputStream in = new FileInputStream(Path +"RGCA.keystore");
 2            KeyStore ks = KeyStore.getInstance("JKS");
 3            ks.load(in, pwd.toCharArray());
 4            Certificate certificate = ks.getCertificate(alias);
 5            System.out.println("从证书库中取?"+RadiusUtil.getHexString(certificate.getEncoded()));
 6            System.out.println("从证书库中取得PublicKeyQ?/span>"+RadiusUtil.getHexString(certificate.getPublicKey().getEncoded()));
 7            X509Certificate x = (X509Certificate)certificate;
 8            System.out.println("从证书库中取得SignatureQ?/span>"+RadiusUtil.getHexString(x.getSignature()));
 9            PrivateKey caprk = (PrivateKey)ks.getKey(alias, pwd.toCharArray());
10            System.out.println("U钥:"+RadiusUtil.getHexString(caprk.getEncoded()));


周游世界 2006-12-12 12:50 发表评论
]]>
[ZZ]认证方式探讨 EAP-MSCHAPV2http://www.tkk7.com/yanzhou/archive/2006/11/12/80703.html周游世界周游世界Sun, 12 Nov 2006 07:24:00 GMThttp://www.tkk7.com/yanzhou/archive/2006/11/12/80703.htmlhttp://www.tkk7.com/yanzhou/comments/80703.htmlhttp://www.tkk7.com/yanzhou/archive/2006/11/12/80703.html#Feedback0http://www.tkk7.com/yanzhou/comments/commentRss/80703.htmlhttp://www.tkk7.com/yanzhou/services/trackbacks/80703.html 认证方式探讨 EAP-MSCHAPV2

MSCHAP方式?首先服务器发一个challengel用?用户向RADIUS发一个用MD4加密?password,challenge)lRADIUS(叫response),radius的MSCHAP模块向LDAP询问NTPASSWORD,然后自己再用challenge和NTPASSWORD,来计一个response,两个response相比较完成验?如果LDAP无法l出NTPASSWORD或送出SHA加密的NTPASSWORD,MS-CHAP无法验证了.唯一可行的办法是把LDAP的SCHEMA中加入NTPASSWORD?q明文存?才能满MS-CHAP的要?


PEAP-MSCHAPV2程Q?
  1、创Z个连接后QAP发送一个EAP-Request/Identity消息l客L?br />  2、客L回复一个EAP-Response/Identity消息Q包含客L的标识,通常是名字?br />  3、AP把这个消息传递给Radius服务器。从现在开始,逻辑通信׃Radius服务器到无线客户端了QAP,AC是一个中介设备?br />  4、Radius服务器发送一个EAP-Request/Start PEAP消息l客L?br />  5、无U客L和Radius服务器发送一pd的TLS消息通过协商建立的隧道。Raiuds服务器发送一个证书链让客L认证。最后,Radius服务器已l认证了无线客户端。两端都军_使用的加密信息?br />  在PEAP TLS隧道创徏后,采用MS-CHAPV2认证?br />  6、Radius服务器发送一个EAP-Request/Identity消息?br />  7、无U客L发送一个EAP-Response/Identity 消息Q消息包用户名?br />  8、Radius服务器发送一个EAP-Request/EAP-MS-CHAP-V2挑战消息Q包含挑战字W串?br />  9、无U客L回复一个EAP-Response/EAP-MS-CHAPV2回复消息Q包含对q个挑战的应{和一个自q挑战?br />  10、Radius服务器发送一个EAP-Request/EAP-MS-CHAPV2成功的消息,指出无线客户端的回应是正的Q且包含无线客户端的挑战字符丌Ӏ?br />  11、无U客L回应一个EAP-Response/EAP-MS-CHAPV2的ACK消息Q指CRadius服务器的回应消息是正的?br />  12、Radius服务器发送一个EAP-Success消息?/p>

EAP -TLS是一个IETF标准。TLS即传输层安全QTransport Layer SecurityQ,也称为SSL。它原本是一U传输层的安全协议,主要实现两个功能Qn份鉴别与信息加密。TLS可实现基于证书的单向w䆾鉴别Q只鉴别服务器)和双向n份鉴别(同时鉴别客户端与服务器)。TLS在完成n份鉴别的同时Q还交换密钥信息Q通过密钥信息可导Z话密钥用于信息加密?br />需要指出的是,在这里TLSq不是作Z个安全传输层协议跑在TCP/IP层之上,而是TLS的Handshake Record直接嵌套在EAP数据包中Q作为EAP Request/Response的数据来传送,通过TLS的Handshake Record完成单向或双向的w䆾鉴别。EAPQTLS只利用了TLS的n份鉴别功能,q没有利用TLS建立的加密通道?br />Z能够q一步利?TLS建立的安全通道交换EAPw䆾鉴别信息QIETF随后出台了PEAPQProtected EAP ProtocolQ标准草案。PEAP不但通过EAP Request/Response数据包传送TLS的Handshake Record完成w䆾鉴别Qƈ且完成n份鉴别后q一步通过TLS的Data Record再传送EAPw䆾鉴别协议?/p>

对于密钥Q?br />der  “专有编码规则”文件?der 文g包含证书的二q制表示Q包含其公共密钥Q但不包含其专用密钥。它?.arm 文g非常怼Q除了表C是二进制的Q而非 ASCII?
.p12  "PKCS 12" 文gQ其?PKCS 代表“公共密钥密码术标准 (Public-Key CryptographyStandards)”?p12 文g包含证书的二q制表示Q包含其公共密钥和专用密钥。一?.p12 文g中也可能包含多个证书Q例如,证书、发书的 CA 的证书、CA 证书的发以及他的发等{。因?.p12 文g包含专用密钥Q它是受口o保护的?br />



周游世界 2006-11-12 15:24 发表评论
]]>
JAVA教程 W八?Java|络~程(?http://www.tkk7.com/yanzhou/archive/2006/11/05/79186.html周游世界周游世界Sun, 05 Nov 2006 04:36:00 GMThttp://www.tkk7.com/yanzhou/archive/2006/11/05/79186.htmlhttp://www.tkk7.com/yanzhou/comments/79186.htmlhttp://www.tkk7.com/yanzhou/archive/2006/11/05/79186.html#Feedback0http://www.tkk7.com/yanzhou/comments/commentRss/79186.htmlhttp://www.tkk7.com/yanzhou/services/trackbacks/79186.html
8.3.10 据报Datagram通讯

  前面在介lTCP/IP协议的时候,我们已经提到Q在TCP/IP协议的传输层除了TCP协议之外q有一个UDP协议Q相比而言UDP的应用不如TCPq泛Q几个标准的应用层协?HTTPQFTPQSMTP…用的都是TCP协议。但是,随着计算机网l的发展QUDP协议正越来越来显C出其威力,其是在需要很强的实时交互性的场合Q如|络游戏Q视频会议等QUDP更是昄出极强的威力Q下面我们就介绍一下Java环境下如何实现UDP|络传输?

  8.3.11 什么是Datagram

  所谓数据报QDatagramQ就跟日常生zM的邮件系l一P是不能保证可靠的寄到的,而面向链接的TCP好比电话,双方能肯定对Ҏ受到了信息。在本章前面Q我们已l对UDP和TCPq行了比较,在这里再E作节Q?

  TCPQ可靠,传输大小无限Ӟ但是需要连接徏立时_差错控制开销大?
  UDPQ不可靠Q差错控制开销较小Q传输大限制在64K以下Q不需要徏立连接?

  MQ这两种协议各有特点Q应用的场合也不同,是完全互补的两个协议Q在TCP/IP协议中占有同样重要的CQ要学好|络~程Q两者缺一不可?

  8.3.12 Datagram通讯的表C方法:DatagramSocketQDatagramPacket

  包java.net中提供了两个cDatagramSocket和DatagramPacket用来支持数据报通信QDatagramSocket用于在程序之间徏立传送数据报的通信q接Q?DatagramPacket则用来表CZ个数据报。先来看一下DatagramSocket的构造方法:
   DatagramSocketQ)Q?
   DatagramSocketQint protQ?
   DatagramSocket(int port, InetAddress laddr)
  
  其中Qport指明socket所使用的端口号Q如果未指明端口P则把socketq接到本CZ一个可用的端口。laddr指明一个可用的本地地址。给出端口号时要保证不发生端口冲H,否则会生成SocketExceptioncM外。注意:上述的两个构造方法都声明抛弃非运行时例外 SocketExceptionQ程序中必须q行处理Q或者捕莗或者声明抛弃?

  用数据报方式~写client/serverE序Ӟ无论在客hq是服务方,首先都要建立一个DatagramSocket对象Q用来接收或发送数据报Q然后用DatagramPacketcd象作Z输数据的载体。下面看一下DatagramPacket的构造方?Q?
   DatagramPacketQbyte buf[],int lengthQ;
   DatagramPacket(byte buf[], int length, InetAddress addr, int port);
   DatagramPacket(byte[] buf, int offset, int length)Q?
   DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)Q?

  其中Qbuf中存放数据报数据Qlength为数据报中数据的长度Qaddr和port旨明目的地址Qoffset指明了数据报的位U量?

  在接收数据前Q应该采用上面的W一U方法生成一个DatagramPacket对象Q给出接收数据的~冲区及光度。然后调用DatagramSocket 的方法receive(){待数据报的到来Qreceive()一直等待,直到收到一个数据报为止?
  DatagramPacket packet=new DatagramPacket(buf, 256);
  Socket.receive (packet);

  发送数据前Q也要先生成一个新的DatagramPacket对象Q这时要使用上面的第二种构造方法,在给出存攑֏送数据的~冲区的同时Q还要给出完整的目的地址Q包括IP地址和端口号。发送数据是通过DatagramSocket的方法send()实现的,send()Ҏ数据报的目的地址来寻径,以传递数据报?
  DatagramPacket packet=new DatagramPacket(buf, length, address, port);
  Socket.send(packet)Q?

  在构造数据报Ӟ要给出InetAddresscd数。类InetAddress在包java.net中定义,用来表示一个Internet地址Q我们可以通过它提供的cL法getByNameQ)从一个表CZ机名的字W串获取该主机的IP地址Q然后再获取相应的地址信息?

  8.3.13 ZUDP的简单的Client/ServerE序设计

  有了上面的知识,我们可以来构g一个基于UDP的C/S |络传输模型

  1. 客户方程?QuoteClient.java

  import java.io.*;
  import java.net.*;
  import java.util.*;
  public class QuoteClient {
   public static void main(String[] args) throws IOException
   {
    if(args.length!=1) {
    //如果启动的时候没有给出Server的名字,那么出错退?
     System.out.println("Usage:java QuoteClient ");
     //打印出错信息
     return; //q回
    }

    DatagramSocket socket=new DatagramSocklet();
    //创徏数据报套接字

    Byte[] buf=new byte[256]; //创徏~冲?
    InetAddress address=InetAddress.getByName(args [0]);
  //由命令行l出的第一个参数默认ؓServer的名字,通过它得到Server的IP信息
    DatagramPacket packet=new DatagramPacket (buf, buf.length, address, 4445);
    //创徏DatagramPacket对象
    socket.send(packet); //发?
    packet=new DatagramPacket(buf,buf.length);
    //创徏新的DatagramPacket对象Q用来接收数据报
    socket.receive(packet); //接收
    String received=new String(packet.getData());
    //Ҏ接收到的字节数组生成相应的字W串
    System.out.println("Quote of the Moment:"+received );
    //打印生成的字W串

    socket.close(); //关闭套接?
   }
  }

  2. 服务?/font>方程?QuoteServer.java

  public class QuoteServer{
   public static void main(String args[]) throws java.io.IOException
   {
    new QuoteServerThread().start();
    //启动一个QuoteServerThreadU程
   }
  }

  3. E序QuoteServerThread.java

  import java.io.*;
  import java.net.*;
  import java.util.*;
  //服务器线E?
  public class QuoteServerThread extends Thread
  {
  protected DatagramSocket socket=null;
  //记录和本对象相关联的DatagramSocket对象
  protected BufferedReader in=null;
  //用来L件的一个Reader
  protected boolean moreQuotes=true;
  //标志变量Q是否l操?

  public QuoteServerThread() throws IOException {
  //无参数的构造函?
    this("QuoteServerThread");
    //以QuoteServerThread为默认D用带参数的构造函?
  }
  public QuoteServerThread(String name) throws IOException {
    super(name); //调用父类的构造函?
    socket=new DatagramSocket(4445);
    //在端?445创徏数据报套接字
    try{
      in= new BufferedReader(new FileReader(" one-liners.txt"));
      //打开一个文Ӟ构造相应的BufferReader对象
    }catch(FileNotFoundException e) { //异常处理
      System.err.println("Could not open quote file. Serving time instead.");
       //打印出错信息
    }
  }
  public void run() //U程M
  {
    while(moreQuotes) {
     try{
       byte[] buf=new byte[256]; //创徏~冲?
       DatagramPacket packet=new DatagramPacket(buf,buf.length);
       //q冲区构造DatagramPacket对象
       socket.receive(packet); //接收数据?
       String dString=null;
       if(in= =null) dString=new Date().toString();
       //如果初始化的时候打开文gp|了,
       //则用日期作传送的字符?
       else dString=getNextQuote();
       //否则调用成员函数从文件中d字符?
       buf=dString.getByte();
       //把String转换成字节数l,以便传?

       InetAddress address=packet.getAddress();
       //从Client端传来的Packet中得到Client地址
       int port=packet.getPort(); //和端口号
       packet=new DatagramPacket(buf,buf.length,address,port);
       //Ҏ客户端信息构建DatagramPacket
       socket.send(packet); //发送数据报
      }catch(IOException e) { //异常处理
       e.printStackTrace(); //打印错误?
       moreQuotes=false; //标志变量|falseQ以l束循环
      }
    }
    socket.close(); //关闭数据报套接字
  }

  protected String getNextQuotes(){
  //成员函数Q从文g中读数据
    String returnValue=null;
    try {
       if((returnValue=in.readLine())= =null) {
       //从文件中M行,如果d了文件尾
       in.close( ); //关闭输入?
       moreQuotes=false;
       //标志变量|falseQ以l束循环
       returnValue="No more quotes. Goodbye.";
       //|返回?
       } //否则q回字符串即Z文gd的字W串
    }catch(IOEception e) { //异常处理
       returnValue="IOException occurred in server";
       //|异常返回?
    }
    return returnValue; //q回字符?
  }
  }
可以看出使用UDP和用TCP在程序上q是有很大的区别的。一个比较明昄区别是,UDP的Socket~程是不提供监听功能的,也就是说通信双方更ؓq等Q面对的接口是完全一L。但是ؓ了用UDP实现C/Sl构Q在使用UDP时可以用DatagramSocket.receive()来实现类g监听的功能。因为receive()是阻塞的函数Q当它返回时Q缓冲区里已l填满了接受到的一个数据报Qƈ且可以从该数据报得到发送方的各U信息,q一点跟 accept()是很相象的,因而可以根据读入的数据报来军_下一步的动作Q这pC跟网l监听相似的效果?

  

  8.3.14 用数据报q行q播通讯

  DatagramSocket只允许数据报发送一个目的地址Qjava.net包中提供了一个类MulticastSocketQ允许数据报以广播方式发送到该端口的所有客戗MulticastSocket用在客户端,监听服务器广播来的数据?

  我们对上面的E序作一些修改,利用MulticastSocket实现q播通信。新E序完成的功能是使同时运行的多个客户E序能够接收到服务器发送来的相同的信息Q显C在各自的屏q上?

  1. 客户方程?MulticastClient.java

  import java.io.*;
  import java.net.*;
  import java.util.*;
  public class MulticastClient {
    public static void main(String args[]) throws IOException
    {
     MulticastSocket socket=new MulticastSocket(4446);
     //创徏4446端口的广播套接字
     InetAddress address=InetAddress.getByName("230.0.0.1");
     //得到230.0.0.1的地址信息
     socket.joinGroup(address);
     //使用joinGroup()广播套接字l定到地址?
     DatagramPacket packet;

     for(int i=0;i<5;i++) {
       byte[] buf=new byte[256];
       //创徏~冲?
       packet=new DatagramPacket(buf,buf.length);
       //创徏接收数据?
       socket.receive(packet); //接收
       String received=new String(packet.getData());
       //由接收到的数据报得到字节数组Q?
       //q由此构造一个String对象
       System.out.println("Quote of theMoment:"+received);
       //打印得到的字W串
     } //循环5?
     socket.leaveGroup(address);
     //把广播套接字从地址上解除绑?
     socket.close(); //关闭q播套接?
   }
  }

  2. 服务器方E序:MulticastServer.java

  public class MulticastServer{
    public static void main(String args[]) throws java.io.IOException
    {
      new MulticastServerThread().start();
      //启动一个服务器U程
    }
  }

  3. E序MulticastServerThread.java

  import java.io.*;
  import java.net.*;
  import java.util.*;
  public class MulticastServerThread extends QuoteServerThread
  //从QuoteServerThreadl承得到新的服务器线E类MulticastServerThread
  {
    Private long FIVE_SECOND=5000; //定义帔RQ?U钟
    public MulticastServerThread(String name) throws IOException
    {
      super("MulticastServerThread");
      //调用父类Q也是QuoteServerThread的构造函?
    }

    public void run() //重写父类的线E主?
    {
     while(moreQuotes) {
     //Ҏ标志变量判断是否l箋循环
      try{
        byte[] buf=new byte[256];
        //创徏~冲?
        String dString=null;
        if(in==null) dString=new Date().toString();
        //如果初始化的时候打开文gp|了,
        //则用日期作传送的字符?
        else dString=getNextQuote();
        //否则调用成员函数从文件中d字符?
        buf=dString.getByte();
        //把String转换成字节数l,以便传送send it
        InetAddress group=InetAddress.getByName("230.0.0.1");
        //得到230.0.0.1的地址信息
        DatagramPacket packet=new DatagramPacket(buf,buf.length,group,4446);
        //Ҏ~冲区,q播地址Q和端口号创建DatagramPacket对象
        socket.send(packet); //发送该Packet
        try{
          sleep((long)(Math.random()*FIVE_SECONDS));
          //随机{待一D|_0?U之?
        }catch(InterruptedException e) { } //异常处理
      }catch(IOException e){ //异常处理
        e.printStackTrace( ); //打印错误?

        moreQuotes=false; //|结束@环标?
      }
    }
    socket.close( ); //关闭q播套接?
   }
  }

  xQJava|络~程q一章已l讲解完毕。读者通过学习Q应该对|络~程有了一个清晰的认识Q可能对某些概念q不是十分的清楚Q还是需要更多的实践来进一步掌握。编E语a的学习不同于一般的学习Q及其强调实늚重要性。读者应该对URL|络~程QSocket中的TCPQUDP~程q行大量的练习才能更好的掌握本章中所提到的一些概念,才能真正学到Java|络~程的精髓!

  最后几个小节所丄例子Q读者务必要亲自试验一下,如果遇到问题Q想办法解决之。最好能Ҏ自己的意囑֊以改q。这h能更好的理解q几个程序,理解其中所包含的编E思想?

  ?/span>本讲结?

  本讲主要讲解了Java环境下的|络~程。因为TCP/IP协议是Java|络~程的基知识Q本讲开重点介l了TCP/IP协议中的一些概念, TCP/IP协议本n是一个十分庞大的pȝQ用几个节是不可能讲清楚的。所以我们只是联pd际,讲解了一些最基本的概念,帮助学生理解后面的相兛_宏V重Ҏ一下几个概念:L名,IPQ端口,服务cdQTCPQUDP?

  后箋的内容分Z大块Q一块是以URLZU,讲解如何通过URLcdURLConnectionc访问WWW|络资源Q由于用URL十分方便直观Q尽功能不是很强,q是值得推荐的一U网l编E方法,其是对于初学者特别容易接受。本质上ԌURL|络~程在传输层使用的还是TCP协议?

  另一块是以Socket接口和C/S|络~程模型ZU,依次讲解了如何用Java实现ZTCP的C/Sl构Q主要用到的cLSocketQServerSocket。以及如何用Java实现Z UDP的C/Sl构Q还讨论了一U特D的传输方式Q广播方式,q种方式是UDP所Ҏ的,主要用到的类有DatagramSocket , DatagramPacket, MulticastSocket。这一块在Java|络~程中相对而言是最隄Q尽Java在网l编E这斚w已经做的?ȝ"了,但是|络~程在其他环境下的却是一件极为头痛的事情Q再"ȝ"q是有一定的隑ֺQ,也是功能最为强大的一部分,读者应该好好研IӞ领悟其中的思想?

  最后要的是要学好Java|络~程QJava语言Q最重要的还是在于多多练习!


周游世界 2006-11-05 12:36 发表评论
]]>
JAVA教程 W八?Java|络~程(?http://www.tkk7.com/yanzhou/archive/2006/11/05/79180.html周游世界周游世界Sun, 05 Nov 2006 03:42:00 GMThttp://www.tkk7.com/yanzhou/archive/2006/11/05/79180.htmlhttp://www.tkk7.com/yanzhou/comments/79180.htmlhttp://www.tkk7.com/yanzhou/archive/2006/11/05/79180.html#Feedback0http://www.tkk7.com/yanzhou/comments/commentRss/79180.htmlhttp://www.tkk7.com/yanzhou/services/trackbacks/79180.html8.3 ZSocketQ套接字Q的低层ơJava|络~程

  8.3.1 Socket通讯

  |络上的两个E序通过一个双向的通讯q接实现数据的交换,q个双向链\的一端称Z个Socket。Socket通常用来实现客户方和服务方的q接。Socket是TCP/IP协议的一个十分流行的~程界面Q一个Socket׃个IP地址和一个端口号唯一定?

  在传l的UNIX环境下可以操作TCP/IP协议的接口不止Socket一个,Socket所支持的协议种cM不光TCP/IP一U,因此两者之间是没有必然联系的。在Java环境下,Socket~程主要是指ZTCP/IP协议的网l编E?

  说Socket~程是低层次|络~程q不{于它功能不强大Q恰恰相反,正因为层ơ低QSocket~程比基于URL的网l编E提供了更强大的功能和更灉|的控Ӟ但是却要更复杂一些。由于Java本n的特D性,Socket~程在Java中可能已l是层次最低的|络~程接口Q在Java中要直接操作协议中更低的层次Q需要用Java的本地方法调用(JNIQ,在这里就不予讨论了?

  8.3.2 Socket通讯的一般过

  前面已经提到Socket通常用来实现C/Sl构?

  使用Socketq行Client/ServerE序设计的一般连接过E是q样的:Server端Listen(监听)某个端口是否有连接请求, Client端向Server端发出Connect(q接)hQServer端向Client端发回AcceptQ接受)消息。一个连接就建立h了?Server端和Client端都可以通过SendQWrite{方法与Ҏ通信?

  对于一个功能齐全的SocketQ都要包含以下基本结构,其工作过E包含以下四个基本的步骤Q?
  Q?Q?创徏SocketQ?
  Q?Q?打开q接到Socket的输?出流Q?
  Q?Q?按照一定的协议对Socketq行?写操作;
  Q?Q?关闭Socket.

  W三步是E序员用来调用Socket和实现程序功能的关键步骤Q其他三步在各种E序中基本相同?

  以上4个步骤是针对TCP传输而言的,使用UDPq行传输时略有不同,在后面会有具体讲解?

  8.3.3 创徏Socket

  java在包java.net中提供了两个cSocket和ServerSocketQ分别用来表C双向连接的客户端和服务端。这是两个封装得非常好的c,使用很方ѝ其构造方法如下:
  Socket(InetAddress address, int port);
  Socket(InetAddress address, int port, boolean stream);
  Socket(String host, int prot);
  Socket(String host, int prot, boolean stream);
  Socket(SocketImpl impl)
  Socket(String host, int port, InetAddress localAddr, int localPort)
  Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
  ServerSocket(int port);
  ServerSocket(int port, int backlog);
  ServerSocket(int port, int backlog, InetAddress bindAddr)

  其中address、host和port分别是双向连接中另一方的IP地址、主机名和端口号Qstream指明socket是流socketq是数据?socketQlocalPort表示本地L的端口号QlocalAddr和bindAddr是本地机器的地址QServerSocket的主机地址Q,impl是socket的父c,既可以用来创建serverSocket又可以用来创建Socket。count则表C服务端所能支持的最大连接数。例如:
  Socket client = new Socket("127.0.01.", 80);
  ServerSocket server = new ServerSocket(80);

  注意Q在选择端口Ӟ必须心。每一个端口提供一U特定的服务Q只有给出正的端口Q才能获得相应的服务?~1023的端口号为系l所保留Q例?http服务的端口号?0,telnet服务的端口号?1,ftp服务的端口号?3, 所以我们在选择端口hQ最好选择一个大?023的数以防止发生冲H?

  在创建socket时如果发生错误,生IOExceptionQ在E序中必d之作出处理。所以在创徏Socket或ServerSocket是必Lh抛出例外?

  8.3.4 客户端的Socket

  下面是一个典型的创徏客户端Socket的过E?
   try{
     Socket socket=new Socket("127.0.0.1",4700);
     //127.0.0.1是TCP/IP协议中默认的本机地址
   }catch(IOException e){
     System.out.println("Error:"+e);
   }

  q是最单的在客L创徏一个Socket的一个小E序D,也是使用Socketq行|络通讯的第一步,E序相当单,在这里不作过多解释了。在后面的程序中会用到该程序段?


  8.3.5 服务?/font>端的ServerSocket

  下面是一个典型的创徏Server端ServerSocket的过E?
  ServerSocket server=null;
  try {
     server=new ServerSocket(4700);
     //创徏一个ServerSocket在端?700监听客户h
  }catch(IOException e){
     System.out.println("can not listen to :"+e);
  }
  Socket socket=null;
  try {
    socket=server.accept();
    //accept()是一个阻塞的ҎQ一旦有客户hQ它׃q回一个Socket对象用于同客戯行交?
  }catch(IOException e){
    System.out.println("Error:"+e);
  }

  以上的程序是Server的典型工作模式,只不q在q里Server只能接收一个请求,接受完后Server退Z。实际的应用中L让它不停的@环接Ӟ一旦有客户hQServerL会创Z个服务线E来服务新来的客P而自ql监听。程序中accept()是一个阻塞函敎ͼ所谓阻塞性方法就是说该方法被调用后,等待客LhQ直到有一个客户启动ƈhq接到相同的端口Q然后accept()q回一个对应于客户的socket。这Ӟ客户方和服务斚w建立了用于通信的socketQ接下来是由各个socket分别打开各自的输?输出?

  8.3.6 打开输入/出流

  cSocket提供了方法getInputStream ()和getOutStream()来得到对应的输入/输出以q行?写操作,q两个方法分别返回InputStream和OutputSteamcd象。ؓ了便于读/写数据,我们可以在返回的输入/输出对象上建立qo,如DataInputStream、DataOutputStream?PrintStreamcd象,对于文本方式对象,可以采用InputStreamReader和OutputStreamWriter?PrintWirter{处理?

  例如Q?
  PrintStream os=new PrintStream(new BufferedOutputStreem(socket.getOutputStream()));
  DataInputStream is=new DataInputStream(socket.getInputStream());
  PrintWriter out=new PrintWriter(socket.getOutStream(),true);
  BufferedReader in=new ButfferedReader(new InputSteramReader(Socket.getInputStream()));

  输入输出是|络~程的实质性部分,具体如何构造所需要的qo,要根据需要而定Q能否运用自如主要看读者对Java中输入输出部分掌握如何?

  8.3.7 关闭Socket

  每一个Socket存在Ӟ都将占用一定的资源Q在Socket对象使用完毕Ӟ要其关闭。关闭Socket可以调用Socket的CloseQ)Ҏ。在关闭Socket之前Q应与Socket相关的所有的输入/输出全部关闭,以释放所有的资源。而且要注意关闭的序Q与Socket相关的所有的输入/输出该首先关闭,然后再关闭Socket?
  os.close();
  is.close();
  socket.close();

  管Java有自动回收机Ӟ|络资源最l是会被释放的。但是ؓ了有效的利用资源Q徏议读者按照合理的序d释放资源?

  8.3.8 单的Client/ServerE序设计

  下面我们l出一个用Socket实现的客户和服务器交互的典型的C/Sl构的演C程序,读者通过仔细阅读该程序,会对前面所讨论的各个概忉|更深ȝ认识。程序的意义请参考注释?

  1. 客户端程?

  import java.io.*;
  import java.net.*;
  public class TalkClient {
    public static void main(String args[]) {
      try{
        Socket socket=new Socket("127.0.0.1",4700);
        //向本机的4700端口发出客户h
        BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
        //ql标准输入设备构造BufferedReader对象
        PrintWriter os=new PrintWriter(socket.getOutputStream());
        //由Socket对象得到输出,q构造PrintWriter对象
        BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        //由Socket对象得到输入,q构造相应的BufferedReader对象
        String readline;
        readline=sin.readLine(); //从系l标准输入读入一字符?
        while(!readline.equals("bye")){
        //若从标准输入d的字W串?"bye"则停止@?
          os.println(readline);
          //从pȝ标准输入d的字W串输出到Server
          os.flush();
          //h输出,使Server马上收到该字W串
          System.out.println("Client:"+readline);
          //在系l标准输Z打印d的字W串
          System.out.println("Server:"+is.readLine());
          //从Serverd一字符Ԍq打印到标准输出?
          readline=sin.readLine(); //从系l标准输入读入一字符?
        } //l箋循环
        os.close(); //关闭Socket输出?
        is.close(); //关闭Socket输入?
        socket.close(); //关闭Socket
      }catch(Exception e) {
        System.out.println("Error"+e); //出错Q则打印出错信息
      }
  }
  } 2. 服务器端E序

  import java.io.*;
  import java.net.*;
  import java.applet.Applet;
  public class TalkServer{
    public static void main(String args[]) {
      try{
        ServerSocket server=null;
        try{
          server=new ServerSocket(4700);
        //创徏一个ServerSocket在端?700监听客户h
        }catch(Exception e) {
          System.out.println("can not listen to:"+e);
        //出错Q打印出错信?
        }

        Socket socket=null;
        try{
          socket=server.accept();
          //使用accept()d{待客户hQ有客户
          //h到来则生一个Socket对象Qƈl箋执行
        }catch(Exception e) {
          System.out.println("Error."+e);
          //出错Q打印出错信?
        }
        String line;
        BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
         //由Socket对象得到输入,q构造相应的BufferedReader对象
        PrintWriter os=newPrintWriter(socket.getOutputStream());
         //由Socket对象得到输出,q构造PrintWriter对象
        BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
         //ql标准输入设备构造BufferedReader对象

        System.out.println("Client:"+is.readLine());
        //在标准输Z打印从客Ld的字W串
        line=sin.readLine();
        //从标准输入读入一字符?
        while(!line.equals("bye")){
        //如果该字W串?"bye"Q则停止循环
          os.println(line);
          //向客L输出该字W串
          os.flush();
          //h输出,使Client马上收到该字W串
          System.out.println("Server:"+line);
          //在系l标准输Z打印d的字W串
          System.out.println("Client:"+is.readLine());
          //从Clientd一字符Ԍq打印到标准输出?
          line=sin.readLine();
          //从系l标准输入读入一字符?
        }  //l箋循环
        os.close(); //关闭Socket输出?
        is.close(); //关闭Socket输入?
        socket.close(); //关闭Socket
        server.close(); //关闭ServerSocket
      }catch(Exception e){
        System.out.println("Error:"+e);
        //出错Q打印出错信?
      }
    }
  }

  从上面的两个E序中我们可以看刎ͼsocket四个步骤的用过E。读者可以分别将Socket使用的四个步骤的对应E序D选择出来Q这样便于读者对socket的用有q一步的了解?

  读者可以在单机上试验该E序Q最好是能在真正的网l环境下试验该程序,q样更容易分辨输出的内容和客hQ服务器的对应关pR同时也可以修改该程序,提供更ؓ强大的功能,或更加满者的意图?

  

  8.3.9 支持多客Lclient/serverE序设计

  前面提供的Client/ServerE序只能实现Server和一个客L对话。在实际应用中,往往是在服务器上q行一个永久的E序Q它可以接收来自其他多个客户端的hQ提供相应的服务。ؓ了实现在服务器方l多个客h供服务的功能Q需要对上面的程序进行改造,利用多线E实现多客户机制。服务器L在指定的端口上监听是否有客户hQ一旦监听到客户hQ服务器׃启动一个专门的服务U程来响应该客户的请求,而服务器本n在启动完U程之后马上又进入监听状态,{待下一个客L到来?

  客户端的E序和上面程序是完全一LQ读者如果仔l阅读过上面的程序,可以跌不读Q把主要_֊集中在Server端的E序上?

  2. 服务器端E序: MultiTalkServer.java

  import java.io.*;
  import java.net.*;
  import ServerThread;
  public class MultiTalkServer{
   static int clientnum=0; //静态成员变量,记录当前客户的个?
   public static void main(String args[]) throws IOException {
    ServerSocket serverSocket=null;
    boolean listening=true;
    try{
      serverSocket=new ServerSocket(4700);
      //创徏一个ServerSocket在端?700监听客户h
    }catch(IOException e) {
      System.out.println("Could not listen on port:4700.");
      //出错Q打印出错信?
      System.exit(-1); //退?
    }
    while(listening){ //永远循环监听
      new ServerThread(serverSocket.accept(),clientnum).start();
      //监听到客戯求,Ҏ得到的Socket对象?
       客户计数创徏服务U程Qƈ启动?
      clientnum++; //增加客户计数
    }
    serverSocket.close(); //关闭ServerSocket
  }
  }

  3. E序ServerThread.java

  import java.io.*;
  import java.net.*;
  public class ServerThread extends Thread{
   Socket socket=null; //保存与本U程相关的Socket对象
   int clientnum; //保存本进E的客户计数
   public ServerThread(Socket socket,int num) { //构造函?
    this.socket=socket; //初始化socket变量
    clientnum=num+1; //初始化clientnum变量
   }
   public void run() { //U程M
    try{
      String line;
      BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
  //由Socket对象得到输入,q构造相应的BufferedReader对象
      PrintWriter os=newPrintWriter(socket.getOutputStream());
      //由Socket对象得到输出,q构造PrintWriter对象
      BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
      //ql标准输入设备构造BufferedReader对象
      System.out.println("Client:"+ clientnum +is.readLine());
      //在标准输Z打印从客Ld的字W串
      line=sin.readLine();
      //从标准输入读入一字符?
      while(!line.equals("bye")){
      //如果该字W串?"bye"Q则停止循环
        os.println(line);
        //向客L输出该字W串
        os.flush();
        //h输出,使Client马上收到该字W串
        System.out.println("Server:"+line);
        //在系l标准输Z打印该字W串
        System.out.println("Client:"+ clientnum +is.readLine());
        //从Clientd一字符Ԍq打印到标准输出?
        line=sin.readLine();
        //从系l标准输入读入一字符?
      } //l箋循环
      os.close(); //关闭Socket输出?
      is.close(); //关闭Socket输入?
      socket.close(); //关闭Socket
      server.close(); //关闭ServerSocket
     }catch(Exception e){
      System.out.println("Error:"+e);
      //出错Q打印出错信?
     }
   }
  }

  通过以上的学习,读者应该对Java的面向流的网l编E有了一个比较全面的认识Q这些都是基于TCP的应用,后面我们介l基于UDP的Socket~程

周游世界 2006-11-05 11:42 发表评论
]]>
PPP介绍http://www.tkk7.com/yanzhou/archive/2006/10/12/PPP?????.html周游世界周游世界Thu, 12 Oct 2006 06:16:00 GMThttp://www.tkk7.com/yanzhou/archive/2006/10/12/PPP?????.htmlhttp://www.tkk7.com/yanzhou/comments/74780.htmlhttp://www.tkk7.com/yanzhou/archive/2006/10/12/PPP?????.html#Feedback0http://www.tkk7.com/yanzhou/comments/commentRss/74780.htmlhttp://www.tkk7.com/yanzhou/services/trackbacks/74780.html一、介l?/b>

PPPQPoint-to-Point Protocol点到点协议)是ؓ在同{单元之间传输数据包q样的简单链路设计的链\层协议。这U链路提供全双工操作Qƈ按照序传递数据包。设计目的主 要是用来通过拨号或专U方式徏立点对点q接发送数据,使其成ؓ各种L、网桥和路由器之间简单连接的一U共通的解决Ҏ?

二、PPP链\建立q程

PPP协议中提供了一整套Ҏ来解决链路徏立、维护、拆除、上层协议协商、认证等问题。PPP协议包含q样几个部分Q?br />
    链\控制协议LCPQLink Control ProtocolQ?br />     |络控制协议NCPQNetwork Control ProtocolQ?br />     认证协议
   
LCP负责创徏Q维护或l止一ơ物理连接。NCP是一族协议,负责解决物理q接上运行什么网l协议,以及解决上层|络协议发生的问题? 最常用的认证协议包括口令验证协议PAPQPassword Authentication ProtocolQ和挑战握手验证协议CHAPQChallenge-Handshake Authentication ProtocolQ?br />
下面介绍PPP链\建立的过E:

PPP链\状态机如图1所C?

一个典型的链\建立q程分ؓ三个阶段Q创建阶Dc认证阶D和|络协商阶段?br />

阶段1Q创建PPP链\

LCP负责创徏链\。在q个阶段Q将对基本的通讯方式q行选择。链路两端设备通过LCP向对方发送配|信息报文(Configure PacketsQ。一旦一个配|成功信息包QConfigure-Ack packetQ被发送且被接Ӟ完成了交换Q进入了LCP开启状态?

应当注意Q在链\创徏阶段Q只是对验证协议q行选择Q用户验证将在第2阶段实现?

阶段2Q用户验?

在这个阶D,客户端会自qw䆾发送给q端的接入服务器。该阶段使用一U安全验证方式避免第三方H取数据或冒充远E客h与客户端的q接。在认证完成之前Q禁止从认证阶段前进到网l层协议阶段。如果认证失败,认证者应该跃q到链\l止阶段?

在这一阶段里,只有链\控制协议、认证协议,和链路质量监视协议的packets是被允许的。在该阶D里接收到的其他的packets必须被静静的丢弃?

最常用的认证协议有口o验证协议QPAPQ和挑战握手验证协议QCHAPQ?认证方式介绍在第三部分中介绍?

阶段3
Q调用网l层协议

认证阶段完成之后QPPP调用在链\创徏阶段Q阶D?Q选定的各U网l控制协议(NCPQ。选定的NCP解决PPP链\之上的高层协议问题,例如Q在该阶DIP控制协议QIPCPQ可以向拨入用户分配动态地址?

q样Q经q三个阶D以后,一条完整的PPP链\徏立v来了?

三?认证方式

1Q口令验证协议(PAPQ?

PAP是一U简单的明文验证方式。NASQ网l接入服务器QNetwork Access ServerQ要求用h供用户名和口令,PAP以明文方式返回用户信息。很明显Q这U验证方式的安全性较差,W三方可以很Ҏ的获取被传送的用户名和? 令,q利用这些信息与NAS建立q接获取NAS提供的所有资源。所以,一旦用户密码被W三方窃取,PAP无法提供避免受到W三Ҏȝ保障措施?

2Q挑?握手验证协议QCHAPQ?

CHAP是一U加密的验证方式Q能够避免徏立连接时传送用L真实密码。NAS向远E用户发送一个挑战口令(challengeQ,其中包括会话ID和一 个Q意生成的挑战字串Qarbitrary challengestringQ。远E客户必M用MD5单向哈希法Qone-way hashing algorithmQ返回用户名和加密的挑战口oQ会话ID以及用户口oQ其中用户名以非哈希方式发送?

CHAP对PAPq行了改q,不再直接通过链\发送明文口令,而是使用挑战口o以哈希算法对口oq行加密。因为服务器端存有客L明文口oQ所以服务器? 以重复客Lq行的操作,q将l果与用戯回的口oq行对照。CHAP为每一ơ验证Q意生成一个挑战字串来防止受到再现dQreplay attackQ。在整个q接q程中,CHAP不定时的向客户端重复发送挑战口令,从而避免第3方冒充远E客Premote client impersonationQ进行攻凅R?

四、PPP协议的应?

PPP协议是目前广域网上应用最q泛的协议之一Q它的优点在于简单、具备用户验证能力、可以解决IP分配{?

家庭拨号上网是通过PPP在用L和运营商的接入服务器之间建立通信链\? 目前Q宽带接入正在成为取代拨号上|的势Q在宽带接入技术日新月异的今天QPPP也衍生出新的应用。典型的应用是在ADSLQ非对称数据用户环线Q? Asymmetrical Digital Subscriber LoopQ接入方式当中,PPP与其他的协议共同zZW合宽带接入要求的新的协议,如PPPoEQPPP over EthernetQ,PPPoAQPPP over ATMQ?

利用以太|(EthernetQ资源,在以太网上运行PPP来进行用戯证接入的方式UCؓPPPoE。PPPoE即保护了用户方的以太|资源,又完成了ADSL的接入要求,是目前ADSL接入方式中应用最q泛的技术标准?

同样Q在ATMQ异步传输模式,Asynchronous Transfer ModeQ网l上q行PPP协议来管理用戯证的方式UCؓPPPoA。它与PPPoE的原理相同,作用相同Q不同的是它是在ATM|络上,而PPPoE? 在以太网|络上运行,所以要分别适应ATM标准和以太网标准?

PPP协议的简单完整它得Cq泛的应用,怿在未来的|络技术发展中Q它q可以发挥更大的作用?img src ="http://www.tkk7.com/yanzhou/aggbug/74780.html" width = "1" height = "1" />

周游世界 2006-10-12 14:16 发表评论
]]>
վ֩ģ壺 ޸ŮBBW| ޴˽| Ůһ18| 91Ƶ| Ļ߹ۿƵ| ߹ۿHַ| 㽶þһ| վѹۿ| ŷպ| ٺٺƵվ߹ۿ| ޹Ů߹ۿ| ˾ƷƵ| ˾Ʒձרһ| AVƬ߹ۿ| AVһӰ| ׾Ʒר| һaƬɫëƬվ | һѹۿƵ | þav뾫Ʒ˳| 2019Ļ| Ƶ߲| Ļȫ| С豻| ۺ޹һҳ| ߿Ƶվ| ޳aƬ߹ۿ| ŮƵ77777 | ѻɫƵ| ޳aƬ2023| ZZIJZZIJձٸJIZJIZ| Ļձ޾þþ| ˳Ƭ߹ۿ| ŷղһëƬ| 19žžڵվ| ձVAĻþõ| һ| ۺƵ| þùһƬѹۿ| | ձ߹ۿƵ| þþþþþƵ|