热门标签 | 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 、端口以及如何发送和接收数据,希望这对你的工作能有帮助。



推荐阅读
  • 本文详细解析了客户端与服务器之间的交互过程,重点介绍了Socket通信机制。IP地址由32位的4个8位二进制数组成,分为网络地址和主机地址两部分。通过使用 `ipconfig /all` 命令,用户可以查看详细的IP配置信息。此外,文章还介绍了如何使用 `ping` 命令测试网络连通性,例如 `ping 127.0.0.1` 可以检测本机网络是否正常。这些技术细节对于理解网络通信的基本原理具有重要意义。 ... [详细]
  • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 在本节课程中,我们将深入探讨 JSP 编程中的实际案例,通过具体代码示例 `code316.java` 来解析数据库连接的实现。该示例展示了如何使用 Java 的 JDBC API 进行数据库操作,包括加载数据库驱动、建立连接等关键步骤。通过本课程的学习,读者将能够更好地理解和应用 JSP 中的数据库连接技术。 ... [详细]
  • 本文作为探讨PHP依赖注入容器系列文章的开篇,将首先通过具体示例详细阐述依赖注入的基本概念及其重要性,为后续深入解析容器的实现奠定基础。 ... [详细]
  • 解决问题:1、批量读取点云las数据2、点云数据读与写出3、csf滤波分类参考:https:github.comsuyunzzzCSF论文题目ÿ ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • Nginx 反向代理配置与应用指南
    本文详细介绍了 Nginx 反向代理的配置与应用方法。首先,用户可以从官方下载页面(http://nginx.org/en/download.html)获取最新稳定版 Nginx,推荐使用 1.14.2 版本。下载并解压后,通过双击 `nginx.exe` 文件启动 Nginx 服务。文章进一步探讨了反向代理的基本原理及其在实际应用场景中的配置技巧,包括负载均衡、缓存管理和安全设置等,为用户提供了一套全面的实践指南。 ... [详细]
  • 本文详细介绍了如何安全地手动卸载Exchange Server 2003,以确保系统的稳定性和数据的完整性。根据微软官方支持文档(https://support.microsoft.com/kb833396/zh-cn),在进行卸载操作前,需要特别注意备份重要数据,并遵循一系列严格的步骤,以避免对现有网络环境造成不利影响。此外,文章还提供了详细的故障排除指南,帮助管理员在遇到问题时能够迅速解决,确保整个卸载过程顺利进行。 ... [详细]
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社区 版权所有