逸学java【初级菜鸟篇】12.网络通讯编程

hi,我是逸尘,一起学java吧


目标(任务驱动)

请练掌网络通讯的内容。

局域网和互联网

局域网英文:Local Area Network,缩写:LAN,是指一群通过一定形式连接起来的计算机,可以是两台计算机组成也可以是同一区域上千台计算机组成。

将LAN延伸到更大范围,称之为广域网WAN

我们的互联网就是无数个WAN和LAN组成的。

网络编程

实现网络编程的三要素

ip地址,端口,协议

网络协议

规定计算机之间规则的,就像法律一样,但是各个国家不同,所以有各种协议。

TCP/IP协议

我们的Internet网络采用的是TCP/IP协议,包括两部分传输控制协议网络(际)协议

我们来看4层模型的传输层和网络层

 

IP协议

在网际协议中主要是我们的IP协议

IP协议全称为“网际互连协议(Internet Protocol)

由其网络为其分配的ip地址作为计算机的身份,到目前为止,ip地址用4字节也就是32位二进制数表示,为了方便使用,每个字节取用十进制显示称位IPv4,IPv6是为了解决IPv4不足的问题。

TCP和UDP协议

在传输控制协议中主要是我们的TCP协议和UDP协议

TCP协议
使用tcp协议,必须双方先建立连接,它是一种面向连接的可靠通信协议。
传输前,采用"三次握手"方式建立连接,所以是可靠的。
在连接中可进行大数据量的传输。
连接,发送数据都需要确认,且传输完毕后,还需释放已建立的连接,通信效率较低。
tcp协议通信场景
对信息安全要求较高的场景,例如:文件下载,金融等数据通信。

UDP协议

udp是一种无连接,不可靠传输的协议。
将数据源ip,目的地ip和端口封装成数据包,不需要建立连接
每个数据包的大小限制在64kb内
发送不管对方是否准备好,接收方收到也不确认,故是不可靠的
可以广播发送,发送数据结束时无需释放资源,开销小,速度快。
udp协议通信场景
语音通话,视频会话等。

端口

端口:应用程序在设备中唯一的标识。

那么我们接下来说一下端口,在程序设计中是一个假想概念,被规定为0~6553的整数。

普通网络应用程序使用1024以上端口HTTP一般是80

套接字是将端口和应用程序连接的假想装置

 

InetAddress类

 是与IP地址相关的类

package com.yd.tcp;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class One {
    public static void main(String[] args) throws UnknownHostException {
        InetAddress ip=InetAddress.getLocalHost();
        String localname = ip.getHostName();
        String localip = ip.getHostAddress();
        System.out.println("本机名:"+localname);
        System.out.println("本机地址:"+localip);
    }
}

ServerSocket类

是与服务器套接字相关的类,主要是等待网络上的"请求",可以指定端口来等待连接的套接字,服务器套接字可以一次一和一个客户端套接字连接,如果多个则,会将其他客户端套接字存入队列中,如果大于最大容量就会拒绝,默认是50。

方法

调用accept()方法会返回一个连接的Socket对象,服务器端的socke对象使用getOutputStream()方法获得输出流,客户端使用getInputStream()方法获得其输入流。

也就是服务器向输出流写入信息时,客户端相应读取输入流。

DatagramPacket类

DatagramSocket类

TCP网络程序设计

客户端发信息给服务器,但是服务器不能向客户端发信息我们称位单向通信。

双方套接字连接成功就可以发送流 来进行信息传输接收。

服务端

package com.yd.tcp;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerDEmo {
    public static void main(String[] args) {
        try {
            System.out.println("服务端(元神)启动");
            //注册端口
            ServerSocket serverSocket = new ServerSocket(8848);
            //等待,建立一个socket
            Socket acceptsocket = serverSocket.accept();
            //字节输入流
            InputStream inputStream = acceptsocket.getInputStream();
            //包装成字符流
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

            //读
            String msg;
            while ((msg=bufferedReader.readLine())!=null){
                System.out.println(acceptsocket.getLocalAddress()+"说"+msg);
            }

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

    }
}

客户端

package com.yd.tcp;

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

public class Two {
    public static void main(String[] args) {
        try{
            //创建socket
            Socket socket = new Socket("127.0.0.1", 8848);
            //输出流,发送信息
            OutputStream out = socket.getOutputStream();
            //字节流包装成打印成流
            PrintStream printStream = new PrintStream(out);
            //发消息
            printStream.println("我是TCP客户端");
            printStream.flush();
            //关闭
            socket.close();


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

    }
}

UDP网络程序设计


import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class ServerDemo {
    public static void main(String[] args) throws Exception {
        System.out.println("服务端启动");
        //创建接收对象
        DatagramSocket datagramSocket = new DatagramSocket(8888);
        //创建数据包对象接收数据
        byte[] buffer=new byte[1024*64];
        DatagramPacket packet=new DatagramPacket(buffer, buffer.length);
        //等待接收数据包
        datagramSocket.receive(packet);
        //取出数据
        String s = new String(buffer);
        System.out.println("收到了"+s);

        String s1 = packet.getSocketAddress().toString();
        System.out.println("对方地址"+s1);

        int port = packet.getPort();
        System.out.println("对方端口"+port);

        datagramSocket.close();

    }
}
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class ClientDemo {
    public static void main(String[] args) throws Exception {
        //发送数据
        System.out.println("发送");
    //创建发送对象,默认端口
        DatagramSocket socket = new DatagramSocket();

        byte[] buffer="数据测试10".getBytes();
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getLocalHost(), 8888);
        //发送数据出去
        socket.send(packet);

        socket.close();

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/214065.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【并发编程】CopyOnWriteArrayList详解与原理

📫作者简介:小明Java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化,文章内容兼具广度、深度、大厂技术方案,对待技术喜欢推理加验证,就职于…

Python函数的基本使用(一)

Python函数的基本使用(一) 一、函数概述二、函数的定义2.1 函数的语法2.2 语法说明2.3 函数定义的方式2.4 总结 三、函数的调用3.1 函数调用语法3.2 语法说明3.3 函数调用 四、函数的参数4.1 参数的分类4.2 必需参数4.3 默认值参数4.4 关键字参数4.5 不定…

JavaEE 多线程

JavaEE 多线程 文章目录 JavaEE 多线程引子多线程1. 特性2. Thread类2.1 概念2.2 Thread的常见构造方法2.3 Thread的几个常见属性2.4 启动一个线程2.5 中断一个线程2.6 等待一个线程2.7 获取当前线程引用2.8 休眠当前线程 3. 线程状态 引子 当进入多线程这一块内容时&#xff…

《微信小程序开发从入门到实战》学习四十

4.2 云开发JSON数据库 4.2.11 更新数据 使用数据库API更新数据有两种方法:一.将记录局部更新的update方法;二.以替换的方式更新记录的set方法 update方法可以局部更新一个记录或一个集合的多个记录,更新时只有指定字段更新,其他…

基于英特尔平台及OpenVINO2023工具套件优化文生图任务

当今,文生图技术在很多领域都得到了广泛的应用。这种技术可以将文本直接转换为逼真的图像,具有很高的实用性和应用前景。然而,由于文生成图任务通常需要大量的计算资源和时间,如何在英特尔平台上高效地完成这些计算是一个重要的挑…

Spring Cloud Alibaba简介

1、简介 Spring Cloud阿里(https://sca.aliyun.com/en-us/)为分布式应用开发提供一站式解决方案。它包含开发分布式应用程序所需的所有组件,使您可以轻松地使用Spring Cloud开发应用程序。 有了Spring Cloud阿里,你只需要添加一些注释和少量的配置&#…

32、直流电机驱动(PWM)

直流电机介绍 直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极,当电极正接时,电机正转,当电极反接时,电机反转 直流电机主要由永磁体(定子)、线圈(转子)和换向器…

[传智杯 #3 决赛] 面试

题目背景 disangan233 和 disangan333 去面试了,面试官给了一个问题,热心的你能帮帮他们吗? 题目描述 现在有 n 个服务器,服务器 i 最多能处理 ai​ 大小的数据。 接下来会有 k 条指令 bk​,指令 i 表示发送 bi​ …

JavaWeb-XML

1.常见的配置文件 1.1 properties 数据库的连接就使用properties文件作为配置文件,properties文件中的配置信息是以键值对的形式存储的。 beiluo.jdbc.urljdbc:mysql://localhost:3306/beiluo beiluo.jdbc.drivercom.mysql.cj.jdbc.Driver beiluo.jdbc.usernamer…

基于Java SSM框架实现师生交流答疑作业系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现师生交流答疑作业系统演示 摘要 在新发展的时代,众多的软件被开发出来,给用户带来了很大的选择余地,而且人们越来越追求更个性的需求。在这种时代背景下,人们对师生交流平台越来越重视,更好的实…

6-13连接两个字符串

#include<stdio.h> int main(){int i0,j0;char s1[222],s2[333];printf("请输入第一个字符串&#xff1a;\n");gets(s1);//scanf("%s",s1);printf("请输入第二个字符串&#xff1a;\n");gets(s2);while(s1[i]!\0)i;while(s2[j]!\0)s1[i]s2…

DevEco Studio 调整开发工具中的字体大小与行高

我们打开编辑器 选择 左上角 File 下的 Settings 将左侧菜单栏 编辑 展开 我们在编辑下面 选择 Font 然后 如下图指向的两个位置 我们可以调整它的字体大小和行高 设置好之后 右下角 点击 Apply 应用 然后点击 OK即可 当然 你按着 Ctrl 然后鼠标滚动 也可以像浏览器那样 拉…

React如何像Vue一样将css和js写在同一文件

如果想在React中想要像Vue一样把css和js写到一个文件中&#xff0c;可以使用CSS-in-JS。 使用CSS-in-JS 下载 npm i styled-components使用 就像写scss一样&#xff0c;不过需要声明元素的类型 基本语法及展示如下&#xff0c; import styled from "styled-component…

03 数仓平台 Kafka

kafka概述 定义 Kafka 是一个开源的分布式事件流平台&#xff08;Event Streaming Plantform&#xff09;&#xff0c;主要用于大数据实时领域。本质上是一个分布式的基于发布/订阅模式的消息队列&#xff08;Message Queue&#xff09;。 消息队列 在大数据场景中主要采用…

Python编程技巧 – 迭代器(Iterator)

Python编程技巧 – 迭代器(Iterator) By JacksonML Iterator(迭代器)是Python语言的核心概念之一。它常常与装饰器和生成器一道被人们提及&#xff0c;也是所有Python书籍需要涉及的部分。 本文简要介绍迭代器的功能以及实际的案例&#xff0c;希望对广大读者和学生有所帮助。…

YOLOv5改进 | 添加ECA注意力机制 + 更换主干网络之ShuffleNetV2

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。本文给大家介绍一种轻量化部署改进方式&#xff0c;即在主干网络中添加ECA注意力机制和更换主干网络之ShuffleNetV2&#xff0c;希望大家学习之后&#xff0c;能够彻底理解其改进流程及方法~&#xff01;&#x1f308; 目…

使用idea如何快速的搭建ssm的开发环境

文章目录 唠嗑部分言归正传1、打开idea&#xff0c;点击新建项目2、填写信息3、找到pom.xml先添加springboot父依赖4、添加其他依赖5、编写启动类、配置文件6、连接创建数据库、创建案例表7、安装MybatisX插件8、逆向工程9、编写controller10、启动项目、测试 结语 唠嗑部分 小…

剪切空间与归一化设备坐标【NDC】

有了投影变换的知识&#xff0c;我们现在可以讨论剪切空间&#xff08;Clip Space&#xff09;和 归一化设备坐标&#xff08;NDC&#xff1a;Normalized Device Coordinates&#xff09;。 为了理解这些主题&#xff0c;我们还需要深入了解齐次坐标的有趣世界。 NSDT工具推荐&…

解决:UnboundLocalError: local variable ‘js’ referenced before assignment

解决&#xff1a;UnboundLocalError: local variable ‘js’ referenced before assignment 文章目录 解决&#xff1a;UnboundLocalError: local variable js referenced before assignment背景报错问题报错翻译报错位置代码报错原因解决方法今天的分享就到此结束了 背景 在使…