Java中的Socket编程

来源:互联网 发布:搬家公司软件 编辑:程序博客网 时间:2024/06/05 02:25

 

 

UDP数据报连接:

 

 

DatagramSocket:

  为UDP协议封装的类,创建一个DatagramSocket对象即建立一个套接字描述符,该套接字使用UDP协议即SOCK_DGRAM。构造函数可以指定绑定的本机端口,也可以指定绑定的本机IP,也可以通过Java封装的Socket地址对象SocketAddress创建新的实例。接收端如果在创建时不指定IP那么默认绑定本机所有ip,但必需指定一个port。发送端如果不指定port那么将由系统随机分配。

 

  此类对象提供了网络套接字必要的 bind,close,connect,receive,send等方法。


DatagramPacket:

  Java提供的套接字中receive与send功能不是直接操作于字节数组的,而是通过DatagramPacket对象对发送和接收到的数据包做处理。

  DatagramPacket类对象可以看做是Java内置的封包类。可以通过构造DatagramPacket对象,将byte数组封包成一个将要发送的对象,并且在封装的同时指定该数据的长度,发送方的ip与port。接收的网络数据包也是以DatagramPacket对象的形式被提取的,

 

  通过getSocketAddress,getAddress,getPort,getData,getLength一组get方法获取接收到包来源与内容。


  通过setSocketAddress,setAddress,setPort,setData,setlength一组set方法设置发送包的去向与内容。

 

  由于DatagramPacket类已将收发的数据包过滤,基本上杜绝了因网络故障产生的断包问题,所以Java中使用套接字完全避免了繁琐的拼包拆包过程,完全不用担心数据包的完整性,只需要在拆封DatagramPacket对象时对原byte数据做合法性校验即可。


  至于DatagramPacket对数据包做了怎样的包装处理待以后有时间研究一下。

 

 

TCP数据流连接:

  Java将TCP协议的server与clinet分别封装了,(真是能封的都封了,它就不考虑下那蛋疼的资源消耗吗?)。


  ServerSocket专门用来创建server,Socket用于创建clinet。做过网络应用程序开发的朋友都知道,其实server与clinet的区别也就是前者多了一个侦听功能accept(),有必要封装两个类吗。

 

  大眼瞄一下都有些什么功能吧。

 

  Socket在构造的时候可以直接指定连接的服务器ip与port,参数backlog还可以指定最大连接数(是同时建立的socket连接数还是侦听队列的连接数这个因为机器性能原因没办法测试,但根据winAPI的经验来看这个是指的侦听队列)并且可以指定绑定的本机ip与port。如果在构造时使用空参数的构造方法,那么后续可以通过connect方法连接一个服务器,该方法还额外提供了连接超时值的功能。

 


  啊!,我彻底被打败了,在Socket里没有发现,send与rece方法。而看到了getOutputStream与getInputStream。这意味着什么啊。不要太傻瓜式了好吧。

 

  我该说什么好呢?好吧。什么封包拆包拼包断包的在Java看来都是浮云。来看看Java的TCP建立方式,cilnet三步搞定,server四步完成。


 

//创建服务端socket。serverSocket srvSock = new serverSocket(12580);//侦听连接请求,阻塞函数。Socket Sock = srvSock.accept();//创建客户端socket同时连接指定的ip与port。Socket Sock = new Socket("127.0.0.1", 12580); //获取Socket对应的输出流,使用os.write(buf)方法写入数据 OutputStream os = Sock.getOutputStream();//获取Socket对应的输入流,使用is.read(buf)方法读取数据,read为阻塞函数InputStream is = Sock.getInputStream();


 


InetAddress:

  Java专门为IP地址做的封装类,即该类的一个对象,代表一个实际的IP地址。该类无法直接new出对象,但可以通过提供的一组静态函数获取该类的对象。

//通过指定的域名获取该域名下所有的IP地址,并封装成InetAddress对象返回,很牛吧。public static InetAddress[] getAllByName(String host)//使用指定的IP获取InetAddress对象,注意IP端大于127会被转成负数,看着好别扭。public static InetAddress getByAddress(byte[] addr)//通过域名获取,参数也可以为一个IP地址的字符串表现形式。public static InetAddress getByName(String host)//还能返回本机的public static InetAddress getLocalHost()


 
InetSocketAddress:

  InetSocketAddress是SocketAddress抽象类的子类,该类为Java语法提供了专门服务于网络连接信息的数据结构。有点像C中的sockaddr_in结构体。但内容就没那么复杂了,仅仅只是一个ip与port的组合。

原创粉丝点击