网络编程
网络编程:可以实现多台电脑之间相互通信操作。
在javaEE中,不是特别重要,javaEE中有Web服务器(对线程,Socket,IO做了封装)。
0、协议(TCP/IP,UDP,http,https,ftp,file):
1、IP地址:在互联网上IP地址是唯一的。(IPV4,IPV6)
2、端口:相当于一个程序对外暴露的一扇门,在同一台电脑中端口不能重复:
要访问该程序。
3、HTTP协议重要概念:
1)URI:统一资源的描述符。可以简单理解为:网络地址,比如网址。
2)URL:统一资源定位符。
Java.net包:存放了网络编程相关的类/接口。
IP表示:
InetAddress表示IP地址 :有两个子类
-----Inet4Address:32位,比如:192.168.1.1。
-----Inet6Address:128位,比如:1080:0:0:0:8:800:200C:417A。
无构造方法的几种情况:
1、成员全部是静态的。
2、单例设计模式。
3、类中有静态方法,返回该类的对象。
表示本机的IP地址:127.0.0.1/localhost
网络上的数据的编码和解码操作:
URLEncoder:编码类。
URLDecoder:解码类。
网络编程上的两种协议:
TCP协议:建立通道传输数据,速度慢,需要三次握手来建立连接,比较可靠。不会丢失数据。
UDP协议:把数据打包,数据限制在64K,不建立连接,速度快,会丢失少量数据,不可靠。
网络模型:计算机网络之间以何种规则进行通信,就是网络模型研究问题。
网络模型一般指:
OSI(开放系统互连)参考模型
TCP / IP参考模型
网络应用程序:网络编程、IO流、多线程、集合组成。
网络编程三要素:IP地址(找到电脑)、端口(区分程序)、协议(规则)。
IP地址:网络中计算机的唯一标识。
计算机只能识别二进制数据,所以IP地址应该是一个二进制的数据。
但是我们配置的IP地址不是二进制的,为何?
例如: IP: 192.168.1.100
换算:11000000 10101000 00000001 01100100
但二进制记忆非常麻烦,为了方便表示IP地址,我们就让其换算为十进制,用 . 分开。“点分十进制”。
IP的组成:网络号段+主机号段
A类:第一号段为网络号段+后三段的主机号段
一个网络号:256256256种方法
B类:前二号段位网络号段,后两号段为主机号段
一个网络号:256*256种方法
C类:前三号段位网络号段,后一号段为主机号段
一个网络号:256种方法
私有地址:
192.168.x.x
10.x.x.x
172.16.0.0—172.31.255.255这个区域是私有地址,169.254.x.x是保留地址(不用)
在互联网上不使用,而被用在局域网中的地址。
两个DOS命令:
ipconfig :查看本机IP地址。
ping :后跟IP地址,测试本机与指定的IP地址间的通信是否有问题。
特殊的IP地址:
127.0.0.1回环地址(也可以表示本机)。
x.x.x.255 广播地址。
x.x.x.0 网络地址。
端口:
物理端口:网卡口。
逻辑端口:
1、每个网络程序都会至少有一个逻辑端口。
2、用于标识进程的逻辑地址,不同的进程标识。
3、有效端口:065535,其中01024系统使用或保留端口
本机查看端口号:输入命令 netstat。
Socket:网络套接字。
Socket编程:网络编程,套接字编程。
Socket包含了:IP地址+端口。
Socket原理机制:
1、通信两端都有Socket。
2、网络通信其实就是Socket之间的通信。
3、数据在两个Socket间通过IO传输。
网络编程中客户端与服务端的通信:
public static void main(String[] args) throws IOException {
Socket client=new Socket("localhost",11000);
// 读取数据(连接的通道是字节流,我们可以包装字节流)
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
String line=null;
while((line=br.readLine())!=null){
if("886".equals(line)){
break;
}
bw.write(line);
bw.newLine();
/*
为什么要使用newline:
流.read方法是按字节读取,只判断有没有读取到数据,不管内容的,所以换行符也会被读出来
而BufferedReader.readLine是按行读取的,即从当前位置一直读取数据,直到遇到换行符,然后去掉换行符,返回读取到的数据
*/
bw.flush();
}
client.close();
}
public static void main(String[] args)throws IOException {
ServerSocket server=new ServerSocket(11000);
Socket client=server.accept();
BufferedReader br=new BufferedReader(new InputStreamReader(client.getInputStream()));
String line=null;
while((line=br.readLine())!=null){
System.out.println(line);
}
client.close();
}