热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

javaipv4转ipv6_小姐姐也可以看得懂的Java网络编程

网络编程从大的方面说就是对信息的发送与接收(如,打电话,发信息),中间传输为物理线路的作用。网络编程最主要的工作就是在发送端把信息通过规定

网络编程从大的方面说就是对信息的发送与接收(如,打电话,发信息),中间传输为物理线路的作用。

网络编程最主要的工作就是在发送端把信息通过规定好的协议进行打包发送,在接收端按照规定好的协议把包进行解析,从而得到发送端的信息,以此达到通信的目的。中间最主要的就是数据包的组装,数据包的过滤,数据包的捕获,数据包的分析等。

1.什么是 TCP/ IP

IP 地址分类:

  • IPV4: 127.0.0.1,实际上是把32位整数按8位分组后的数字表示,站4个字节组成,目的是便于阅读。每一个字节0-255,总共42亿,而其中30亿在北美,亚洲却只有4亿。在2011年就已经用尽。
  • IPV6: IPv6地址实际上是一个128位整数,它是目前使用的IPv4的升级版,2408:84f7:93:61f1:850a:ea26:e895:f314 ,并由8个无符号整数组成。

TCP 协议则是建立在 IP 协议之上的。TCP 协议负责在两台计算机之间建立可靠连接,保证数据包按顺序到达。TCP 协议会通过三次握手建立连接,然后,对每个 IP 包编号,确保对方按顺序收到,如果包丢掉了,就自动重发。

TCP 协议传输的数据包里不仅有要发送的信息,还包含了原 IP 地址和目标 IP 地址,原端口和目标端口。

网络编程中许多常用的更高级的协议都是建立在 TCP 协议基础上的,如用于浏览器的 HTTP 协议、发送邮件的 SMTP 协议等。

InetAddress 类:

InetAddress 是 ip 地址的 java 表示方式。这个类的实例也可以用在UDP DatagramSockets、普通 Socket 类和 ServerSocket 类,并且InetAddress 类提供许多其他的方法以供使用。

InetAddress 类中没有构造方法,不可以 new 对象,只能通过类名点去调用。

  • getByName( String host ) 获取与 Host 相对应的 InetAddress 对象
  • getHostAddress() 获取 InetAdress 对象所包含的IP地址
  • getHostName() 获取此 IP 地址的主机名
  • getLocalHost() 返回本地主机的 InetAddress 对象

getHostName()getHostAddress() 方法获得本地主机的本机名,ip 地址:

import java.net.InetAddress;import java.net.UnknownHostException;//InetAddress是一个静态类,调用相应的方法类名点public class TestInetAddress { public static void main(String[] args) { InetAddress ip; try { ip=InetAddress.getLocalHost(); String localname=ip.getHostName(); String locaip=ip.getHostAddress(); System.out.println("本机名:"+localname); System.out.println("本机ip:"+locaip); }catch(UnknownHostException e) { e.printStackTrace(); } }}

2.端口

端口表示计算机上的一个程序的进程:

  • 不同的进程有不同的端口号,主要是为了区分软件。故端口号不能重复。
  • 一台电脑可有 0-65535 不同的端口,也就是说一台电脑可以跑 65535 个程序。
  • 不同的协议可以用相同的端口。如 tcp 使用 80 端口,udp 也可使用 80 端口。( tcp:80,udp:80 )

端口分类:

  • 公有端口:0-1023
  • 程序注册端口:1024-49151
  • 动态、私有:49152-65535

Windows 系统下可以通过以下命令查看端口和进程:

$ netstat -ano #查看所有的端口$ netstat -ano|findstr "1056" #查询具体的端口$ tasklist|findstr "8696" #查看指定端口的进程

InetAddress 类和 InetSocketAddress 类获得端口:

import java.net.InetAddress;import java.net.InetSocketAddress;public class InetSocketAddresss { public static void main(String[] args) { InetSocketAddress add=new InetSocketAddress("127.0.0.1",8080); System.out.println(add.getHostName()); System.out.println(add.getPort()); InetAddress addr=add.getAddress();//获得端口的ip; System.out.println(addr.getHostAddress());//返回ip; System.out.println(addr.getHostName());//输出端口名; }}

3.通讯协议

重要的协议:

  • TCP,用户传输协议
  • UDP, 用户数据报协议
  • IP,网络互联协议

TCP/IP 模型:

181979fc4d31e56f98436147e08818f0.png

TCP 协议需要在客户端与服务端建立连接,比较稳定,但是需要数据传输完成才释放连接,例如打电话,效率较低。建立连接有三次握手,四次挥手过程。

325caa3c798a060bc782395731f3ac52.png
22ad06b2a5fae97179843a2ce5810a23.png

UDP 协议不需要连接,客户端与服务端之间没有明确的界限,不管是否建立连接都可以传输数据给你,例如发短信,但是比较不稳定。

4.发送与接收数据

1.TCP 协议大多数连接都是可靠的 TCP 连接。创建 TCP 连接时,主动发起连接的叫客户端,被动响应连接的叫服务端。

举个例子,当我们在打电话的时候我们要先拨通电话号码,让后对方接听,也可以挂掉。而接通过后并接听,建立连接成功过后,进行通话。同样在 TCP 协议传输数据的过程中,必须建立连接,才能传输打包数据。

客户端使用 TCP 协议 向服务器发送消息需要以下 3 步:

  • 获取服务器的IP地址。
  • 创建端口号。
  • 建立 socket 连接等待用户连接 accept。

import java.io.IOException;import java.io.OutputStream;import java.net.InetAddress;import java.net.Socket;//客户端public class TcpClientDemo01 { public static void main(String[] args) { Socket socket = null; OutputStream os= null; try { //1.要知道服务器地址 InetAddress byName = InetAddress.getByName("127.0.0.1"); //2.端口号 int port=9999; //3.创建一个socket连接 socket = new Socket(byName,port); //发送消息 IO流 os= socket.getOutputStream(); os.write("tcp协议练习!".getBytes()); } catch (Exception e) { e.printStackTrace(); }finally { if (os !=null){ try { os.close(); } catch (IOException e) { e.printStackTrace(); } } if (socket!=null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }}

服务端接收客户端发送来的数据分为以下 3 步:

  • 建立服务器的端口 serverSocker。
  • 等待用户连接 accept。
  • 接受用的数据,并读取。

import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.ServerSocket;import java.net.Socket;//服务端public class TcpServerDemo01 { public static void main(String[] args) { ServerSocket serverSocker =null; Socket socket = null; InputStream is = null; ByteArrayOutputStream byteArrayOutputStream = null; try { //1.我有一个地址 serverSocker = new ServerSocket(9999); while (true){ //2.等待客户端连接过来 socket = serverSocker.accept(); //3.读取客户端的消息 is = socket.getInputStream(); //管道流 byteArrayOutputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len; while ((len=is.read(buffer))!=-1){ byteArrayOutputStream.write(buffer,0,len); } System.out.println(byteArrayOutputStream.toString()); } } catch (IOException e) { e.printStackTrace(); }finally { //关闭资源 if( byteArrayOutputStream !=null){ try { byteArrayOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (is!=null){ try { is.close(); } catch (IOException e) { e.printStackTrace(); } } if (socket!=null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } if ( serverSocker!=null){ try { serverSocker.close(); } catch (IOException e) { e.printStackTrace(); } } } }}

12ccae0b986857713d7a535be17bb900.png

需要注意的是,要先运行服务端( TcpServerDemo01 ),再运行客户端( TcpClientDemo01 ),否则会出现以下错误:

ccb042d62e70ee9f109e9fdaf2753e2f.png

错误原因:tcp 协议必须创建连接才能发送数据。

2.UDP 协议

TCP 是建立可靠连接,从上述案例可以看出通信双方都可以以流的形式发送数据。相对 TCP,UDP 则是面向无连接的协议。

我们在使用 UDP 协议时,不需要建立 socket 连接,只需要知道对方的 IP 地址和端口号,就可以直接发数据包,但是不一定能到达目的主机。就如发短信一样,我有你的手机号,我可以随时给你发短信,但是有没有收到短信就只有你知道了。

虽然用 UDP 传输数据不太可靠,但它的优点是和 TCP 比,速度快,对于不要求可靠到达的数据,就可以使用 UDP 协议。

利用 UDP 协议向服务器发送信息:

import java.net.DatagramPacket;import java.net.DatagramSocket;//等待客户端的连接public class UDPServer { public static void main(String[] args) throws Exception { //开放端口 DatagramSocket socket = new DatagramSocket(9908); //接受数据包 byte[] buffer = new byte[1024]; DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length); socket.receive(packet);//阻塞接受 System.out.println(packet.getAddress().getHostAddress()); System.out.println(new String(packet.getData(),0,packet.getLength())); //关闭连接 socket.close(); }}import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;//不需要连接服务器public class UDPClient { public static void main(String[] args) { DatagramSocket socket = null; try { //1.建立一个连接 Socker socket = new DatagramSocket(); //2.建立包 String msg = "您好,服务器!"; //发送给谁 InetAddress byName = InetAddress.getByName("127.0.0.1"); int port = 9908; // 数据 数据的长度 发送给谁 DatagramPacket datagramPacket = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, byName, port); //3.发送包 socket.send(datagramPacket); } catch (Exception e) { e.printStackTrace(); }finally { //4.关闭流 if (socket !=null){ socket.close(); } } }}

a51df766efd0edef26160be86e4d23d5.png

5.总结

在本文中,我们主要了解了怎么用 Java 获取主机的 IP 、端口以及如何发送和接收数据,希望这对你的工作能有帮助。



推荐阅读
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了网络编程的要点,包括InetAddress类获取IP地址的方法,IP地址的定义和表示方法,IPv4和IPv6的区别,以及网络通信协议中的端口和协议类型。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 1、概述首先和大家一起回顾一下Java消息服务,在我之前的博客《Java消息队列-JMS概述》中,我为大家分析了:然后在另一篇博客《Java消息队列-ActiveMq实战》中 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
author-avatar
mobiledu2502902725
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有