当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:13:00  来源:本站整理

Java网络编程从入门到精通(18):Socket类的getter和setter办法[Java编程]

赞助商链接



  本文“Java网络编程从入门到精通(18):Socket类的getter和setter办法[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

2、用于得到和设置Socket选项的getter和setter办法

Socket挑选可以指定Socket类发送和承受数据的方法.在JDK1.4中共有8个Socket挑选可以设置.这8个选项都定义在java.net.SocketOptions接口中.定义以下:

public final static int TCP_NODELAY = 0x0001;

public final static int SO_REUSEADDR = 0x04;

public final static int SO_LINGER = 0x0080;

public final static int SO_TIMEOUT = 0x1006;

public final static int SO_SNDBUF = 0x1001;

public final static int SO_RCVBUF = 0x1002;

public final static int SO_KEEPALIVE = 0x0008;

public final static int SO_OOBINLINE = 0x1003;

风趣的是,这8个选项除了第一个没在SO前缀外,其他7个选项都以SO作为前缀.其实这个SO就是Socket Option的缩写;因此,在Java中约定全部以SO为前缀的常量都表示Socket选项;当然,也有例外,如TCP_NODELAY.在Socket类中为每一个选项供应了一对get和set办法,辨别用来得到和设置这些选项.

1.TCP_NODELAY

public boolean getTcpNoDelay() throws SocketException

public void setTcpNoDelay(boolean on) throws SocketException

在默许情形下,客户端向服务器发送数据时,会按照数据包的大小决意能否当即发送.当数据包中的数据很少时,如只有1个字节,而数据包的头却有几十个字节(IP头+TCP头)时,系统会在发送之前先将较小的包归并到软大的包后,一同将数据发送出去.在发送下一个数据包时,系统会等候服务器对前一个数据包的呼应,当收到服务器的呼应后,再发送下一个数据包,这就是所谓的Nagle算法;在默许情形下,Nagle算法是开启的.

这种算法固然可以有效地改进网络传输的效率,但关于网络速度对比慢,并且对实现性的要求对比高的情形下(如游戏、Telnet等),利用这种方法传输数据会使得客户端有明显的停顿现象.因此,最好的办理筹划就是需求Nagle算法时就利用它,不需求时就关闭它.而利用setTcpToDelay恰好可以满意这个需求.当利用setTcpNoDelay(true)将Nagle算法关闭后,客户端每发送一次数据,无论数据包的大小城市将这些数据发送出去.

2.SO_REUSEADDR

public boolean getReuseAddress() throws SocketException

public void setReuseAddress(boolean on) throws SocketException

通过这个选项,可以使多个Socket对象绑定在同一个端口上.其实这样做并没有多粗心义,但当利用close办法关闭Socket衔接后,Socket对象所绑定的端口并不一定即刻释放;系统有时在Socket衔接关闭才会再确认一下能否有因为耽误面未到达的数据包,这美满是在底层处理的,也就是说对用户是透明的;因此,在利用Socket类时完好不会感遭到.

这种处理机制关于随机绑定端口的Socket对象没有什么影响,但关于绑定在固定端口的Socket对象便大概会抛出“Address already in use: JVM_Bind”例外.因此,利用这个选项可以避免个例外的发生.

package mynet;

import java.net.*;
import java.io.*;

public class Test
{
     public static void main(String[] args)
     {
         Socket socket1 = new Socket();
         Socket socket2 = new Socket();
         try
         {
             socket1.setReuseAddress(true);
             socket1.bind(new InetSocketAddress("127.0.0.1", 88));
             System.out.println("socket1.getReuseAddress():"
                     + socket1.getReuseAddress());
             socket2.bind(new InetSocketAddress("127.0.0.1", 88));
         }
         catch (Exception e)
         {
             System.out.println("error:" + e.getMessage());
             try
             {
                 socket2.setReuseAddress(true);
                 socket2.bind(new InetSocketAddress("127.0.0.1", 88));
                 System.out.println("socket2.getReuseAddress():"
                         + socket2.getReuseAddress());
                 System.out.println("端口88第二次绑定成功!");
             }
             catch (Exception e1)
             {
                 System.out.println(e.getMessage());
             }
         }
     }
}


  以上是“Java网络编程从入门到精通(18):Socket类的getter和setter办法[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • 利用Javascript实现网页水印(非图片水印)
  • Java开辟环境的搭建
  • Ubuntu java安装与配置
  • 办理Ubuntu 10.04 Firefox3.6 Java浏览器插件不工作的问
  • Ubuntu重装后Java环境的设置
  • Sun Java进入Ubuntu 10.10软件中央
  • Ubuntu 10.10配置Java开辟环境
  • 在Ubuntu 10.10中配置Java环境变量的办法
  • Ubuntu下Java环境的搭建
  • Ubuntu 10.04 下安装 Java, JRE
  • Ubuntu 10.04下的搭建SUN JAVA开辟环境
  • Ubuntu 12.04安装java7
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .