【黑马程序员】网络编程知识总结

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! --------------------

网络编程

1、网络编程-概述

       1. 网络通讯要素:

       IP地址:InetAddress网络中设备的标识,不易记忆,可用主机名。

       本机主机地址:127.0.0.1      主机名:localhost

代码演示:

import java.net.*;

class  IPDemo{

       public static void main(String[] args)throws Exception{

      //InetAddress i =InetAddress.getLocalHost();

      //System.out.println(i.toString());

      //System.out.println("address:"+i.getHostAddress());

      //System.out.println("name:"+i.getHostName());

              InetAddress ia =InetAddress.getByName("192.168.1.254");

              System.out.println("address:"+ia.getHostAddress());

              System.out.println("name:"+ia.getHostName());

       }

}


小结:如果在选取的ip地址中搜索不到相对应的主机名,则系统会返回对应的ip地址

       2. 端口号

       用于标识进程的逻辑地址,不同进行的标识,有效端口:0~65535,其中0~1024都被系统使用或保留端口

       传输协议:通讯规则的常见协议:TCPUDP

2、  网络编程(TCPUDP)

TCP特点:

1)     建立连接,形成传输数据的通道;

2)     在连接中进行大量数据传输;

3)     通过三次“握手”完成连接,是可靠协议

4)     必须建立连接,效率会稍低。

 

UDP特点:

1)     将数据及源和目的封装到数据中,不需要建立连接;

2)     每个数据包的大小都限制在64k内;

3)     因为连接,是不可靠协议;‘

4)     不需要建立连接,速度快

 

3、  网络编程(Socket)

1.     Socket特点:

1)     Socket就是为网络服务提供的一种机制;

2)     通信的两端都有Socket;

3)     网络通信其实就是Socket间的通信;

4)     数据在两个Socket间通过IO传输。

2.     UDP传输

1)     DatagramSocket与DatagramPacket

2)     建立发送端,接收端;

3)     建立数据包;

4)     调用Socket的发送接收方法;

5)     关闭Socket

其中,发送端与接收端是两个独立运行的程序

public class DatagramSocket extends Object :此类表示用来发送和接收数据报包的套接字,

public final class DatagramPacket extends Object: 此类表示数据报包。数据报包用来实现无连接包投递服务。具备发送和接收功能,在进行UDP传输时,需要明确一个是发送端,一个是接收端。

DatagramPacket(byte[] buf,int length, InetAddress address , int port)构造数据报包,用来将长度为length的包发送到指定主机上的指定端口号上。

UDP的发送端:

1)     建立UDP的socket服务,创建对象时如果没有明确端口,系统会自动分配一个未被使用的端口;

2)     明确要发送的具体数据;

3)     将数据封装成了数据包;

4)     用socket服务的send方法将数据包发送出去;

5)     关闭资源

代码演示:

[java]  view plain copy
  1. import java.net.*;  
  2. class  UdpSend{  
  3.        publicstatic void main(String[] args) {  
  4.               //1.建立udp的socket服务  
  5.               DatagramSocket ds = new DatagramSocket(8888);//指定发送端口,不指定系统会随机分配  
  6.               //2.明确要发送的具体数据  
  7.               String text = "udp传输演示,哥们来了";  
  8.               byte[]buf = text.getBytes();  
  9.               //3.将数据封装成了数据包  
  10.               DatagramPacke tdp = new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1."),10000);  
  11.               //4.用socket服务的send方法将数据包发送出去  
  12.               ds.send(dp);  
  13.               //5.关闭资源  
  14.               ds.close();  
  15.        }  
  16. }  

UDP的接收端:

1)     创建udp的socket服务,必须要明确一个端口,作用在于,只有发送到这个端口的数据才是这个接收端可以处理的数据;

2)     定义数据包,用于储存接收到的数据;

3)     通过socket服务的接收方法将受到的数据存储到数据包中。

4)     通过数据包的方法获取数据包中的具体数据内容,如ip、端口和数据

5)     关闭资源。

代码演示:

[java]  view plain copy
  1. import java.net.*;  
  2. class UdpRece {  
  3.        public static void main(String[] args) {  
  4.               //1.创建udp的socket服务  
  5.               DatagramSocket ds = new DatagramSocket(10000);  
  6.               //2.定义数据包,用于存储接收到的数据。先定义字节数组,数据包会把数据存储到字节数组中  
  7.               byte[]buf = new byte[1024];  
  8.               DatagramPacket dp = new DatagramPacket(buf,buf.length);  
  9.               //3.通过socket服务的接收方法将收到的数据存储到数据包中  
  10.               ds.receive(dp);//该方法是阻塞式方法  
  11.               //4.通过数据包的方法获取数据包中的具体数据内容,比如ip,端口和数据  
  12.               String ip = dp.getAddress().getHostAddress();  
  13.               int port = dp.getPort();  
  14.               String text = new String(dp.getData(),0,dp.getLength());//将字节数组中的有效部分转成字符串  
  15.               System.out.println(ip+ ":" + port + "---" + text);  
  16.               //5.关闭资源  
  17.               ds.close();  
  18.        }  
  19. }  


3.     TCP传输:两个端点的建立连接后会有一个传输数据的通道,这个通道称为流,而且是建立在网络基础上的流,称之为socket流。该流中既有读取,也有写入。

TCP的两个端点:一个是客户端,一个是服务端。

客户端:对应对象是Socket

服务端:对应对象是ServerSocket

TCP的客户端

1)      建立tcpsocket服务,最好明确具体的地址和端口。这个对象在建立时,就已经可以对指定ip和端口进行连接(三次握手)

2)      如果连接成功,就意味着通道建立了,socket流就已经产生了。只要获取到socket流中的读取流和写入流即可,只要通过getInputStreamgetOutputStream就可以获取两个流对象。

3)      关闭资源。

代码演示:

     

[java]  view plain copy
  1.  import java.io.*;  
  2. import java.net.*;  
  3. class TcpClient {  
  4. public static void main(String[] args) {  
  5.         Socket s = new Socket("127.0.0.1",10001);  
  6.         OutputStream out = s.getOutputStream();//获取了socket流中的输出流对象。  
  7.         out.write("tcp演示,哥们又来了".getBytes());  
  8.         s.close();  
  9. <span style="white-space:pre">  </span>}  
  10. }  


TCP的服务端:

1)     创建服务端socket服务,并监听一个端口;

2)     服务端为了给客户端提供服务,获取客户端的内容,可以通过accept方法获取连接过来的客户端对象。

3)     可以通过获取到的socket对象的socket流和具体的客户端进行通讯

4)     如果通讯结束,关闭资源。注意:要先关闭客户端,再关客户端

代码演示:

[java]  view plain copy
  1. import java.io.*;  
  2. import java.net.*;  
  3. class TcpServer {  
  4.       public static void main(String[] args) {  
  5.              ServerSocket ss = new ServerSocket(10001);//建立服务端的socket服务  
  6.              Socket s = ss.accept();//获取客户端对象  
  7.              String ip = s.getInetAddress().getHostAddress();  
  8.              System.out.println(ip+ "....contected");  
  9.              //可以通过获取到的socket对象中的socket流和具体的客户端进行通讯  
  10.              InputStream in = s.getInputStream();//读取客户端的数据,使用客户端对象的socket读取流  
  11.              byte[]buf = new byte[1024];  
  12.              int len = in.read(buf);  
  13.              String text = new String(buf,0,len);  
  14.              System.out.println(text);  
  15.              //如果通讯结束,关闭资源。注意:要先关闭客户端,再关闭服务端  
  16.       }  
  17. }  


练习:TCP复制文件

代码演示:

[java]  view plain copy
  1. import java.io.*;  
  2. import java.net.*;  
  3. class TextClient{  
  4.        public static void main(String[] args) throws Exception{  
  5.               Socket s = new Socket("127.0.0.1",10006);  
  6.         
  7.               BufferedReader bufr =  
  8.                      new BufferedReader(new FileReader("IPDemo.java"));  
  9.    
  10.               PrintWriter out = new PrintWriter(s.getOutputStream(),true);  
  11.    
  12.               Stringline = null;  
  13.    
  14.               while((line=bufr.readLine())!=null){  
  15.                      out.println(line);  
  16.               }  
  17.               //out.println("over");//定义结束标记  
  18.               s.shutdownOutput();//关闭客户端的输出流,相当于给流中加入一个结束标记-1。  
  19.               BufferedReader bufIn =  
  20.                      new BufferedReader(new InputStreamReader(s.getInputStream()));  
  21.    
  22.               String str = bufIn.readLine();  
  23.               System.out.println(str);  
  24.    
  25.               bufr.close();  
  26.               s.close();  
  27.        }  
  28. }  


[java]  view plain copy
  1. class TextServer{  
  2.        public static void main(String[] args)throws Exception{  
  3.               ServerSocket ss = new ServerSocket(10006);  
  4.               Sockets = ss.accept();  
  5.    
  6.               String ip = s.getInetAddress().getHostAddress();  
  7.               System.out.println(ip+"......connected");  
  8.               BufferedReader bufIn =  
  9.                      new BufferedReader(new InputStreamReader(s.getInputStream()));  
  10.    
  11.               PrintWriter out = new PrintWriter(new FileWriter("server.txt"),true);  
  12.    
  13.               String line = null;  
  14.               while((line=bufIn.readLine())!=null){  
  15.                      //if("over".equals(line))  
  16.                      //    break;  
  17.                      out.println(line);  
  18.               }  
  19.               PrintWriter pw = new PrintWriter(s.getOutputStream(),true);  
  20.               pw.println("上传成功");  
  21.               out.close();  
  22.               s.close();  
  23.               ss.close();  
  24.        }  
  25. }  

小结:由于运用到了readLine方法,因此就会有相应的阻塞式方法,于是就要加入相应结束标记,查看Socket的API文档发现,当文件写到末尾时,加入shutdownOutput()方法,即可让其添加了一个类似于-1的结束标记。

4.      网络编程(URL -URLConnection)

构造方法:

String getFile():获取此URL的文件名

String getHost():获取此URL的主机名(如果适用)

String getPath():获取此URL的路径部分

int getPort():获取此URL的端口号

String getProtocol():获取此URL的协议名称

String getQuery(): 获取此URL的查询部分

 

URLConnection openContection(): 返回一个URLConnection对象,它表示到URL所引用的远程对象的连接;

public ServerSocket(int port, intbacklog):

port:指定的端口;

backlog:队列的最大程度,也就是支持最多用户

代码演示

[java]  view plain copy
  1. import java.io.*;  
  2. import java.net.*;  
  3. class URLConnectionDemo {  
  4.        public static void main(String[] args) throws Exception{  
  5.               URL url = new URL("http://127.0.0.1:8080/myweb/demo.html");  
  6.    
  7.               URLConnection conn = url.openConnection();  
  8.               System.out.println(conn);  
  9.    
  10.               InputStream in = conn.getInputStream();  
  11.               byte[] buf = new byte[1024];  
  12.               int len = in.read(buf);  
  13.               System.out.println(new String(buf,0,len));  
  14.        }  
  15. }  


十、正则表达式

1、正则表达式特点:符合一定规则的表达式。

       作用:专门用于操作字符串

       特点:用于一些特定的符号来表示一些代码操作,这样就简化了书写;

       好处:可以简化对字符串的复杂操作;

       弊端:符号的出现虽然简化了书写,但是却降低了阅读性。

组:用小括号表示,没定义一个小括号,就是一个组,而且有自动编号,从1开始。只要使用组,对应的数字就是使用该组的内容。其中数组要加\\,而(aaa(bbb(ccc))(eee))分辨组的技巧:从左括号开始数即可。有几个左括号就是几组。

2、常见操作:

       1) 匹配:其实用的就是String类中的matches方法

String reg = “[1-9][0-9]{4,14}”;

boolean b = qq.matches(reg);//将正则和字符串关联对字符串进行匹配

       2) 切割:其实用的就是String类中的split方法。

       3) 替换:其实用的就是String类中的replaceAll()方法;

       4) 获取:

(1) 先要将正则表达式编译成正则对象,使用的是Pattern中静态方法:compile(regex);

(2)   通过Pattern对象获取Matcher对象。

Pattern用于描述正则表达式,可以对正则表达式进行解析。而将规则操作字符串,需要从新封装到匹配器对象Matcher中。然后使用Matcher对象的方法来操作字符串。

如何获取匹配器对象呢?

通过Pattern对象中的matcher方法。该方法可以让正则跪着和字符串相关联,并返回匹配器对象。

(3) 使用Matcher对象中的方法即可对字符串进行各种正则操作。

       代码演示:

      

[java]  view plain copy
  1.  importjava.util.regex.*;  
  2. class  RegexDemo2{  
  3.          public static void main(String[] args) {  
  4.                    getDemo();  
  5.          }  
  6.          public static void getDemo(){  
  7.                    String str ="ming tian jiu yao fang jia le,da jia.";  
  8.                    //str ="123456";  
  9.                    //String reg= "[1-9]\\d{4,14}";  
  10.                    String reg ="\\b[a-z]{4}\\b";// \b表示单词边界  
  11.    
  12.                    //将规则封装成对象  
  13.                    Pattern p =Pattern.compile(reg);  
  14.    
  15.                    //让正则对象和要作用的字符串相连接,获取匹配器对象。  
  16.                    Matcher m =p.matcher(str);  
  17.    
  18.                    //System.out.println(m.matches());//其实String类中的matches方法,用的就是Pattern和Matcher对象来完成的。  
  19.                                                                                              //只不多被String的方法封装后,用起来较为简单,但是功能却单一。  
  20.                     
  21.                    //boolean b= m.find();//将规则作用到字符串上,并进行符合规则的字串查找  
  22.                    //System.out.println(b);  
  23. //               System.out.println(m.group());//用于获取匹配后的结果  
  24.    
  25.                    while(m.find()){  
  26.                             System.out.println(m.group());  
  27.                             System.out.println(m.start()+"..."+m.end());  
  28.                    }  
  29.          }  
  30. }  

注意:在进行查找获取前,不能在其前面再添加匹配,否则获取到的数据会出现错误,例如matches()会提前匹配,然后其索引位就会一次往后推移

 

练习:网页爬虫(蜘蛛)

[java]  view plain copy
  1. import java.io.*;  
  2. import java.util.regex.*;  
  3. import java.net.*;  
  4. class RegexTest2{  
  5.        public static void main(String[] args) throws Exception{  
  6.               //getMails();  
  7.               getMails_1();  
  8.        }  
  9.    
  10. //通过网页获取邮件地址  
  11.        public static void getMails_1()throws Exception{  
  12.               URL url = new URL("http://127.0.0.1:8080/myweb/mail.html");  
  13.               URLConnection conn = url.openConnection();  
  14.    
  15.               BufferedReader bufIn =  
  16.                      new BufferedReader(new InputStreamReader(conn.getInputStream()));  
  17.    
  18.               String line = null;  
  19.               String mailreg ="\\w+@\\w+(\\.\\w+)+";  
  20.               Pattern p = Pattern.compile(mailreg);  
  21.    
  22.               while((line=bufIn.readLine())!=null){  
  23.                      Matcher m = p.matcher(line);  
  24.                      while(m.find()){  
  25.                             System.out.println(m.group());  
  26.                      }  
  27.               }  
  28.        }  
  29. //通过本地文件获取邮件地址  
  30.        public static void getMails()throws Exception{  
  31.               BufferedReader bufr =  
  32.                      new BufferedReader(new FileReader("mail.txt"));  
  33.    
  34.               String line = null;  
  35.    
  36.               String mailreg = "\\w+@\\w+(\\.\\w+)+";  
  37.               Pattern p = Pattern.compile(mailreg);  
  38.    
  39.               while((line=bufr.readLine())!=null){  
  40.                      Matcher m = p.matcher(line);  
  41.                      while(m.find()){  
  42.                             System.out.println(m.group());  
  43.                      }  
  44.               }  
  45.        }  
  46. }  

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! --------------------

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值