网络编程

一、 网络常识

1. 什么是计算机网络 ?

分布在不同地域的计算机, 通过硬件等网络设备使用通信线路互相连接形成的一个网格系统.

计算机网络, 可以很方便的进行 信息的传递, 资源的共享 !

2. 什么是计算机的IP地址 ?

IP地址 是计算机在互联网中的唯一标识 . 就像人在社会中的身份证号码.

本机IP:

​ 127.0.0.1

​ localhost

3. 什么是 网络中 网站的域名 ?

域名可以简单的理解为, IP地址的别名. 更方便记忆, 当输入域名后(例如www.baidu.com) , 计算机会访问域名解析商 , 然后得到ip地址, 再进行访问

4. 什么是计算机的端口号

端口号的范围 0-65535 之间 .

与ip地址很相似, IP地址是计算机在网络中的唯一标识 .

端口号是计算机中 程序的标识 . 用于在一台计算机中区分不同的应用程序

端口号在使用时 , 应尽量避免0-1024之间的端口号, 因为已经被一些知名的软件 和 windows操作系统所占用了.

5. 什么是计算机之间的通信协议 ?

是计算机与计算机之间交流的标准 .

是对数据的 传输速率, 传入接口, 步骤控制 出错控制 等等 制定的一套标准 !

常用的通信协议:

  • http协议 : 超文本传输协议 – 80端口号
  • https协议: 安全的超文本传输协议-- 443端口号
  • ftp协议: 文件传输协议-- 21端口号
  • TCP协议: 传输控制协议
  • UDP协议: 数据报协议

二、网络 编程程序的分类

  1. B/S 程序 : 浏览器与服务器程序

  2. C/S 程序 : 客户端与服务器程序

三、TCP协议 - OSI网络模型

指的是从一台计算机的软件中, 将数据发送到另一台计算机的软件中的过程.

七层网络模型: 应用层 / 表现层 / 会话层 / 传输层 / 网络层 / 数据链路层 / 物理层

四、TCP与UDP

4.1 TCP(传输控制协议)

TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可毫无差错的数据传输。

TCP协议客户端与服务器连接时, 存在三次握手操作, 确保消息能准确无误的发送。

  • 第一次握手:客户端向服务器端发出连接请求,等待服务器确认。
  • 第二次握手:服务器端向客户端回送一个响应,通知客户端收到了连接请求。
  • 第三次握手:客户端再次向服务器端发送确实信息,确认连接。

由于这种面向连接的特性,TCP协议可以保证传输数据的安全,所以应用十分广泛,例如下载文件、浏览网页。

断开连接是时 , 存在四次挥手操作

4.2 UDP(用户数据报协议)

UDP协议是一个面向无连接的协议。传输数据时,不需要建立连接,不管对方端服务是否启动,直接将数据、数据源和目的地都封装在数据包中,直接发送。每个数据包的大小限制在64K以内。它是不可靠协议,所以传输速度快,但是容易丢失数据。日常应用中,例如视频会议、QQ聊天等。

五、TCP 协议 的 C/S程序

需要使用到两个类, 来编写TCP协议的 CS程序 .

  1. ServerSocket :搭建服务器

  2. Socket:搭建客户端

两方使用socket(套接字 , 通信端点) 进行交流

5.1 ServerSocket

用于创建服务器 . 创建完毕后, 会绑定一个端口号.

然后此服务器可以等待客户端连接 .

每连接一个客户端 , 服务器就会得到一个新的Socket对象, 用于跟客户端进行通信 .

常用构造方法:

ServerSocket(int port);

​ 创建一个基于TCP/IP协议的服务器 , 并绑定指定的端口号.

​ 注意: 参数port的范围是: 0-65535 (建议1025-65535)

常用方法:

Socket accept();

​ 等待客户端连接 .

​ 此方法会导致线程的阻塞!

​ 直到一个新的客户端连接成功, return Socket对象后, 线程在继续执行.

void close();

​ 释放占用的端口号 , 关闭服务器

5.2 Socket

是两台计算机之间通信的端点 , 是网络驱动提供给应用程序编程的一种接口 一套标准, 一种机制 .

构造方法:

Socket(String ip,int port) ****

​ 创建一个套接字, 并连接指定ip和端口号的 服务器.

​ 参数1. 服务器的ip地址

​ 参数2. 服务器软件的端口号…

常用方法:

- OutputStream getOutputStream(); 返回的是 , 指向通信的另一端点的输出流

- InputStream getInputStream(); 返回的是 , 指向通信的另一端点的输入流

- void close(); 关闭套接字

注意:

​ 在网络编程时, 获取输入输出流的操作 ,对于客户端与服务器来说是相对的

​ 客户端的输入流, 输入的是服务器的输出流 输出的内容.

​ 客户端的输出流, 输出到了服务器的输入流中.

​ 所以 在使用时, 需要注意以下一点规则:

​ 客户端与服务器获取流的顺序必须是相反的:

​ 例如:

​ 客户端先得到了输入流 , 那服务器必须先获取输出流

案例 echo程序

服务器端:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;public class Demo {/*** TCP协议的网络*/public static void main(String[] args) throws IOException {//启动服务器, 并侦听8801端口号ServerSocket serverSocket = new ServerSocket(8801);System.out.println("服务器启动完毕");//等待客户端的连接Socket socket = serverSocket.accept();System.out.println("一个客户端连接了");//获取输出流OutputStream outputStream = socket.getOutputStream();//将字节输出流, 转换为打印流PrintStream ps = new PrintStream(outputStream);ps.println("欢迎你连接服务器");//获取输入流InputStream is = socket.getInputStream();//将字节输入流, 转换为字符输入流,并转换为逐行读取流BufferedReader br = new BufferedReader(new InputStreamReader(is));String text = br.readLine();System.out.println("服务器端收到客户端的回复:" + text);System.out.println("服务器程序执行结束");}
}

运行结果:

客户端:

import java.io.*;
import java.net.Socket;public class ClientDemo {//客户端public static void main(String[] args) throws IOException {//1. 连接服务器Socket socket = new Socket("127.0.0.1",8801);//得到输入流InputStream is = socket.getInputStream();//将字节输入流, 转换为字符输入流,并转换为逐行读取流BufferedReader br = new BufferedReader(new InputStreamReader(is));String text = br.readLine();System.out.println("客户端接到消息:" + text);//得到输出流OutputStream outputStream = socket.getOutputStream();//将输出流, 转换为打印流PrintStream ps = new PrintStream(outputStream);ps.println("服务器你好");}
}

运行结果:

在服务器中加入多线程:

//服务器端
public class Demo {/*** TCP协议的网络*/public static void main(String[] args) throws IOException {//搭建服务器ServerSocket serverSocket = new ServerSocket(8801);System.out.println("服务器启动完毕");//等待客户端的连接while(true){Socket socket = serverSocket.accept();new Thread(){@Overridepublic void run() {try{InputStream is = socket.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is));} catch (IOException e) {e.printStackTrace();}}}.start();System.out.println("一个客户端连接了");}}
}//客户端
public class ClientDemo {public static void main(String[] args) throws IOException {Socket socket = new Socket("127.0.0.1",8801);}
}

六、UDP 协议(数据报) 程序 了解

用户数据报协议, 与tcp协议不同, UDP的连接是不可信的. 数据发送的成功与失败 与 数据报是无关的

使用到两个类:

1.数据报套接字: DatagramSocket :用于发送 与 接收数据包的Socket

  • 构造方法:

    ​ DatagramSocket(int port);

    ​ 参数: 端口号

  • 常用方法:

    ​ close() : 关闭套接字.

    ​ send(DatagramPacket dp) :将一个数据包dp 发送出去

    ​ receive(DatagramPacket dp) :接收一个数据包, 并存储到参数dp中.

2.数据包 DatagramPacket :用于发送或接收数据时, 盛放数据的对象!

  • 构造方法:

    1. 用于发送数据时, 组装数据的 构造方法.

      DatagramPacket(byte[] bytes,int startIndex,int len,InetAddress ip,int port);

      ​ 参数1—要发送的数据, 是字节数组的形式

      ​ 参数2—有效数据 在数组中的起始位置

      ​ 参数3— 有效数据 在数组中的长度

      ​ 参数4— 当前这个数据包, 准备发送到的IP地址, InetAddress 这个类的对象, 用于描述 IP .

      ​ 得到InetAddress对象的方式: InetAddress ip = InetAddress.getByName(“192.168.102.228”);

      ​ 参数5— 当前这个数据包, 准备发送到目标计算机的哪个端口号.

    2. 用于接收数据时, 存储数据的构造方法.

      创建的是不包含数据的数据包, 用于在接收到数据后, 存储数据 !

      DatagramPacket(byte[] bytes,int len)

      ​ 参数1. 用于存储数据的 数组

      ​ 参数2. 允许存储的最大长度

  • 常用方法:

    1. byte[] getData():用于获取数据包中的有效字节数组
    2. int getLength:用于获取数据包中的有效数据的长度.

七、InetAddress描述IP地址的类

​ 得到InetAddress对象的方式:

​ InetAddress ip = InetAddress.getByName(“192.168.102.228”);

​ 在UDP协议中,通过数据包DatagramPacket的getAddress方法, 可以得到数据包来自哪个ip

​ 在TCP协议中,通过套接字Socket的getInetAddress方法, 可以得到套接字连接的ip地址.

  • 常用方法:
  1. String getHostAddress() :ip地址字符串

  2. String getHostName() :计算机名称, 当名称无法获取时, 获取的为ip地址.

八、URL 类 (统一资源定位符)(网址)

案例1. 下载文件

public class ClientDemo { public static void main(String[] args) throws Exception { Scanner input = new Scanner(System.in);System.out.println("欢迎使用嘿嘿雷下载器"); System.out.println("请输入要下载的文件网址:");String urlString = input.nextLine(); System.out.println("请输入要保存的文件名称:"); System.out.println("(文件默认下载位置:d盘download文件夹中)"); String fileString = input.nextLine(); //1. 确保文件夹存在 File dir = new File("d://download");if(!dir.exists()) { dir.mkdirs(); }//2. 创建一个文件输出流, 用于输出数据 FileOutputStream fos = new FileOutputStream(new File(dir,fileString));//3. 今天学习的新内容//3.1 创建一个网址对象(统一资源定位符) URL url = new URL(urlString);//3.2 打开链接 , 并得到链接对象 URLConnection conn = url.openConnection(); //3.3 通过连接对象, 获取连接到的文件的输入流 InputStream is = conn.getInputStream(); //[3.4] 获取网址指向文件的 大小 long fileLength = conn.getContentLengthLong(); //3.5 循环读取 并写出到fos中 //用于存储 每次读取的数据 byte[] bytes = new byte[1024*1024]; //用于存储每次读取的数据长度int len = -1; //用于存储已读取的所有数据的长度 int count = 0;    while((len = is.read(bytes))!=-1) { //将每次循环读取的bytes 写出到文件中fos.write(bytes,0,len); count+=len; System.out.println("下载中:"+(count/(fileLength/100))+"%");}is.close(); System.out.println("文件下载完毕"); }
}

案例2.传输参数, 并下载数据

static Scanner input = new Scanner(System.in);
public static void main(String[] args) throws Exception {System.out.println("自动P图小程序:"); System.out.println("请选择菜单:"); int menu = menu(); System.out.println("请输入名字:"); String name = input.nextLine(); String name2 = URLEncoder.encode(name, "UTF-8"); //1. 得到网址, 这个网址指向的内容 是另一个图片的网址 String urlString = "http://itdage.cn/B/img?id="+menu+"&s1="+name2; URL url = new URL(urlString); //2. 打开链接 URLConnection conn = url.openConnection(); //3. 得到输入流 //3.1 因为我们这个网址的内容 只是一个图片的地址, 也就是一行文字, 所以我们将这个流转换为逐行读取流, 读取一行文本就可以了 InputStream is = conn.getInputStream(); //3.2 转换为字符流 InputStreamReader isr = new InputStreamReader(is); //3.3 转换为逐行读取流 BufferedReader br = new BufferedReader(isr);String imgUrlString = br.readLine();System.out.println("图片已制作完成 , 地址:"+imgUrlString);
}public static int menu(){ System.out.println("1. 捐*补助");//1 System.out.println("2. 登月插旗");//2 娃娃System.out.println("3. 娃娃订单");//3 娃娃System.out.println("4. 相思癌");//4相思癌 System.out.println("5. 孕检证明"); System.out.println("6. 玛莎拉蒂订单");//6.玛莎拉蒂订单 System.out.println("7. 马云湖畔大学");// System.out.println("122. 男举牌 娶你");// System.out.println("123. 女举牌 生猴子");// String text = input.nextLine(); int m = -1;try {m = Integer.parseInt(text); }catch(Exception e) { }if(m<1 || (m>7&&m<122) || m>123) {return menu(); }return m;
}

核心类库——网络编程相关推荐

  1. 第一章 网络编程基础

    网络编程基础 1. 网络编程基础概念 对于C/C++编程人员来说,网络编程的本质实际就是使用系统提供的网络编程接口,完成应用程序的网络数据收发功能. 2. 网络编程核心概念 网络编程中一般我们会经常听 ...

  2. Java核心类库篇8——网络编程

    Java核心类库篇8--网络编程 1.七层网络模型 OSI(Open System Interconnect),即开放式系统互联,是ISO(国际标准化组织)组织在1985 年研究的网络互连模型. 当发 ...

  3. 【04 核心类库 6.网络编程】

    文章目录 6. 网络编程 6.1 七层网络模型 6.2 相关的协议(笔试题) (1)协议的概念 (2)TCP协议 (3)UDP协议 6.3 IP地址(重点) 6.4 端口号(重点) 6.5 基于tcp ...

  4. Java核心类库之(网络编程:网络编程入门、UDP通信程序、TCP通信程序)

    目录 1 网络编程入门 1.1 网络编程概述 1.2 网络编程三要素 1.3 IP地址 1.4 InetAddress的使用 1.5 端口 1.6 协议 2 UDP通信程序 2.1 UDP通信原理 2 ...

  5. Python 核心编程(第二版)——网络编程

    1. 介绍 服务器是一个软件或硬件,用于提供客户需要的"服务".服务器存在的唯一目的就是等待客户的请求,给这些客户服务,然后再等待其它的请求. 2. 套接字:通讯端点 套接字是一种 ...

  6. Python核心编程(第3版)第2章网络编程中关于tcp/udp服务器和客户端实现代码的运行出错的修正

    在Python核心编程(第3版)第2章网络编程中, 关于tcp/udp服务器和客户端实现代码的运行会出现 ['str' does not support the buffer interface]之类 ...

  7. NIO网络编程实战之简单多人聊天室

    NIO网络编程实战 利用NIO编程知识,实现多人聊天室. 1. NIO编程实现步骤 第一步:创建Selector 第二步:创建ServerSocketChannel,并绑定监听端口 第三步:将Chan ...

  8. ACE网络编程模式比较

    ACE将网络编程进行了模式化,以便你不必每次都重复相同的代码. 网络编程需要处理的事情多括中断,并发,多线程等,程序格式相对固定,但是健壮的网络程序则相对复杂.为了处理这些情形,ACE内建了几个网络编 ...

  9. [C# 网络编程系列]专题十二:实现一个简单的FTP服务器

    引言: 休息一个国庆节后好久没有更新文章了,主要是刚开始休息完心态还没有调整过来的, 现在差不多进入状态了, 所以继续和大家分享下网络编程的知识,在本专题中将和大家分享如何自己实现一个简单的FTP服务 ...

最新文章

  1. 【经验】配置Anaconda源
  2. 深度学习入门课程推荐
  3. python使用matplotlib可视化、使用matplotlib可视化scipy.misc图像、自定义使用grey灰色映射、将不同亮度映射到不同的色彩、并添加颜色标尺
  4. ROS系统实现 tf坐标系广播与监听
  5. 如何节省 1TB 图片带宽?解密极致图像压缩
  6. 二叉树的先序/中序/后序/层次遍历
  7. html表单没有csrf保护,如何在Symfony 1.4中为表单禁用CSRF保护/验证
  8. opencv java 摄像头_使用OpenCV Java创建Windows摄像头扫码程序
  9. HDU4462-稻草人
  10. 使用openssl,实现输入和输出都是字符串的类型,注意:输入最好是16的倍数
  11. 重定向 302 与localhost 学习笔记
  12. 深度学习-吴恩达-笔记-7-超参数调试、Batch正则化和程序框架
  13. SAS数据挖掘实战篇【五】
  14. 开源视频质量评价工具: Evalvid
  15. 《Perl语言入门》学习笔记
  16. stm32F407按键例程安富莱
  17. 为什么总跳到国内版(cn.bing.com)?New Bing使用全攻略
  18. 一台计算机连接两个投影,事实:如何将两个外接显示器连接到笔记本电脑以同时实现三个屏幕?...
  19. 甲方和乙方怎么区别?
  20. 电影数据分析(大数据分享)

热门文章

  1. 编程如何实现使用新建的Revit楼板族,创建楼板构件
  2. 视频过大上传不了,怎么压缩变小
  3. 高斯消元_fortran
  4. 干货 | 数据安全和个人信息保护审计的方法研究
  5. C++复习(七)——寻找数字计算利率
  6. 比较两张表的数据是否相同
  7. ZZULIOJ 1768 Lovely Circular And Linear
  8. Eclipse中如何调试(Debug)代码
  9. 分享83个ASP整站程序源码,总有一款适合您
  10. shell 拼接换行字符串_Linux中shell字符串分隔、字符串替换、字符串拼接