Java网络编程

### 网络编程

### 1.1概述

地球村

![](https://oscimg.oschina.net/oscnet/up-bd7e223faf69f9045701baeac3c0a988944.png)

**计算机网络**

**计算机网络**是指将***地理位置**不同*的具有独立功能的**多台du计算机及其外部设备**,**通过通信线路连接**起来,在**网络操作系统**,**网络管理软件**及**网络通信协议**的管理和协调下,**实现资源共享和信息传递**的计算机系统。

![](https://oscimg.oschina.net/oscnet/up-1a3ebde3956a36c4bed60d4cd168011e2bc.png)

### 1.2网络通信的要素

如何实现网络通信?

**通信双方地址:**

1. ip
2. 端口号

**规则:网络通信协议**

TCP/IP参考模型:

OSI七层协议

**七层**划分为:**应用层、表示层、会话层、传输层、网络层、数据链路层、物理层**。

**五层**划分为:**应用层、传输层、网络层、数据链路层、物理层**。

**四层**划分为:**应用层、传输层、网络层、网络接口层**。

![img](https://img-blog.csdn.net/20180802094638614?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Rhb3RvbmduaW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

![](https://oscimg.oschina.net/oscnet/up-c2d7cad9688d04ecc183dca3c924c72700a.png)

**小结:**

1. 网络编程中有两个主要问题
- 如何准确的定位到网络上的一台或多台主机
- 找到主机之后如何进行通信
2. 网络编程中的要素
- IP和端口号 (建立IP类即对象)
- 网络通信协议 (建立UDP/TCP类即对象)
3. 万物皆对象

### 1.3IP

IP地址:InetAddress

- 唯一定位一台网络上计算机

- 127.0.0.1;本机localhost

- IP地址分类
- ​ ipv4/ipv6
- IPV4 127.0.0.1 4个字节组成 。0~255,42亿;30亿在北美。亚洲4亿
- IPV6 fe80::dc0c:8236:1d55:7042%17 ,128位,8个无符号整数
- 公网(互联网)-私网(局域网)
- ​ ABCD类地址
- 192.168.xx.xx,专门给组织内部使用的

- 域名:解决记忆IP问题!
- ​ IP:www.jd.com

```java
//查询本机地址
InetAddress inetAddress1 = InetAddress.getByName("127.0.0.1");
system.out.println(inetAddress1);
InetAddress inetAddress3 = InetAddress.getByName("localhost");
system.out.println(inetAddress3);
InetAddress inetAddress4 = InetAddress.getLocalHost();
system.out.println(inetAddress4);
//查询网站ip地址
InetAddress inetAddress2 = InetAddress.getByName("www.baidu.com");
system.out.println(inetAddress2);
//常用方法
system.out.println(inetAddress2.getAddress())﹔
system.out.println(inetAddress2.getCanonicalHostName());
system.out.println(inetAddress2.getHostAddress());
System.out.println(inetAddress2.getHostName());

```

### 1.4端口

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

- 不同的进程有不同的端口号!用来区分软件

- 被规定0~65535

- TCP,UDP:65535*2

- 端口分类

- 公有端口号:0~1023
- HTTP:80
- HTTPS:443
- FTP:21
- Telent:23

- 程序注册端口:1024~49151
- Tomcat:8080
- MySql:3306
- Oracle:1521

- 动态、私有:49152~65535

``` #查看
netstat -ano #查看所有的端口
netstat -ano|findstr "5900" #查看指定的端口
tasklist|findstr "8696" #查看指定端口的进程
```

![](https://oscimg.oschina.net/oscnet/up-61fb40fc2a61c796c1b54d6580a6c010a9b.png)

### 1.5通信协议

协议:约定,就好比我们现在说的普通话

**网络通信协议**:速率,传输码率,代码结构,传输控制。。。

问题:非常复杂

大事化了:分层

TCP/IP协议簇:实际上是一组协议

重要

- TCP:用户传输协议
- UDP:用户数据报协议

出名的协议:

- TCP
- IP:网络互联协议

TCP与UDP对比

TCP:打电话

- 建立连接,稳定

- 三次握手、四次挥手

- ```
三次握手
A;你瞅啥?
B;瞅你咋地!
A;干一场!

四次挥手
A;我要走了
B;你真的要走了吗
B;你真的真的要走了吗
A;我真的要走了
```

- 客服端、服务器

- 传输完成,释放连接,效率低

UDP:发短信

- 不连接,不稳定
- 客户端、服务器没有明显的界限
- 不管有没有准备好,都发送给你
- 导弹
- DDOS:洪水攻击!(饱和攻击)

### 1.6TCP

##### 文件传输

**客户端**

```java
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

public class TcpClientDemo02 {
public static void main(String[] args) throws IOException {
//获取服务地址端口
Socket socket=new Socket(InetAddress.getByName("127.0.0.1"),9898);
//创建输出
OutputStream outputStream=socket.getOutputStream();
//文件输入
FileInputStream fis=new FileInputStream(new File("asd.jpg"));

byte[] buffer=new byte[1024];
int len;
while ((len=fis.read(buffer))!=-1){
outputStream.write(buffer,0,len);
}
//通过服务器我已输出
socket.shutdownOutput();
//确定服务器接收完毕
InputStream inputStream=socket.getInputStream();
ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
byte[] buffer2=new byte[1024];
int len2;
while ((len2=inputStream.read(buffer2))!=-1){
byteArrayOutputStream.write(buffer2,0,len2);
}
System.out.println(byteArrayOutputStream.toString());
//关闭连接
inputStream.close();
byteArrayOutputStream.close();
fis.close();
outputStream.close();
socket.close();


}
}

```

 

**服务器**

```java
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServerDemo02 {
public static void main(String[] args) throws IOException {
//创建服务
ServerSocket serverSocket=new ServerSocket(9898);
//监听连接
Socket socket=serverSocket.accept();
//获取输入
InputStream inputStream=socket.getInputStream();
//文件输出
FileOutputStream fos=new FileOutputStream(new File("receive.jpg"));
byte[] buffer=new byte[1024];
int len;
while ((len=inputStream.read(buffer))!=-1){
fos.write(buffer,0,len);
}
//通知客户端接收完毕
OutputStream outputStream=socket.getOutputStream();
outputStream.write("收到".getBytes());
//关闭
outputStream.close();
serverSocket.close();
socket.close();
inputStream.close();
fos.close();
}

 

}

```

#### Tomcat

服务器

- 自定义 **S**
- Tomcat服务器 **S**

客户端

- 自定义 **C**
- 浏览器 **B**

### 1.7UDP

 

posted @ 2020-10-18 23:18  V587h  阅读(73)  评论(0)    收藏  举报