网络通信协议

目录

什么是网络协议?

        四层网络模型:

        IP: 

        端口:

        TCP/IP协议簇

TCP与UDP对比

TCP聊天实操

TCP文件传输实操:

UDP短信发送实操:

UDP实现在线在线咨询:

URL下载网络资源:


什么是网络协议?

        概述:网络协议:用来实现多个电脑的链接,而建立的协议在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守才能完成数据交换,,这种协议被广泛使用,其中进行通信的协议为tcp/ip。

四层网络模型:

网络中是使用网络模型对应各个网络协议,目前使用的是四层网络模型,但在理想的情况下会将各种协议各司其职进行划分为七层

应用层:

HTTP:超文本传输协议

HTTPS:超文本安全传输协议

TFTP:文件传输协议(少量文件使用)

FTP:文件传输协议

NFS:UNIX表示层协议

WAIS:广域信息查询系统

SMTP:电子邮件传输协议

传输层:

TCP:传输控制协议

DNS:域名解析协议

网络层:

Ip:网络互联协议(一般通过IP地址定位到某一台电脑) 

IP: 

  • ip具有唯一性,可以通过在网络中唯一定位一台电脑
  • 127.0.0.1和localhost来表示本机

ipv4/ipv6:

        ipv4如:172.0.0.1 由四个字节组成每个字节的长度为0~255有42亿个IP

        ipv6如:fe80::60f8:dddd:6bea:17a7%5 用8个无符号整数表示 几乎可以拥有无限的地址空间

        同时在java中net(网络)包中也有一个表示电脑ip的类,方法作用如下:

package com.text;

import java.net.InetAddress;

public class text1 {
    public static void main(String[] args) {
        try {
            //通过IP地址获取本机IP
            InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
            //使用域名获取本机ip
            InetAddress inetAddress1=InetAddress.getByName("baidu.com");
            //通过英文单词localhost获取ip地址
            InetAddress inetAddress2=InetAddress.getByName("localhost");
            //通过InetAddress自带的方法获取本机ip
            InetAddress inetAddress3=InetAddress.getLocalHost();
            //获取主机地址
            System.out.println(inetAddress1.getAddress());
            //获取主机ip
            System.out.println(inetAddress1.getHostAddress());
            //获取主机地址
            System.out.println(inetAddress1.getHostName());
            //获取规范的主机名
            System.out.println(inetAddress1.getCanonicalHostName());

        }catch (Exception x){
            x.printStackTrace();
        }
    }
}

端口:

        概述:端口是用来表示一个电脑中的一个进程,不同的进程有不同的端口号,端口号通常用来定位电脑上的某一共程序.

端口号被规定为:0~65535也就是说如果电脑足够好可以运行65535个程序前提是只使用了一共端口类型UTP或者UDP也就是说最多可以65535*2个

端口分类:        

公共端口为0~1023

  • http:默认端口80
  • https:默认端口443
  • FTP:默认端口21
  • Telet:默认端口23

程序注册默认端口为:1024~49151 分配用户或者程序

  • mysql:默认3306
  • Tomcat:默认8080
  • Oracle:默认1521
  • redis:默认6379
  • rabbitmq:默认5672

 DOS端口命令

netstat -an //查看全部端口号

netstat -ano|findstr "端口号"//查看指定端口

taskList|findstr "8696" //查看指定端口的进程

InetSocketAddress

同时JDK也提供了于net包下的InetSocKetAddress类,用法如:

package com.text;

import java.net.InetSocketAddress;

public class text2 {
    public static void main(String[] args) {
        InetSocketAddress inetSocketAddress = new InetSocketAddress("localhost", 8080);
        //判断是否找到ip地址的Socket如果找到返回ip+端口号,否则返回ip地址+端口号
        System.out.println(inetSocketAddress);
        //获取地址
        System.out.println(inetSocketAddress.getAddress());
        //获取主机名
        System.out.println(inetSocketAddress.getHostName());
        //获取端口
        System.out.println(inetSocketAddress.getPort());
        //获取主机名的字符串
        System.out.println(inetSocketAddress.getHostString());
    }
}

TCP/IP协议簇

        TCP/IP中包含了很多的协议其中最著名的两个协议为:

  •         TCP:传输控制协议
  •         UDP:用户数据报协议

 他们都是为于四层网络模型的传输层用来传输数据的约定,

TCP与UDP对比

TCP:

  • 如同打电话需要双方建立链接,特点为稳定
  • 三次握手,四次挥手
  • 需要客户端与服务端进行连接
  • 传输完成链接释放效率低

UDP: 

  • 如同发消息可以不需要建立链接,特点为不稳定,数据容易丢失
  • 客户端与服务端没有明确的界限
  • 何时都能传输,效率高

三次握手四次挥手:

 TCP的三次握手和四次挥手是一个非常经典的链接方式如:

 这里可以看到这是三次握手,首先客户端给服务器发送消息,等待服务器确定,待服务器确定之后返回消息给客户端,客户端确定之后变可以传输消息同时者也是最少的确认方式,可以理解为人的三句话1.我要传输数据可以吗?2.回应:可以3.那我传输了,就此链接建立.

.

 这里也是同样的道理客户端个服务器发送要结束链接的请求,待服务器确认,往复两次则端口链接.

TCP聊天实操

在java中已经知道了tcp是用于传输控制的协议那么java中必定有向对应的类,与TCP向对应的类有Socket与ServerSocket类一个是表示链接的类一个是接收链接的类,可以用来传输信息代码如下:

package com.text;

import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

//客户端类(用来向服务器发送消息)
public class Client {
    public static void main(String[] args) throws Exception {
        //1.首先创键一个服务器的IP类(注意这个类是静态方法)
        InetAddress inetaddress=InetAddress.getByName("127.0.0.1"); //这里表示本机
        //2.创建要链接服务器的那个端口
        int port=8888;
        //3.创建Socket链接服务器
        Socket socket=new Socket(inetaddress,port);
        //4.使用IO流发送消息
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("你好很高兴认识你".getBytes());
        //5.关闭资源
        socket.close();
        outputStream.close();
    }
}
package com.text;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

//服务器类(用来接收客户端发送的消息)
public class TheServer {
    public static void main(String[] args) throws IOException {
        //1.创键一个套接字接收消息(相当于创建本机电脑上的一个端口)
        ServerSocket serversocket=new ServerSocket(8888);
        //2.等待检测客户端发送消息
        Socket accept = serversocket.accept();
        //3.将客户端发送的消息进行读取
        InputStream inputStream = accept.getInputStream();
        //4.创建管道流接收数据
        ByteArrayOutputStream byteArrayoutputstream=new ByteArrayOutputStream();
        int temp;//临时变量默认0
        byte[] container=new byte[1024];//用于存储传输的数据
        if ((temp=inputStream.read(container))!=-1) {
            byteArrayoutputstream.write(container, 0, temp);
        }
        //输出接收的消息,这里可以直接输出因为ByteArrayOutputStream中重写了toString方法
        System.out.println(byteArrayoutputstream);
        //5.关闭资源
        serversocket.close();
        accept.close();
        inputStream.close();
        byteArrayoutputstream.close();
    }
}

这里需要注意必须先启动服务器的类,不然用户找不到该该端口则会报ConnectException链接异常.

TCP文件传输实操:

Socket这个类当然不仅能传输消息同时也自然能传输文件代码如下:

package com.text;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

//用户传输文件
public class test13 {
    public static void main(String[] args) throws IOException {
        //1.创建客户端链接
        Socket socket=new Socket(InetAddress.getByName("127.0.0.1"),5858);
        //2.获取输出流
        OutputStream outputStream = socket.getOutputStream();
        //3.读取文件
        FileInputStream fileinputstream=new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\模板\\img\\abfixbg2.jpg"));//这里表示上传图片的路径
        //4.写出文件
        int temp;
        byte[] buffer=new byte[1024];
        while ((temp = fileinputstream.read(buffer)) != -1) {
            outputStream.write(buffer,0,temp);
        }
        //5.关闭资源
        socket.close();
        outputStream.close();
        fileinputstream.close();
    }
}
package com.text;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

//客户端接收文件
public class test14 {
    public static void main(String[] args) throws IOException {
        //1.创建套接字端口
        ServerSocket serversocket=new ServerSocket(5858);
        //2.监听客户端链接
        Socket accept = serversocket.accept();
        //3.获取输出流
        InputStream inputStream = accept.getInputStream();
        //4.文件输出
        FileOutputStream  fileoutputstream=new FileOutputStream("x.jpg");//这里代表的是输出路径
        int temp;
        byte[] buffer=new byte[1024];
        while ((temp=inputStream.read(buffer))!=-1){
            fileoutputstream.write(buffer,0,temp);
        }
    }
}

注意这里运行是要先开启服务端,用户在发送数据才能接收到

UDP短信发送实操:

使用UDP发送消息并没有限制java也提供了相对应的类DatagramSocket表示数据报套接字,不需要链接直接发送如:

package com.text;

import java.io.IOException;
import java.net.*;

//实现UDP发送消息
public class test19 {
    public static void main(String[] args) throws IOException {
        //1.创建一个数据报套接字对象 参数为端口
        DatagramSocket datagramsocket=new DatagramSocket(4545);
        //2.创建发送的对象(里面包含消息)
        String xx="Hello world 很高兴认识你!";
        DatagramPacket datagrampacket=new DatagramPacket(xx.getBytes(),0,xx.getBytes().length, InetAddress.getByName("127.0.0.1"),5454);
        //3.发送消息
        datagramsocket.send(datagrampacket);
        //5.关闭资源
        datagramsocket.close();
    }
}
package com.text;

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

//实现UDP接收数据
public class test20 {
    public static void main(String[] args) throws IOException {
        //1.创建一个数据报套接字对象 参数为端口
        DatagramSocket datagramsocket = new DatagramSocket(5454);
        //2.创建接收对象
        byte[] buffer=new byte[1024];
        DatagramPacket datagrampacket=new DatagramPacket(buffer,0,buffer.length);
        //3.接收对象
        datagramsocket.receive(datagrampacket);
        //4.取出消息
        System.out.println("获取地址-->"+datagrampacket.getData());
        System.out.println("获取长度-->"+datagrampacket.getLength());
        System.out.println("获取套接字地址-->"+datagrampacket.getSocketAddress());
        System.out.println("获取偏移量-->"+datagrampacket.getOffset());
        System.out.println("获取ip地址-->"+datagrampacket.getAddress());
        System.out.println("获取端口-->"+datagrampacket.getPort());

    }
}

UDP实现在线在线咨询:

udp实现在线咨询没有明确的规定,可以想给谁发給谁发,但是可能并没有被接收,也可以同时利用多线程来实现发送消息和接收消息如:

package com.text;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;

public class test24 implements Runnable {
   static DatagramSocket datagramsocket;

    static {
        try {
            datagramsocket = new DatagramSocket(5867);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }


    @Override
    public void run() {
        //接收消息
        while (true) {
            byte[] buffer = new byte[1024];
            DatagramPacket datagrampacket = new DatagramPacket(buffer, 0, buffer.length);
            try {
                datagramsocket.receive(datagrampacket);
            } catch (IOException e) {
                e.printStackTrace();
            }
            String s = new String(datagrampacket.getData(), 0, datagrampacket.getData().length);
            System.out.println(datagrampacket.getAddress()+""+datagrampacket.getPort()+"发来消息:"+s.trim());
            if (s.trim().equals("bye") || s.trim().equals("拜拜")) {
                break;
            }
        }
    }

    public static void main(String[] args) throws IOException {
        new Thread(new test24()).start();

        while (true) {
            //发送信息
            System.out.print("输入您要发送的消息:");
            String buffed = new Scanner(System.in).nextLine();
            System.out.println();
            byte[] buffer = buffed.getBytes();
            DatagramPacket datagrampacket = new DatagramPacket(buffer, 0, buffer.length, InetAddress.getByName("127.0.0.1"), 7578);
            datagramsocket.send(datagrampacket);
            System.out.println("发送成功!");
            if (buffed.strip().equals("bye") || buffed.strip().equals("拜拜")) {
                break;
            }
        }
    }
}
package com.text;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;

public class test25 implements Runnable{
   private static DatagramSocket datagramsocket;

    static {
        try {
            datagramsocket = new DatagramSocket(7578);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        //接收消息
        while (true) {
            byte[] buffer = new byte[1024];
            DatagramPacket datagrampacket = new DatagramPacket(buffer, 0, buffer.length);
            try {
                datagramsocket.receive(datagrampacket);
            } catch (IOException e) {
                e.printStackTrace();
            }
            String s = new String(datagrampacket.getData(), 0, datagrampacket.getData().length);
            System.out.println(datagrampacket.getAddress()+""+datagrampacket.getPort()+ "发来消息:" + s.trim());
            if (s.strip().equals("bye") || s.strip().equals("拜拜")) {
                break;
            }
        }
        datagramsocket.close();
    }

    public static void main(String[] args) throws IOException {
        //启动接收消息的线程
        new Thread(new test25()).start();
        //发送消息
        while (true) {
            System.out.print("请输入您要发送的消息:");
            String xx = new Scanner(System.in).nextLine();
            System.out.println();
            byte[] buffer = xx.getBytes();
            DatagramPacket datagrampacket = new DatagramPacket(buffer, 0, buffer.length, InetAddress.getByName("127.0.0.1"), 5867);
            datagramsocket.send(datagrampacket);
            System.out.println("发送成功");
            if (xx.strip().equals("bye")||xx.strip().equals("拜拜")){
                break;
            }
        }
    }
}

URL下载网络资源

        了解:DNS是域名解析协议,每个域名都对应着一个ip地址,实际上网络的资源都是存放在对应ip地址的电脑上,URL:我们在浏览器的地址栏里输入的网站地址叫做URL同时也称为统一资源定位符URL同时也是一种协议.一般用来定位互联网上的某一个资源,同时java也提供了相对于的类URL网络类,通常用来下载资源如:

package com.text;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class test26 {
    public static void main(String[] args) throws IOException {
        //创建网络对象
        URL url=new URL("https://dl.stream.qqmusic.qq.com/C400000d1egb4T2Zoy.m4a?guid=191374580&vkey=97882E74C300B6AC2D134F0D7B26B3476EF3C3B6807E21C693FFCEC7415EC49CE7D5FCE48400EE48817EDE30C9D55434FF4F1A6DE07ABA3D&uin=3068384097&fromtag=66");
        Test(url,"Tang.m4a");
    }

    //下载资源方法
    public static void Test(URL url,String depositAddress) throws IOException {
        //打开链接强转为HttpURLConnection链接
        HttpURLConnection httpurlconnection= (HttpURLConnection) url.openConnection();
        //获取输入流
        InputStream inputStream = httpurlconnection.getInputStream();
        //创建文件输出流
        FileOutputStream fileoutputstream=new FileOutputStream(depositAddress);
        //写入文件输出流
        byte[] buffer=new byte[1024];
        int len;
        if ((len=inputStream.read(buffer))!=-1){
            fileoutputstream.write(buffer);
        }
    }
}

同时这里下载的资源是一个音乐下载成功了但是需要进行指定播放器进行播放,如果以后的自己看见这条信息希望能够尝试破解一下.

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

123小步

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值