摘要:本篇文章主要讲解java网络编程
0、Intro
0.1 计算机网络
计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统
0.2 网络编程的目的
传播信息、数据交换、通信
0.3 需要什么
- 如何准确的定位网络上的一台主机:地址+端口。还需要定位到计算机上的某个资源(eg进程)
- 找到了这个主机,如何传输数据
javaweb:网页编程:B/S架构
网络编程:TCP/IP:C/S架构
0.2 网络通信的要素
如何实现网络的通信:
通信双方的地址:
- IP:
- 端口号:
规则:网络通信的协议
http、ftp、smtp(邮箱)、tcp、utp
网络编程中两个主要问题
- 如何准确定位到网络上的一台或多台主机(ping域名能得到IP地址)
- 找到主机之后如何进行通信
网络编程中的要素
IP和端口号——→IP类、端口类
网络通信协议
IP
ip地址:inetAdress
唯一定位一台计算机
127.0.0.1:本机 localhost
ip地址的分类
ipv4、ipv6
ipv4:127.0.0.1 4个字节组成 每个点最大0-255,共42亿个,30亿在北美,2011年用尽
ipv6:128个二进制位,采用16进制表示,则共8*4个16进制位
公网(互联网)、私网(局域网)
给组织内部使用
192.168.x.x 局域网
域名:
InetAddress类:表示互联网协议地址的类
1 | public static void main(String[] args) { |
主要会用到的:
1 | //静态方法——构造对象 |
1.4 端口
端口表示计算机上的一个程序的进程
一个IP表示一个主机,主机上不同的资源对应不同的端口
不同的进程有不同的端口号,用来区分软件
端口0-65535
TCP、UDP:各65536个 不同的进程在同一个协议下不能具有相同的端口号
端口分类:
公有端口 0-1023 这些端口号供一些基本服务使用
HTTP:80
HTTPS:443:访问百度其实就是访问了百度对应服务器的443端口
FTP:21
Telent:23
程序注册端口:1024-49151
Tomcat 8080
Mysql:3306
Oracle:1521
动态(私有)端口:49152-65535
常见的Dos命令
netstat -ano 查看所有端口(cmd命令)
netstat -ano|findstr “5900” 查看进程对应的端口(??迷)
tasklist|findstr “5900” 查看占用指定端口的进程
进程中的PID是进程号
ctrl+shift+esc
Socket套接字??
InetSocketAddress类:此类实现 IP 套接字地址(IP 地址 + 端口号)
1 | InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1",8080); |
通信过程:信息只有从一台主机的端口到另一台主机的对应端口,才能被正确处理
1.5 通信协议
协议:约定
网络通信协议:速率、传输码率、代码结构,传输控制
TCPIP协议簇——实际上是一组协议
- TCP:用户传输协议(电话)
- UDP:用户数据报协议(短信)
TCP:
连接:稳定
三次握手
最少三次,才能保证稳定连接
A:你瞅啥?
B:瞅你咋地?
A:干一场!
四次挥手
见计算机网络部分
客户端、服务端
传输完成、释放连接、效率低
UDP:
- 不连接:不稳定
- 客户端、服务端:没有明确的界限
- 不管有没有准备好,都可以发给你
- DDOS:洪水攻击!发一堆垃圾,堵塞端口
网络编程又称为套接字编程:
Socket:套接字、插座。客户端访问服务器相当于插头插入插座
1.6 TCP实现聊天
客户端、服务器
什么是套接字:
网络套接字又叫网际插座,在英文中是Internet Socket。在网络中,套接字扮演的角色正如插座一样,它是一个端点,可以与网络中的其它套接字建立连接。
IP地址和端口号就构成了一个网络中的唯一标识符,即套接字。
套接字就是用来建立连接的
Socket实质上提供了进程通信的端点。进程通信之前,双方首先必须各自创建一个端点,否则是没有办法建立联系并相互通信的。正如打电话之前,双方必须各自拥有一台电话机一样。
客户端:
- 连接服务器:Socket
- 发送消息:
服务端:
- 建立服务端口
- 等待用户的连接accept
- 接收用户的消息
补充getBytes
1 | byte[] b_gbk = "深".getBytes("GBK"); |
将分别返回“深”这个汉字在GBK、UTF-8、ISO8859-1和unicode编码下的byte数组表示,此时b_gbk的长度为2,b_utf8的长度为3,b_iso88591的长度为1,unicode为4。
文件上传
Q1:关于处理流和节点流的书写格式
Q2:ByteArrayOutputStream???配这个getBytes???
Q3:三线程?
为什么上面那个没事?
阻塞原因:
套接管中为空,接收端等待发送端发送
套接管发送端不终止的话,接收端就会持续等待,因此两个进程死锁
初始Tomcat
服务端
- 自定义(S)→Tomcat服务器(S)
客户端
- 自定义(C)→浏览器(B)