IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Java网络编程 -> 正文阅读

[网络协议]Java网络编程

目录

?1、IP和端口号

????????1.1、IP?

?????????1.2、端口号

?2、网络通信协议

? ? ? ? 2.1、TCP和UDP

? ? ? ? ? ? ? ? 2.1.1、TCP网络编程

? ? ? ? ????????2.1.2、UDP网络编程?

? ? ? ? ?2.2、三次握手、四次挥手

? ? ? ? ? ? ? ? ? ? ? ? 2.2.1、三次握手

? ? ? ? ? ? ? ? ? ? ? ? 2.2.2、4次挥手


?1、IP和端口号

????????1.1、IP?

InetAdress类

实例化:

public static InetAddress getLocalHost()
public static InetAddress getByName(String host)

常用方法:

public String getHostAddress() :返回 IP 地址字符串(以文本表现形式)。
public String getHostName() :获取此 IP 地址的主机名
public boolean isReachable(int timeout): :测试是否可以达到该地址

????????1.2、端口号

????????????????不同的进程有不同的端口号,端口与 号与IP 地址的组合得出一个网络套:接字:Socket? ??

????????????????公认端口:0~1023。被预先定义的服务通信占用(如:HTTP占用端口
80,FTP占用端口21,Telnet占用端口23)
????????????????注册端口:1024~49151。分配给用户进程或应用程序。(如:Tomcat占
用端口8080,MySQL占用端口3306,Oracle占用端口1521等)。
????????????????动态/ 私有端口:49152~65535。

?2、网络通信协议

? ? ? ? 2.1、TCP和UDP

????????????????a、tcp面向连接,udp发送数据不需要建立连接

????????????????b、tcp提供可靠的服务,udp无法保证

????????????????c、tcp面向字节流,udp面向报文

????????????????d、tcp数据传输慢,udp数据传输快。

? ? ? ? ? ? ? ? 2.1.1、TCP网络编程

public class TCPTest {
    // 服务端
    @Test
    public void server() {
        ServerSocket serverSocket = null;
        Socket socket = null;
        InputStream inputStream = null;
        ByteArrayOutputStream byteArrayOutputStream = null;
        try {
            // 1、创建服务器端的ServerSocket,指明自己的端口。启动程序就指定自己的服务器地址,所以不用指明
            serverSocket = new ServerSocket(8888);
            // 2、接受来自客户端的socket
            socket = serverSocket.accept();
            // 3、获取输入流
            inputStream = socket.getInputStream();
            // 4、读取流中的数据
            byteArrayOutputStream = new ByteArrayOutputStream();
            byte[] buffer = new byte[10];
            int len;
            while ((len = inputStream.read(buffer)) != -1) {
                byteArrayOutputStream.write(buffer, 0, len);
            }
            System.out.println("收到" + socket.getInetAddress().getHostAddress()+"数据"+byteArrayOutputStream.toString());
            // inputStream这种写法如果有中文会有乱码情况
            /*byte[] buffer = new byte[10];
            int len;
            while ((len = inputStream.read(buffer)) != -1) {
                String str = new String(buffer,0,len);
                System.out.println(str);
            }*/
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 4、资源关闭
            if (null != byteArrayOutputStream) {
                try {
                    byteArrayOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != inputStream) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (null != socket) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != serverSocket) {
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    // 客户端
    @Test
    public void client() {
        Socket socket = null;
        OutputStream outputStream = null;
        try {
            // 1、创建Socket对象,指明服务器端的ip和端口号
            InetAddress inetAddress = InetAddress.getByName("192.168.1.101");
            socket = new Socket(inetAddress, 8888);
            // 2、获取一个输出流,用于输出数据
            outputStream = socket.getOutputStream();
            // 3、写出数据
            outputStream.write("收到请回答".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 4、资源关闭
            if (null != outputStream) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != socket) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

? ? ? ? ????????2.1.2、UDP网络编程?

public class UDPTest {

    // 服务端
    @Test
    public void server() {
        DatagramSocket datagramSocket = null;
        try {
            datagramSocket = new DatagramSocket(9000);
            byte[] buff = new byte[1024];
            DatagramPacket datagramPacket = new DatagramPacket(buff, 0, buff.length);
            datagramSocket.receive(datagramPacket);
            String str = new String(datagramPacket.getData(), 0, datagramPacket.getLength());
            System.out.println(str + "--->" + datagramPacket.getAddress());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (null != datagramSocket) {
                datagramSocket.close();
            }
        }
    }

    // 客户端
    @Test
    public void client() {

        DatagramSocket datagramSocket = null;
        try {
            datagramSocket = new DatagramSocket();

            String str = "UPD客户端";
            byte[] data = str.getBytes();
            InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
            DatagramPacket datagramPacket = new DatagramPacket(data, 0, data.length, inetAddress, 9000);
            datagramSocket.send(datagramPacket);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (null != datagramSocket) {
                datagramSocket.close();
            }
        }
    }
}

? ? ? ? ?2.2、三次握手、四次挥手

? ? ? ? ? ? ? ? ? ? ? ? 2.2.1、三次握手

第一次握手:确认客户端的发送没有问题(客户端发送syn(序号)包)

第二次握手:确认服务器端的接受和发送没有问题(服务器收到syn,发送syn+ack(确认)包)

第三次握手:确认客户端的接受没有问题(为了防止已经失效的连接请求报文段突然传到服务器,因而产生错误)客户端收到syn+ack包,向服务器发送ack确认包。

? ? ? ? ? ? ? ? ? ? ? ? 2.2.2、4次挥手

客户端和服务器端都可以发送中断请求,以服务器端发送中断请求为例:
第一次服务器端挥手:服务器端发送finish包表示不会再向客户端发送数据了

第二次客户端挥手:对第一次挥手的响应,表示客户端收到了。如果还是数据需要发送就会赶紧发送过去

第三次客户端挥手:客户端确定不会给服务器端发送数据后才会进行第三次挥手

第四次服务器端挥手:服务器端接受到客户端的挥手后会进行第四次挥手,最后通信中断。

?

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-30 12:32:49  更:2021-08-30 12:33:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年6日历 -2024/6/15 2:37:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码