网络通讯

网络通讯三要素:

IP地址:InetAddress

  网络中设备的标识,不易记忆,可用主机名,目前IPV4是32位,已经耗尽,IPV6是128位

  公网地址,可以直接用Internet访问,内网地址,就是局域网

端口号:

  用于标识进程的逻辑地址,不同进程的标识

传输协议

  通讯规制,常见协议:

  TCP,三次握手完成连接,是可靠协议,效率底点,安全高

  UDP,对数据打包,封装,不需要建立连接,只负责发送,每个数据包在64K内,效率高,但是不安全

  

InetAddress类——代表ip地址

静态方法:

getAddress——返回原始ip地址

getAllByName(String host(主机名)) ——获取IP地址组成的数组

getByName(String host/ip地址)——获取IP地址对象

getLocalHost——获取本地主机名

对象方法:

getHostAddress——获取主机ip地址

getHostName——获取主机名

使用UDP协议发送数据

  创建发送端Socket对象

    DatagramSocket()——随意分配端口号

    DatagramSocket(int port)——确定端口号

    DatagramSocket ds = new DatagramSocket();

  创建数据并打包

    DatagramPacket——表示数据包

    String s = "hello";

    byte[] bys = s.getBytes();

    int length = bys.length;

    InetAddress address = InetAddress.getByName("主机名");

    int port = 8888;     

    DatagramPacket dp = new DatagramPacket(bys ,length,address,port);

  发送数据

    ds.send(dp);

  释放资源

    ds.close();

使用UDP协议接受数据

  创建接受端Socket对象

  DatagramSocket ds = new DatagramSocket(8888) ;需要指定接受端的端口

  接受数据包

  byte[] bys = new byte[1024];

  DatagramPacket dp = new DatagramPacket(bys,bys.length);

  ds.receive(dp);//阻塞——等着数据过来

  解析数据包

  InetAddress address = dp.getAddress();

  byte[] data =dp.getData();

  int length = dp.getLength();

  sysout(address.getHostAddress());

  sysout(new String(data,0,length));——收到多少数据就接受多少

  释放资源

   dp.close();

使用UDP协议收发数据注意事项:

  端口号错误,数据可以正常发出,不会出现异常,但是收不到数据

  Address already in user:Cannot bind——端口号被占用

使用TCP协议发送数据:

  //创建发送端Socket对象(创建连接:ip,端口)

  Socket s =  new Socket(InetAddress.getByName("主机名"),端口号);

  //获取输出流对象

  OutputStream os = s.getOutpuStream();

  //发送数据

  String str = "hello";

  os.write(str.getBytes());

  //释放资源

  s.close();

使用TCP协议接受数据

  //创建接受端Socket对象(创建连接:ip,端口)

  ServerSocket ss = new ServerSocket(端口号);

  //监听(阻塞)

  Socket s = ss.accept();

  //获取输入流对象

  InputStream is = s.getInputStream();

  //获取数据

  byte[] bys = new byte[1024];

  int len = is.read(bys);

  //输出数据

  sysout("client-->"+s.getInetAddress().getHostName());//输出发送过来的主机名 

  sysout(new String(bys,0,len));

  //释放资源

  s.close();

Connection refused:connect——连接失败,被拒绝了

猜你喜欢

转载自www.cnblogs.com/dajingshao/p/11993393.html