16 网络编程

----------- 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]+)+";


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值