----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
网络编程
1、网络模型
OSI参考模型
应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
TCP/IP参考模型
应用层:SMTP、FTP、HTTP、thunder。
传输层:Tcp、 Udp
网际层:ip
主机至网络层
2、网络通讯要素
IP地址(InetAddress):每台网络终端在网络中都有一个独立的地址,网络中设备的标识,不易记忆。
ipconfig:查看本机IP
ping:测试连接
本地回路地址:127.0.0.1 主机名:localhost
IPv4:4个字节组成,4个0-255。大概42亿,30亿都在北美,亚洲4亿。2011年初已经用尽。
IPv6:8组,每组4个16进制数。
1a2b:0000:aaaa:0000:0000:0000:aabb:1f2f
1a2b::aaaa:0000:0000:0000:aabb:1f2f
1a2b:0000:aaaa::aabb:1f2f
1a2b:0000:aaaa::0000:aabb:1f2f
1a2b:0000:aaaa:0000::aabb:1f2f
端口号:用于标识进程的逻辑地址,不同进程的标识
每个网络程序都需要绑定一个端口号,传输数据的时候除了确定发到哪台机器上,还要明确发到哪个程序。
有效端口:0~65535,其中0~1024是系统使用或保留端口。
常用端口:
mysql: 3306
oracle: 1521
web: 80
tomcat: 8080
QQ: 4000
feiQ: 2425
传输协议:为计算机网络中进行数据交换而建立的规则、标准或约定的集合。
UDP:
将数据及源和目的封装成数据包中,面向无连接。
因无连接,是不可靠协议, 数据不安全
不需要建立连接,速度快
每个数据包的大小在限制在64k内
不区分客户端与服务端。
TCP:
建立连接,形成传输数据的通道,面向连接,
通过三次握手完成连接,是可靠协议,数据安全,
必须建立连接,速度略低。
在连接中进行大数据量传输
分为客户端和服务端。
当数据传输的性能必须让位于数据传输的完整性、可控制性和可靠性时,TCP协议是当然的选择。
当强调传输性能而不是传输的完整性时,如:音频和多媒体应用,UDP是最好的选择。
在数据传输时间很短,以至于此前的连接过程成为整个流量主体的情况下,UDP也是一个好的选择,
如:DNS交换。把SNMP建立在UDP上的部分原因是设计者认为当发生网络阻塞时,UDP较低的开
销使其有更好的机会去传送管理数据。
Socket:为网络服务提供的一种机制
通信的两端都有Socket。
网络通信其实就是Socket间的通信。
数据在两个Socket间通过IO流传输。
Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和port。
3、UDP传输
DatagramSocket与DatagramPacket
建立发送端,接收端。
建立数据包。
调用Socket的发送接收方法。
关闭Socket。
发送端与接收端是两个独立的运行程序。
通过键盘录入获取要发送的信息,将发送和接收分别封装到两个线程中。
在发送端,要在数据包对象中明确目的地 IP及端口。
DatagramSocket ds = new DatagramSocket(); //建立udp的socket服务
byte[] by = “hello,udp”.getBytes(); //将数据封装进数组
DatagramPacket dp = new DatagramPacket(by,0,by.length,InetAddress.getByName(“127.0.0.1”),10000);
//将数组封装成数据包,并在包中指定目的地址和端口。
ds.send(dp); //通过send方法将数据发出。
ds.close(); //关闭socket资源。
在接收端,要指定监听的端口。
DatagramSocket ds = new DatagramSocket(10000);//建立udp的socket服务,并监听一个端口。
byte[] by = new byte[1024]; //定义一个字节数组
DatagramPacket dp = new DatagramPacket(by,by.length);//定义数据包,将数组作为缓冲区封装到数据包中
ds.receive(dp); //通过receive方法将收到的数据存入到数据包
接收方法是阻塞式的。
String ip = dp.getAddress().getHostAddress(); //通过数据包的方法获取数据包中不同类别的数据。
String data = new String(dp.getData(),0,dp.getLength());
int port = dp.getPort();
System.out.println(ip+":"+data);
ds.close(); //关闭资源。(视情况而定)
4、TCP传输
Socket和ServerSocket
建立客户端和服务器端
建立连接后,通过Socket中的IO流进行数据的传输
关闭socket
同样,客户端与服务器端是两个独立的应用程序。
客户端
客户端需要明确服务器的ip地址以及端口,这样才可以去试着建立连接,如果连接失败,会出现异常。
连接成功,说明客户端与服务端建立了通道,那么通过IO流就可以进行数据的传输,提供了输入流和输出流对象,通过getInputStream(),getOutputStream()获取即可。
与服务端通讯结束后,关闭Socket。
Socket s = new Socket("192.168.1.254",10002);//创建Socket客户端,明确ip地址以及端口
OutputStream out = s.getOutputStream(); //getInputStream()获取客户端输出流
out.write(" tcp ....".getBytes()); //输出数据,写出数据到连接服务端的输入流
s.close(); //关闭客户端
服务端
服务端需要明确它要处理的数据是从哪个端口进入的。
明确是哪个客户端在访问,通过accept()获取已连接的客户端对象,并通过该对象获取IO流与客户端进行数据传输。
当该客户端访问结束,关闭该客户端。
ServerSocket ss = new ServerSocket(9999); //创建ServerSocket服务端,监听一个端口
Socket s = ss.accept (); //accept()方法接收一个客户端请求,得到一个Socket
InputStream in = s.getInputStream(); //getInputStream()获取客户端输入流
byte[] buf = new byte[1024]; //定义字节数组缓冲区
int num = in.read(buf); //从客户端输入流中将数据读取字节数组中,返回字节数
String str = new String(buf,0,num); //String构造函数将字节数组转成字符串
System.out.println(s.getInetAddress().toString()+”:”+str);
s.close(); //关闭客户端、服务端
ss.close();
Tcp传输最容易出现的问题:
客户端连接上服务端,两端都在等待,没有任何数据传输。
通过例程分析:因为read方法或者readLine方法是阻塞式。
解决办法:自定义结束标记。使用shutdownInput,shutdownOutput方法。
web服务器原理,基于三项技术完成:socket、多线程、IO流。
5、正则表达式:
是一种专门用于操作字符串的规则。通过一些符号来表示,简化对字符串的复杂操作,但阅读性较差
例如: 在网站上注册的时候, 我们填写邮箱要按照指定的格式. 这个格式就是用正则表达式约束的.
正则表达式中组的含义:对规则进行封装,方便调用
正则表达式的语法:
[]:代表一个字符, 中括号中的内容决定这个字符可以是什么
. \d \D \s \S \w \W:特殊字符
? * + {}:数量词
常见操作:
String matches(regex):判断一个字符串是否匹配指定的正则表达式
Pattern, Matcher:获取(查找)
Pattern p = Pattern.compile(regex); //创建一个Pattern封装一个正则表达式
Matcher m = p.matcher(String); //用Pattern.matcher()方法匹配一个字符串, 得到一个Matcher对象
while(m.find()) { //对象的find()方法查找字符串中是否包含能匹配正则表达式的部分
System.out.println(m.group()); //对象的group()方法可以获取find()方法找到的部分
}
String split(regex):用正则表达式能匹配的部分作为分隔符, 分割一个字符串
String replaceAll(regex,str):把字符串中匹配正则表达式的部分替换为另一个字符串,如果regex中有定义组,
可以在第二参数中通过$符号获取正则表达式中的已有的组
示例:获取文档中连续的数字
String regex = "\\d{5}";
Pattern, Matcher
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(String);
while(m.find()) {
String s = m.group();
s.replaceAll(regex,"#");
System.out.println(m.group());
}
网页爬虫:
通过网络以及IO读取网页的源文件,并通过规则获取网页中符合规则的数据。
比如:mail爬虫
String mailreg = "\\[a-zA-Z0-9_]{6,12}@[a-zA-Z0-9]+\\.([a-zA-Z]+)+";