java_网络编程

java学习之—网络编程

一、概述

1. 网络编程的目的

​ 无线电台;传播交换信息;数据交换;通信。。。

2. 网络编程的条件

1、如何准确的定位网络上的一台主机 192.168.165.12:端口,定位到这个计算机上的某个资源;

2、找到了这个主机,如何进行通信呢?

**javaweb:**网络编程;B/S

**网络编程:**TCP/IP;C/S

二、网络通信的要素

如何实现网络通信?

通信双方地址:

  • ip;
  • 端口号;
  • 192.168.16.124:5900。

规则:网络通信的协议

TCP/IP参考模型:

OSI七层模型功能对应的网络协议TCP/IP四层概念模型
应用层文件传输,文件管理,电子邮件的信息处理——apduHTTP、TFTP, FTP, NFS, WAIS、SMTP应用层
表示层确保一个系统的应用层发送的消息可以被另一个系统的应用层读取,编码转换,数据解析,管理数据的解密和加密,最小单位——ppduTelnet, Rlogin, SNMP, Gopher
会话层负责在网络中的两节点建立,维持和终止通信,在一层协议中,可以解决节点连接的协调和管理问题。包括通信连接的建立,保持会话过程通信连接的畅通,两节点之间的对话,决定通信是否被终端一斤通信终端是决定从何处重新发送,最小单位——spduSMTP, DNS
传输层定义一些传输数据的协议和端口。传输协议同时进行流量控制,或是根据接收方接收数据的快慢程度,规定适当的发送速率,解决传输效率及能力的问题——tpduTCP, UDP传输层
网络层控制子网的运行,如逻辑编址,分组传输,路由选择最小单位——分组(包)报文IP, ICMP, ARP, RARP, AKP, UUCP网络层
数据链路层主要是对物理层传输的比特流包装,检测保证数据传输的可靠性,将物理层接收的数据进行MAC(媒体访问控制)地址的封装和解封装,也可以简单的理解为物理寻址。交换机就处在这一层,最小的传输单位——帧FDDI, Ethernet, Arpanet, PDN, SLIP, PPP,STP。HDLC,SDLC,帧中继数据链路层
物理层定义物理设备的标准,主要对物理连接方式,电气特性,机械特性等制定统一标准,传输比特流,因此最小的传输单位——位(比特流)IEEE 802.1A, IEEE 802.2到IEEE 802.
  • 小结:

1、网络编程中有两个主要的问题:

​ 1)如何准确的定位到网络上的一台或者堕胎主机;

​ 2)找到注解之后如何进行通信。

2、网络编程中的要素:

​ 1)IP和端口号;

​ 2)网络通信协议。

3、万物皆对象

三、IP

ip地址:InetAddress唯一定位一台网络上的主机

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gmy5mJQ8-1640832044203)(D:\APP-文档\学习笔记\java_网络编程.assets\image-20210328162832435.png)].

  • ip可以唯一定位一台网络主机;

  • 本地ip:127.0.0.1 localhost-本地主机

  • ip地址的分类:

    • ipv4/ipv6

      • ==IPV4:==127.0.0.1, 4个字节组成, 0~255; 42亿,11年已经用尽;
      • IPV6: fe80::9827:677f:ec7d:ac0d%2, 128位; 8个无符号整数 abcde
      2001:0bb2:aaaa:0015:0000:1001:1aaa:1312		// ipV6示例(纯属虚构)
      
    • 公网(互联网)-私网(局域网)

      • ABCD类地址
      • 192.168.xxx.xx;专门给组织内部使用的
    • 域名:记忆IP问题!

      • IP:www.baidu.com

四、端口

端口:计算机上一个程序的进程

  • 不同的进程有不同的端口号!用来区分软件;
  • 端口被规定0~65535
  • TCP/UPD分别有65535个端口,单个协议下,端口号不能冲突
  • 端口分类:
    • 共有端口0~1023
      • HTTP协议默认端口:80
      • HTTPS协议默认端口:443
      • FTP:21
      • Telent:23
    • 程序注册端口:1024~49151,分配用户或者程序
      • Tomcat:8080
      • MySQL:3306
      • Oracle:1521
    • 动态、私有端口:49152~65535
      • IDEA:63342
netstat -ano	# 查看所有端口号
netstat -ano|findstr "5900"		# 查看指定的端口
tasklist|findstr "8696"		# 查看指定端口的进程
  • 谨记两个重要的类:
InetSocketAddress 
InetAddress

五、通信协议

协议:约定,就好比中国人得说普通话!

**网络通信协议:**速率、传输码率、代码结构、传输控制…(非常的复杂)

TCP/IP协议簇:是一组协议而并非一个或者两个协议。

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

TCP | UDP 对比:

  • TCP:打电话

    • 连接,稳定
    • 三次握手 四次挥手
    # 最少需要三次,才能保证稳定连接!
    A:你瞅啥?		// 请求连接
    B:瞅你咋地?	   // 请求响应
    A:干一场!	    // 开始通信
    
    # 依依不舍的断开连接
    A:我要走了!
    B:你真的要走了吗?
    B:你真的真的要走了吗?(再次确认,添狗标配)
    A:我真的要走了!
    
    • 客户端 服务端
    • 传输完成,释放连接,效率低
  • UDP:发短信

    • 不连接,不稳定;
    • 客户端,服务端;没有明确的界限;
    • 不管有没有准备好,都可以发给你…
    • 导弹攻击;
    • DDOS攻击!(洪水/饱和攻击)

六、TCP

客户端:

1、通过Socket连接服务器;

2、发送消息。

// 1.要知道服务器的地址,端口
InetAddress serverIp = InetAddress.getByName("127.0.0.1");
int port = 9999;
// 2.创建一个socket连接
socket = new Socket(serverIp, port);
// 3.发送消息 IO 流
os = socket.getOutputStream();
os.write("您好,我是java小白冲大厂".getBytes());

服务器:

1、建立服务器ipport

2、等待客户端的连接,通过accept进行连接监听;

3、接收消息处理

// 1.我需要一个服务器地址
serverSocket = new ServerSocket(9999);
while (true) {
    // 2.等待客户端连接过来
    socket = serverSocket.accept();
    // 3.读取客户端的消息
    is = socket.getInputStream();
    // 管道流
    baos = new ByteArrayOutputStream();
    byte[] buffer = new byte[1024];
    int len;
    while ((len = is.read(buffer)) != -1) {
        baos.write(buffer, 0, len);
    }
    System.out.println(baos.toString());
}

文件上传

客户端:

// 1.创建一个Socket连接
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);
// 2.创建一个输出流
OutputStream os = socket.getOutputStream();
// 3.文件流
FileInputStream fis = new FileInputStream(new File("dog.jpg"));
// 4.写出文件
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
    os.write(buffer, 0, len);
}

// 通知服务器,我已经传输完了
socket.shutdownOutput();

// 确定服务器接收完毕,才能够断开连接
InputStream is = socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer2 = new byte[1024];
int len2;
while ((len2 = is.read(buffer2)) != -1) {
    baos.write(buffer, 0 ,len2);
}
System.out.println(baos.toString());

// 5.关闭资源
fis.close();
os.close();
socket.close();

服务器:

// 1.创建服务
ServerSocket serverSocket = new ServerSocket(9000);
// 2.监听客户端的连接- 阻塞式监听,会一直等待客户端连接
Socket socket = serverSocket.accept();
// 3.获取输入流
InputStream is = socket.getInputStream();
// 4.文件输出
FileOutputStream fos = new FileOutputStream(new File("receive.jpg"));
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
    fos.write(buffer, 0, len);
}

// 通知客户端文件接收完毕了
OutputStream os = socket.getOutputStream();
os.write("我接收完毕了,你可以断开连接了".getBytes());

// 5.关闭资源
fos.close();
is.close();
socket.close();
serverSocket.close();

七、UDP

无连接:不需要连接,但是需要知道对方的地址!

发送消息:

发送端:

// 1.建立一个Socket
DatagramSocket socket = new DatagramSocket(8080);

// 2.建个数据包
String msg = "你好啊,服务器!";

// 发送目的地址
InetAddress localhost = InetAddress.getByName("localhost");
int port = 9090;
// 数据,数据的起始位置,终止位置
DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port);


// 3.发送数据包
socket.send(packet);

// 4.关闭流
socket.close();

接收端:

// 1.开放端口
DatagramSocket socket = new DatagramSocket(9090);
// 2.接收数据
byte[] buffer = new byte[1024];
// 接收
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
// 阻塞接收
socket.receive(packet);
System.out.println(packet.getAddress().getHostAddress());
System.out.println(new String(packet.getData(), 0, packet.getLength()));
// 关闭
socket.close();

UDP实现聊天室–单向

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DUyGcqLY-1640832044204)(D:\APP-文档\学习笔记\java_网络编程.assets\image-20210329090459140.png)]

UDP实现聊天室-双向

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J647B6wT-1640832044205)(D:\APP-文档\学习笔记\java_网络编程.assets\image-20210329093147558.png)]

  • 多线程实现通信,十分简单!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5vdnR3EX-1640832044206)(D:\APP-文档\学习笔记\java_网络编程.assets\image-20210329093248653.png)]

八、URL

什么是URL(**uniform resource locators**)–>同一资源定位符:https://www.baidu.com


协议://ip地址:端口号/项目名/资源 (五部分最多,可以少但是不能多)

实现聊天室–单向**

UDP实现聊天室-双向

  • 多线程实现通信,十分简单!

八、URL

什么是URL(**uniform resource locators**)–>同一资源定位符:https://www.baidu.com


协议://ip地址:端口号/项目名/资源 (五部分最多,可以少但是不能多)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值