文档章节

Java基础进阶_day17_(网络编程)

S
 Sunmos
发布于 2017/05/13 00:18
字数 1681
阅读 3
收藏 0
点赞 0
评论 0

Java基础进阶_day17_(网络编程)

1. 网络编程

1.1 网络编程三要素

网络编程三要素:
 A:IP地址
 B:端口
 C:协议
IP地址:
 网络中计算机的唯一标识。
 计算机只能识别二进制的数据,所以我们的IP地址应该是一个二进制的数据。
 但是呢,我们配置的IP地址确不是二进制的,为什么呢?
 IP:192.168.1.100
 换算:11000000 10101000 00000001 01100100
 假如真是:11000000 10101000 00000001 01100100的话。
 我们如果每次再上课的时候要配置该IP地址,记忆起来就比较的麻烦。
 所以,为了方便表示IP地址,我们就把IP地址的每一个字节上的数据换算成十进制,然后用.分开来表示:
 "点分十进制"
 IP地址的组成:网络号段+主机号段
 A类:第一号段为网络号段+后三段的主机号段
 一个网络号:256*256*256 = 16777216
 B类:前二号段为网络号段+后二段的主机号段
 一个网络号:256*256 = 65536
 C类:前三号段为网络号段+后一段的主机号段
 一个网络号:256
 IP地址的分类:
 A类 1.0.0.1---127.255.255.254 (1)10.X.X.X是私有地址(私有地址就是在互联网上不使用,而被用在局域网络中的地址) (2)127.X.X.X是保留地址,用做循环测试用的。
 B类 128.0.0.1---191.255.255.254 172.16.0.0---172.31.255.255是私有地址。169.254.X.X是保留地址。
 C类 192.0.0.1---223.255.255.254 192.168.X.X是私有地址
 D类 224.0.0.1---239.255.255.254 
 E类 240.0.0.1---247.255.255.254
 两个DOS命令:
 ipconfig 查看本机ip地址
 ping 后面跟ip地址。测试本机与指定的ip地址间的通信是否有问题
 特殊的IP地址:
 127.0.0.1 回环地址(表示本机)
 x.x.x.255 广播地址
 x.x.x.0 网络地址
端口号:
 正在运行的程序的标识。
 有效端口:0~65535,其中0~1024系统使用或保留端口。
协议:
 通信的规则
 UDP:
 把数据打包
 数据有限制
 不建立连接
 速度快
 不可靠
 TCP:
 建立连接通道
 数据无限制
 速度慢
 可靠
 举例:
 UDP:发短信
 TCP:打电话

1.2 UDP通信编程

 * UDP通信:
 *      将数据源和目的封装成数据包中,不需要建立连接;
 *      每个数据报的大小在限制在64k;
 *      因无连接,是不可靠协议;
 *      不需要建立连接,速度快.
 * Socket套接字:
 *      网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字.
 * Socket原理机制:
 *      通信的两端都有Socket;
 *      网络通信其实就是Socket间的通信;
 *      数据在两个Socket间通过IO传输.
 * UDP通信的步骤:
 *      A:创建DatagramSocket与DatagramPacket类
 *      B:建立发送端,接收端;
 *      C:建立数据包;
 *      D:调用Socket的发送接收方法;
 *      E:关闭Socket;
 *      F:发送端与接收端是两个独立的运行程序.
 * DatagramSocket类:此类表示用来发送和接收数据报包的套接字.

案例代码

/* * 使用线程,不断发送数据 */
public class SendData {
    public static void main(String[] args) throws IOException,
            UnknownHostException {
        // 创建发送端对象,绑定到本地的12310端口,不指定端口时,默认使用的本机上可用的端口号
        final DatagramSocket ds = new DatagramSocket(12311);
        // 创建发送数据包
        byte[] bys = new byte[1024];
        // 设定发送到对方的数据,长度,地址,IP地址,端口
        final DatagramPacket dp = new DatagramPacket(bys, bys.length,
                InetAddress.getLocalHost(), 12309);
        new Thread() {
            @Override
            public void run() {
                // 设置数据并发送
                Scanner sc = new Scanner(System.in);
                while(true) {
                    String line = sc.nextLine();
                    if(line.equals("somnus")) {
                        break;
                    }
                    dp.setData(line.getBytes());
                    try {
                        ds.send(dp);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }finally {
                        // 释放资源
                        // ds.close();
                    }
                }
            }
        }.start();
    }
}

/* * 使用线程,不断接收数据 */
public class ReceiveData {
    public static void main(String[] args) throws IOException {
        // 创建接收端套接字,绑定到本地的12309端口上
        final DatagramSocket ds = new DatagramSocket(12309);
        // 创建接收数据的套接字
        byte[] bys = new byte[1024];
        final DatagramPacket dp = new DatagramPacket(bys, bys.length);
        // 接收数据并输出
        new Thread() {
            @Override
            public void run() {
                try {
                    while(true) {
                        ds.receive(dp);
                        System.out.println(dp.getAddress().getHostAddress()+":"+new String(dp.getData(), 0, dp.getLength()));
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }finally {
                    // 释放资源
                     ds.close();
                }
            }
        }.start();

    }
}

1.3 TCP通信编程

 * TCP通信:
 *      建立连接,形成传输数据的通道;
 *      在连接中进行大数据量传输;
 *      通过三次握手完成连接,是可靠协议;
 *      必须建立连接,效率会稍低.
 * TCP通信步骤:
 *      A:创建Socket客户端和ServerSocket服务端对象;
 *      B:建立客户端和服务器端;
 *      C:建立连接后,通过Socket中的IO流进行数据的传输;
 *      D:关闭socket;
 *      E:同样,客户端与服务器端是两个独立的应用程序.

案例代码

/* * 将文件上传到服务器,客户端 */
public class UpCilent {
    public static void main(String[] args) throws IOException {
        // 获取文件路径
        File file = getFile();
        // 将文件名上传到服务器进行校验是否存在
        Socket client = new Socket("127.0.0.1", 12306);
        // 创建输出流对象
        BufferedOutputStream bos = new BufferedOutputStream(client.getOutputStream());
        // 向服务器发送文件名
        String fileName = file.getName();
        bos.write(fileName.getBytes());
        // 将缓冲区的数据刷出
        bos.flush();
        // 创建输入流对象
        BufferedInputStream bis = new BufferedInputStream(client.getInputStream());
        // 获取服务器对文件名校验的结果
        byte[] bys = new  byte[1024];
        int len = bis.read(bys);
        String result = new String(bys, 0, len);
        if("存在".equals(result)) {
            System.out.println("您要上传的文件已经存在,不能重复上传!");
            client.close();
            return;
        }
        // 文件不存在,则上传
        BufferedInputStream bis2 = new BufferedInputStream(new FileInputStream(file));
        while((len = bis2.read(bys)) != -1) {
            bos.write(bys, 0, len);
            bos.flush();
        }
        // 释放资源
        bis2.close();
        client.close();
    }
    public static File getFile() {
        // 定义键盘录入对象
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个文件的路径名:");
        while(true) {
            File file = new File(sc.nextLine());
            if(!file.exists()) {
                System.out.println("您输入的文件路径不存在,请重新输入:");
            } else if(file.isDirectory()) {
                System.out.println("您输入的是文件夹路径,请输入文件路径:");
            } else {
                return file;
            }
        }
    }
}

/* * 上传文件到服务器,服务器端 */
public class FileServer {
    public static void main(String[] args) throws IOException {
        // 创建服务器socket对象
        ServerSocket server = new ServerSocket(12306);
        // 创建存储接收客户端文件的文件夹
        final File update = new File("update");
        if(! update.exists()) {
            update.mkdir();
        }
        // 持续接收客户端连接
        while(true) {
            final Socket s = server.accept();
            // 创建线程接收客户端连接
            new Thread() {
                public void run() {
                    try {
                        BufferedInputStream bis = new BufferedInputStream(s.getInputStream());
                        BufferedOutputStream bos = new BufferedOutputStream(s.getOutputStream());
                        byte[] bys = new byte[1024];
                        int len = bis.read(bys);
                        String fileName = new String(bys, 0, len);
                        File file = new File(update, fileName);
                        if(file.exists()) {
                            bos.write("存在".getBytes());
                            bos.flush();
                            // 文件存在,结束程序
                            s.close();
                            return;
                        } else {
                            // 文件不存在则返回标识
                            bos.write("不存在".getBytes());
                            bos.flush();
                        }
                        // 如果文件不存在,则上传
                        BufferedOutputStream bos2 = new BufferedOutputStream(new FileOutputStream(file));
                        while((len = bis.read(bys)) != -1) {
                            bos2.write(bys, 0, len);
                            bos2.flush();
                        }
                        // 释放资源
                        bos2.close();
                        s.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }.start();
        }
    }
}

本文转载自:http://blog.csdn.net/l631106040120/article/details/70188561

共有 人打赏支持
S
粉丝 0
博文 34
码字总数 0
作品 0
成都
Java程序员必读书单,家族又添新成员

点击关注异步图书,置顶公众号 每天与你分享IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书。 ——异步小编 有些革命出其不意地吸引了全世界的眼球。Twitter、Linux操作系统和...

异步社区 ⋅ 05/09 ⋅ 0

【目录导航】JAVA零基础进阶之路

【JAVA零基础入门系列】(已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day6 Java字符串 Day7 Java输入与输出...

MFrank ⋅ 06/21 ⋅ 0

Java开发|Java新手应该怎么学习|2018年Java走势|

微信跳一跳你玩过吗,你知道怎么用Java开发出来吗?有时间可以研究一下!言归正传! 在2017回,java,发展程度超出我们的想象,对技术的要求也越来越高,从最初的前端、后端的布局,目前整个堆...

糖宝_d864 ⋅ 06/08 ⋅ 0

Java怎么学?2018最新Java学习路线,技术要求与项目推荐详解!

关注小编吧!! 回顾2017年,java发展的程度超乎了我们的想象,对技术的要求也越来越高,从原先的前端,后端的分布,到现在企业要求的全栈,对于个人能力的要求是逐步提高的,那我们现在究竟...

qq_41781067 ⋅ 05/23 ⋅ 0

学习大数据需要Java基础吗?

近几年,很多人都听到过一个名词“大数据”也有一部分人选择学习了解大数据,那么大数据到底是什么,学习大数据需要有Java基础吗? 推荐一个大数据学习交流群 119599574每天晚上20:10都有一节...

大数据大咖 ⋅ 06/10 ⋅ 0

学编程,学java还是大数据、android?平均月薪23k以上告诉你方向

学编程,学java还是大数据、android?有不少同学在纠结中,最近有不少初学者来问到,学习大数据,学习spark,公司主要使用那些语言编写,每听到这一个问题,起码还是很不错的,证明你已经开始...

编程南风 ⋅ 05/30 ⋅ 0

从Java小白到架构师必须要看的书籍,真正的“武林秘籍”!

少年,我看你骨骼精奇,将是未来万中无一的IT精英,很是适合学JAVA。维护世界和平就看你的了,我这里有能让你成为IT精英的办法!还不来看看! 基础类 1、《Thinking in Java》,入门第一位是...

启示录是真的 ⋅ 05/25 ⋅ 0

书单丨5本Java后端技术书指引你快速进阶

一名Java开发工程师 不仅要对Java语言及特性有深层次的理解 而且需要掌握与Java相关的 框架、生态及后端开发知识 本文涉及多种后端开发需要掌握的技能 对于帮助提高开发能力非常有帮助 NO.1...

Java高级架构 ⋅ 05/30 ⋅ 0

Python 爬取 11 万 Java 程序员信息竟有这些重大发现!

一提到程序猿,我们的脑子里就会出现这样的画面: 或者这样的画面: 心头萦绕的字眼是:秃头、猝死、眼镜、黑白 T 恤、钢铁直男…… 而真实的程序猿们,是每天要和无数数据,以及数十种编程语...

p柯西 ⋅ 06/19 ⋅ 0

Java编程基础知识点和技术点归纳

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰 ⋅ 05/23 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Mahout基于内存的DataMode 推荐引擎Demo2

Mahout基于内存的DataMode 推荐引擎Demo2 //注释的部分是基于文件也可以理解为基于日志文件的, //DataModel 可以有很多种,实现abstractDataMode的子类,原则上都可以作为数据源,个人觉得,...

xiaomin0322 ⋅ 11分钟前 ⋅ 0

Docker部署Tomcat及Web应用

一、在线下载docker yum install -y epel-releaseyum install docker-io # 安装dockerchkconfig docker on # 加入开机启动service docker start # 启动docker服务 1 ...

Jeam_ ⋅ 11分钟前 ⋅ 0

研发运营一体化能力成熟度模型

研发运营一体化是指在 IT 软件及相关服务的研发及交付过程中,将应用的需求、开发、测试、部 署和运营统一起来,基于整个组织的协作和应用架构的优化,实现敏捷开发、持续交付和应用运营的无...

stars永恒 ⋅ 16分钟前 ⋅ 0

jQuery缩小放大触发事件

jquery的resize()方法使用 <html> <head> <script type="text/javascript" src="/jquery/jquery.js"></script> <script type="text/javascript"> var i = 0; $(document).ready(function(){ ......

RobertZou ⋅ 17分钟前 ⋅ 0

eclipse python 搭建

https://jingyan.baidu.com/article/9113f81b68ebce2b3214c7e0.html https://www.cnblogs.com/ZhangRuoXu/p/6397756.html https://blog.csdn.net/zhangphil/article/details/78962159 字符集......

之渊 ⋅ 17分钟前 ⋅ 0

weex,react native,flutter

weex: 一次编写,处处运行 RN: 学一次,到处写(针对安卓,IOS平台特性 各自写,会有很大一部分是一样的代码) 这些方案是否真正的解决了跨平台问题呢?从目前的状况来看,很显然是没有的,因...

东东笔记 ⋅ 23分钟前 ⋅ 0

Spring Cloud微服务分布式云架构-集成项目

Spring Cloud集成项目有很多,下面我们列举一下和Spring Cloud相关的优秀项目,我们的企业架构中用到了很多的优秀项目,说白了,也是站在巨人的肩膀上去整合的。在学习Spring Cloud之前大家必...

明理萝 ⋅ 28分钟前 ⋅ 1

SpringMVC图片上传问题解决

当我们上传图片时一直发现: MultipartFile file = null; if (request instanceof MultipartHttpServletRequest) 匹配不上, 解决方案: 在前端xml加入如下配置代码即可 <!-- 图片上传bean --...

泉天下 ⋅ 31分钟前 ⋅ 0

Spring表达式语言(SpEL)

1、SpEL引用 Spring EL在bean创建时执行其中的表达式。此外,所有的Spring表达式都可以通过XML或注解的方式实现。下面将使用Spring表达式语言(SpEL),注入字符串,整数,Bean到属性。 SpEL的...

霍淇滨 ⋅ 46分钟前 ⋅ 0

Gradle使用阿里云镜像

gradle 生命周期中有一个初始化( Initialization )的过程,这个过程运行在 build script 之前,我们可以在这个地方做一点系统全局的设置,如配置仓库地址。 你可以在以下几个位置实现仓库地址...

明MikeWoo ⋅ 55分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部