网络编程(IP 端口 协议)

本文详细介绍了网络编程的基本概念,包括网络模型如OSI七层和TCP/IP四层模型,以及网络编程的三个核心元素:IP地址、端口号和传输协议。讲解了Java中InetAddress类的使用,展示了如何利用DOS命令获取IP地址,并对比了TCP和UDP协议的区别。同时,给出了Java实现TCP和UDP协议发送和接收数据的实例代码。
摘要由CSDN通过智能技术生成

网络编程

概述
	计算机网络: 
		是指将地理位置不同的具有独立功能的多台计算机及其外部设备 通过通信线路连接起来 在网络操作系统,网络管理软件及网络通信协议的管理和协调下 实现资源共享和信息传递的计算机系统。
	网络编程: 
		就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换

网络模型

概述
	计算机网络之间以何种规则进行通信 就是网络模型研究问题
	OSI(Open System Interconnection开放系统互连)七层参考模型
	TCP/IP四层参考模型
		主机至网络层(物理层,数据链路层),网际层,传输层,应用层(应用层,表示层,会话层)
		
网络模型七层概述
	OSI参考模型有七层
    应用层: 主要是一些终端的应用
    表示层: 主要进行对接收的数据进行解释、加密与解密、压缩与解压缩等
    会话层: 通过传输层(端口号 传输端口和接收端口)建立数据传输的通路
    传输层: 定义了一些传输数据的协议和端口号
    网络层: 主要将从下层接收到的数据进行IP地址的封装和解封装
    数据链路层: 主要将物理层接收的数据进行MAC地址(网卡地址)的封装和解封装
    物理层: 定义物理设备标准 主要用于传输比特流

网络编程三要素

A: IP地址: 
	InetAddress:网络中设备的标识 不易记忆 可用主机名
	IP为了标识网络中一台计算机的唯一性
    IP协议的作用主要有两个 一个是为每一台计算机分配IP地址 另一个是确定哪些地址在同一个子网络
    
   IP地址的组成:
    IP地址 = 网络地址+主机地址
    
   IP地址的分类: 
    A类 1.0.0.1---127.255.255.254
    B类 128.0.0.1---191.255.255.254
    C类 192.0.0.1---223.255.255.254
    D类 224.0.0.1---239.255.255.254 多播地址
    E类 240.0.0.1---247.255.255.254	保留地址
    
    DOS命令 ipconfig:查看本机IP地址
	xxx.xxx.xxx.255 广播地址
	
B: 端口号: 
	用于标识进程的逻辑地址 不同进程的标识 
	逻辑端口 它其实是每一个使用网卡的程序的编号
	
	物理端口 网卡口
	逻辑端口 我们指的就是逻辑端口
		a:每个网络程序都会有一个逻辑端口
		b:用于标识进程的逻辑地址,不同进程的标识
		c:有效端口:0~65535(两个字节) 其中0~1023系统使用或保留端口
	
C: 传输协议: 
	通讯的规则常见协议:TCP,UDP
	
	UDP 发短信
        将数据源和目的地封装成数据包 不需要建立连接
        每个数据报包的大小在限制在64k
        因无连接 是不可靠协议
        不需要建立连接 速度快 效率高
			
	TCP  打电话 视频
        建立连接 形成传输数据的通道
        在连接中进行大数据量传输
        需要连接所以是可靠协议
        必须建立连接效率会稍低
        
    UDP与TCP套接字通讯的主要区别  
        1.TCP面向连接 UDP无连接
        2.TCP协议传输速度慢 UDP协议传输速度快
        3.TCP有丢包重传机制 UDP没有
        4.TCP提供可靠服务 UDP不保证可靠
        5.TCP面向字节流 UDP面向报文
        6.TCP连接只能是点对点 UDP支持一对一,一对多,多对一,多对多的交互通信
        7.TCP首部开销20个字节 UDP首部开销8个字节
        8.TCP的逻辑通信信道是全双工的可靠信道 UDP是不可靠信道

请添加图片描述

请添加图片描述

Java程序运行DOS命令

DOS 命令意义
net view获取局域网中的所有主机名
ipconfig -all获取本地IP,主机名,MAC地址
arp -a获取本局域网中的所有IP地址和物理地址
ping -a x.x.x.x获取x.x.x.x的主机名
nbtstat -a 主机名获取MAC地址
public class ExecuteDOS {
    public static void main(String[] args) throws IOException {
        Process process = Runtime.getRuntime().exec("arp -a");
        BufferedReader in = new BufferedReader
                (new InputStreamReader(process.getInputStream(), "GBK"));
        String readLine = null;
        while ((readLine = in.readLine()) != null) {
            System.out.println(readLine);
        }
    }
}
获取局域网下的所有IP地址
public class FindIP {
    public static void main(String[] args) throws IOException {
        HashMap<Integer, String> hm = new HashMap<>();
        int i = 1;//hm的key
        //传入DOS命令
        Process process = Runtime.getRuntime().exec("arp -a");
        //修改字符
        BufferedReader in = new BufferedReader
                (new InputStreamReader(process.getInputStream(), "GBK"));
        String readLine = null;
        while ((readLine = in.readLine()) != null) {
            if (readLine.contains("192.168.0.") && readLine.contains("动态")) {
                readLine = readLine.trim();
                String[] split = readLine.split("\\s+");
                hm.put(i++, split[0]);
            }
        }
    }
}

InetAddress类

InetAddress类表示互联网协议(IP)地址

常见功能
public static InetAddress getByName(String host) 
通过主机名host 确定主机的IP地址
确定主机的IP地址 给定主机名
static InetAddress getLocalHost() 
返回本地主机的地址
public String getHostAddress()
返回主机的IP地址
public String getHostName()
返回主机名
 
 InetAddress localHost = InetAddress.getLocalHost();
 //  Jies/192.168.88.1
 
 InetAddress inetAddress = InetAddress.getByName("192.168.88.1");
 
 inetAddress = InetAddress.getByName("Jies");

UDP协议发送和接收数据

DatagramSocket
public void close()
关闭该数据报套接字
public void receive(DatagramPacket p) 
通过p接收数据报包
public void send(DatagramPacket p) 
通过p发送数据报包
 
DatagramPacket
public InetAddress getAddress()
返回IP地址
public byte[] getData()
返回数据缓冲区
public int getLength()
返回发送或接收到的数据长度
收发数据步骤
//UDP客户端--->发送数据步骤
public class UDPClient {
    public static void main(String[] args) throws IOException {
        //1.创建UDP通讯客户端对象(DatagramSocket)
        //public DatagramSocket(int port)
        DatagramSocket socket = new DatagramSocket(8888);
        //2.创建数据报包
        //public DatagramPacket(byte[] buf, int length, InetAddress address,int port)
        byte[] data = "你好".getBytes();
        DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getLocalHost(), 9999);
        //3.发送数据
        socket.send(packet);
        //4.释放资源
        socket.close();
    }
}

//UDP服务端--->接收数据步骤
public class UDPServer {
    public static void main(String[] args) throws IOException {
        //1.创建UDP通讯服务端对象(DatagramSocket)
        //public DatagramSocket(int port)
        DatagramSocket socket = new DatagramSocket(9999);
        //2.创建数据报包,作用用来接收数据
        //public DatagramPacket(byte[] buf, int length)
        byte[] bytes = new byte[1024 * 8];
        DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
        //3.接收数据
        socket.receive(packet);
        //4.解析数据报包,拿出数据
        byte[] data = packet.getData();
        int length = packet.getLength();
        String s = new String(data, 0, length);
        System.out.println(s);
        //5.释放资源
        socket.close();
    }
}

TCP协议发送和接收数据

Socket
public void close()。
关闭套接字
public InetAddress getInetAddress() 
返回套接字连接的地址
public InputStream getInputStream()
返回此套接字的输入流
public OutputStream getOutputStream() 
返回此套接字的输出流
public void shutdownOutput()	
设置结束标记
禁用套接字的输出流

ServerSocket
public Socket accept()
服务端等待连接
public InetAddress getInetAddress()
返回此服务器套接字的本地地址
收发数据步骤
//TCP客户端--->发送数据步骤
public class TCPClient {
    public static void main(String[] args) throws IOException {
        //1.创建TCP通讯协议客户端对象(Socket)
        //public Socket(String host, int port)
        Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
        //2.获取输出流对象
        OutputStream out = socket.getOutputStream();
        //3.写数据
        out.write("你好".getBytes());
        //设置结束标记
        socket.shutdownOutput();
        //4.释放资源
        socket.close();
    }
}

//TCP服务端--->接收数据步骤
public class TCPServer {
    public static void main(String[] args) throws IOException {
        //1.创建TCP通讯协议服务器端对象(ServerSocket)
        //public ServerSocket(int port)
        ServerSocket serverSocket = new ServerSocket(8888);
        //2.监听客户端
        Socket socket = serverSocket.accept();
        //3.获取输入流对象
        InputStream in = socket.getInputStream();
        //4.读取数据
        byte[] bytes = new byte[1024];
        int readlen = in.read(bytes);
        String s = new String(bytes, 0, readlen);
        System.out.println(s);
        //5.释放资源
        socket.close();
        serverSocket.close();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值