互联网协议以及发送端和接收端程序示例

InetAddress:类表示互联网协议 (IP) 地址
 如果一个类中没有构造方法,没有字段,只有成员方法?有什么特征
 1)应该有一些静态功能(Math类,Arrays,Collections...)
 2)可能符合一种单例模式(饿汉/懒汉)
 3)该类中的某些静态成员方法的返回值是该类本身

  举例
  public class Demo{
 
  public static Demo getDemo(){
  new Demo() ;
  }
  }
 常用方法:
 public static InetAddress getByName(String host)
        throws UnknownHostException在给定主机名的情况下确定主机的 IP 地址。
        参数:

        主机名可以是机器名(如 "java.sun.com"),也可以是其 IP 地址的文本表示形式

实例程序:public class InetAddRessDemo {
public static void main(String[] args) throws UnknownHostException {

//创建InetAddress对象,通过来获取ip地址
//在知道主机名的情况下
//InetAddress address = InetAddress.getByName("USER-20171205ZR") ;
//IP 地址的文本表示形式
//Ip地址对象
InetAddress address = InetAddress.getByName("192.168.10.1") ;

//上面获取到了Ip地址
//public String getHostAddress()返回 IP 地址字符串(以文本表现形式)。 
String ip = address.getHostAddress() ;
System.out.println(ip);//192.168.10.1
// public String getHostName()获取此 IP 地址的主机名。
String name = address.getHostName() ;
System.out.println(name);
}

}

package org.westos_06;


import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;



 Udp编程的接收端 开发步骤:
  1)创建Socket对象
  2)创建一个数据报包(接收容器) 
  3)调用Socket对象中的接收的方法
  4)解析实际传递的数据
  5)将解析的数据(ip,数据)展示在控制台上
  6)关闭资源
 注意:接收端不要运行多次,会出现异常:
  java.net.BindException: Address already in use: Cannot bind
 示例程序:
                public class ReceiveDemo {
        public static void main(String[] args) throws IOException {

//1)创建Socket对象
// public DatagramSocket(int port)创建数据报包套接字对象并且将其绑定到本地主机上的指定端口
DatagramSocket ds = new DatagramSocket(10086);

//2)创建一个数据报包(接收容器) 
//public DatagramPacket(byte[] buf, int length)
byte[] bys = new byte[1024] ;
int len = bys.length ;
DatagramPacket dp = new DatagramPacket(bys, len) ;

//3)调用Socket对象中的接收的方法
// public void receive(DatagramPacket p):接收数据报包
ds.receive(dp);//阻塞式方法

//获取ip地址文本形式
// public InetAddress getAddress() :返回ip地址对象  数据报包类:DataGramPacket
InetAddress address = dp.getAddress() ;
String ip = address.getHostAddress() ;
//4)解析实际传递的数据
//public byte[] getData() :获取缓冲中实际数据(从接收容器中获取)
byte[] bys2  = dp.getData() ;

//public int getLength()返回将要发送或接收到的数据的长度。
int len2 = dp.getLength() ;//从接收容器中获取包的实际长度

String data = new String(bys2, 0, len2) ;

System.out.println("当前接收到的数据是:"+data+",来自于"+ip);

//6)关闭资源
ds.close();

}}

Udp编程
  1)不需要建立连接通道
  2)数据大小有限制
  3)不可靠连接---->传输速度快!
 
 发送端的开发步骤:
  1)创建发送端的Socket对象
   2)创建数据,并打包
   3)调用当前发送端Socket对象中的发送的方法
   4)关闭资源
 *public static void main(String[] args) throws IOException {
///1)创建发送端的Socket对象
//DatagramSocket:此类表示用来发送和接收数据报包的套接字。
//创建DataGramSocket对象
//构造方法
//public DatagramSocket(int port,InetAddress laddr)
//这个构造方法,里面传递并不是Ip地址的文本形式
//构造数据报套接字并将其绑定到本地主机上任何可用的端口
DatagramSocket ds = new DatagramSocket() ;

  // 2)创建数据,并打包
//DatagramPacket 数据报包
//DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
/**
* buf - 包数据。
offset - 包数据偏移量。
length - 包数据长度。
address - 目的地址。
port - 目的端口号。
*/
//有数据
byte[] bys = "hello,udp,我来了".getBytes() ;
//获取包数据长度
int len = bys.length ;
//获取ip地址对象
InetAddress address = InetAddress.getByName("192.168.10.1") ;
//指定端口号
int port = 10086 ;
DatagramPacket dp =new DatagramPacket(bys, 0, len, address, port) ;
  // 3)调用当前发送端Socket对象中的发送的方法
/*public void send(DatagramPacket p)
         throws IOException从此套接字发送数据报包*/
ds.send(dp);
  // 4)关闭资源*
ds.close();
}
}

猜你喜欢

转载自blog.csdn.net/qq_41141896/article/details/80503471