黑马程序员_网络编程

------- android培训java培训、期待与您交流! ---------

 1、网络通信的要素:IP地址,端口号和传输协议。

(1)IP地址

          IP网络中的每台主机都必须有一个唯一的IP地址;

          IP地址是由四个字节组成的。

(2)端口号

          数据发送到对方指定的应用程序上,(应用程序都使用数字(0-65535)标识的.),这些数字就叫做端口号.

(3)传输协议

          这是为网络中数据传输建立的规则。国际组织定义了通用的协议TCP/ IP

2、网络模型:OSI参考模型和TCP/IP参考模型

(1)OSI参考模型包括:应用层、表示层、会话层、传输层网络层、数据链路层、物理层。

(2)TCP/P参考模型包括:应用层、传输层、网际层和主机至网络层。

3、TCP和UDP

(1)TCP                                                                      (2)UDP

          建立连接,形成传输数据的通道。                             将数据及源和目的封装在数据包中,不需要建立连接

          在连接中进行大数据量传输。                                     每个数据包的大小都应限制在 64K内

          通过三次握手完成连接,是可靠协议 。                     因为无连接,是不可靠协议。

          因必须建立连接,效率会稍低。                                  不需要建立连接,传输速度快

4、IP地址的一些方法

(1)static InetAddress getLocalHost()返回本地主机的主机名和IP地址

          String getHostAddress()返回本地主机IP地址的字符串

          String getHostName()获取此IP地址的主机名

(2)static InetAddress getByName(String host)在给定主机名的情况下确定主机的IP地址

5、Socket:Socket是为网络服务提供的一种机制,(通信两端的都有Socket)

(1)发送端

思路:1、建立udpSocket服务(DatagramSocket)

            2、提供数据,并将数据封装到数据包中(Datagrampacket)

            3、通过socket服务将数据包发送出去

            4、关闭资源

class UdpSend
{
	public static void main(String[] args) throws Exception
	{
		//建立socket服务
		DatagramSocket ds=new DatagramSocket(10001);
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		String line=null;
		while((line=br.readLine())!=null)
		{
			if("886".equals(line))
				break;
 			byte[] buf=line.getBytes();//将字符串变成字节
		//封装数据
			DatagramPacket dp=
                     	new DatagramPacket(buf,buf.length,InetAddress.getByName( "127.0.0.1"),10000);
			ds.send(dp);
		}
		ds.close();
	}
}

(2)接收端

思路:1、建立udpSocket服务(DatagramSocket),通常会监听一个端口.

            2、定义一个数据包,用来装要接收的数据.(数据包里封装了提取不同数据的功能)

            3、通过socket服务的receive方法将数据接收并存到数据包中

            4、通过数据包的功能将数据取出

            5、关闭资源

class UdpRece
{
	public static void main(String[] args) throws Exception
	{
		//建立socket服务
		DatagramSocket ds=new DatagramSocket(10000);
		//定义一个数据包,用于存储数据
		byte[] buf=new byte[1024];
		DatagramPacket dp=new DatagramPacket(buf,buf.length);
		//通过receive方法将数据存到数据包中
		ds.receive(dp);
		//通过数据包的方法获取其其中的数据
		String ip=dp.getAddress().getHostAddress();
 		String data=new String(dp.getData(),0,dp.getLength());
		int port=dp.getPort();
		System.out.println(ip+"  "+data+"  "+port);
		ds.close();
		
	}

} 

6、TCP传输:tcp分为客户端(Socket)和服务端(ServeSocket)

(1)客户端:在建立Socket对象时,就可以去连接指定主机,连接成功以后会和主机形成一条通路,进行数据传输。

思路:1、建立socket服务,指定要连接的服务器及端口

            2、获取socke流中的输出流,将数据写到输出流中,通过网络发送到服务端

            3、获取socket流中的输入流,将服务端返回的信息打印出来。

            4、关闭资源

class TcpClient
{
	public static void main(String[] args)throws Exception
	{
		//建立客户端的Socket服务,并指定目的主机和端口
		Socket s=new Socket("127.0.0.1",10000);
		//为了发送数据,获取Socket流中的输出流
		OutputStream out=s.getOutputStream();
		out.write("chy...tcp".getBytes());
		//接受服务端发回的数据
		InputStream in=s.getInputStream();
		byte[] buf=new byte[1024];
		int len=in.read(buf);
		System.out.println(new String(buf,0,len));
		s.close();
		
	}
}

(2)服务端:服务端的对应的对象是ServerSocket。

思路:1、建立socket服务,监听一个端口

            2、通过accept方法获取已连接的客户端

            3、用客户端的输入流将客户端发过来的信息读取出来

            4、用客户端的输出流给客户返回已收到的信息。

            5、关闭资源(需要时)

class TcpServe
{
	public static void main(String[] args)throws Exception
	{
		//建立一个Socket服务,并监听一个端口
		ServerSocket ss=new ServerSocket(10000);
		//通过accept获取已连接的客户端对象
		Socket s=ss.accept();
		//获取连接上的客户端ip
		String ip=s.getInetAddress().getHostAddress();
		System.out.println(ip+"......connect");
		//通过客户端的读取流来获取客户端发过来的数据
		InputStream in=s.getInputStream();
		byte[] buf=new byte[1024];
		int len=in.read(buf);
		System.out.println(new String(buf,0,len));
		//通过客户端的写出流告诉客户收到数据
		OutputStream out=s.getOutputStream();
		out.write("收到".getBytes());
		s.close();
		ss.close();
	}
}

小结:在客户端和服务端中出现了一个网络流(就是通过Socket中的getInputStream()和getOutputStream()将数据写到网络中),这样在前面学到的流中设备中又多了一个网络流.

7.正则表达式(用来简化操作字符串的表达式)

1.优缺点

优:正则表达式的出现,对字符串的复杂操作变得更为简单。具体是这样实现的:将对字符串操作的代码用一些符号来表示。只要使用了指定符号,就可以调用底层的代码对字符串进行操作。

缺:符号的出现虽然简化了书写,但是却降低了阅读性。(多个符号一起出现时,让阅读者不明白什么意思).

2.正则中的一些方法:

(1)匹配(matches)

一些常见的预定义字符:    "."任何字符;    "\d":[0-9];    "\D":[^0-9];   "\w":[a-zA-Z_0-9];   "\W":[^\w].

一些常见的数量词:    X?:  一次或一次也没出现;   X*:零次或多次;   X+: 一次或多次;    X{n}:恰好n次;

                                  X{n,}:至少n次;                     X{n,m}至少n次,但不超过m次.

匹配的用法:

String reg="[1-9]\\d{4-14}";//建立规则
boolean flag=qq.matchs(reg);//匹配要检验的qq号


(2).切割(split),返回值是个数组.

String reg=" +"//按照多空格来进行切割
String reg="\\."//按照特殊字符"."来切割在正则里面的特殊字符都要用\\来转意.
String[] arr=str.split(reg);

小知识点:按照叠词来切割时,要用到组(将重复出现的字符用括号封装起来)

例: aa(a表示任意字符)   用组来表示: (.)\\1   1表示第二位置用第一个组来表示.1是组的编号.

当组嵌套使用时,用左括号来数组的个数;  ((())())   4个组;

 

(3)替换(replaceAll(String reg, String replacement))

String str="sbddddcffffrrrrr";
String reg="(.)\\1+";//规则是重复的字母
String newStr=str.replaceAll(reg,$1);//$1是获取组中的字母


(4)获取(将字符串中符合规则的子串取出)

步骤: 1.将正则表达式封装成对象;(Pattern)(对象通过Pattern的静态方法compile(reg)来获取)

         2.让正在对象和要操作的字符串相关联;(Matcher)(Matcher m=p.matcher(str));

         3.关联后,获取正则匹配引擎;

         4.通过引擎对符合规则的子串进行操作.

例子:获取一句话中三个字母的单词

	public static void getDemo()
	{
		String str="chy kai shi xue xi le";
		String reg="\\b[a-z]{2}\\b";//规则是两个字母组成的单词,\b表示单词边界
		//建立规则对象
		Pattern p=Pattern.compile(reg);
		//让规则对象和被操作的字符串相关联
		Matcher m=p.matcher(str);
		while(m.find())//将规则作用于字符串上
		{
			System.out.println(m.group)//获取匹配后的结果
		}
	}


总结:正则的应用

1.只想知道字符是对是错:用匹配.

2.想要将已有字符串换成另一个字符串:用替换

3.想要用自定义的方式将字符串变成多个字符串,:用切割

4.想要获取想要的字符串:用获取

 

 


 

 

 

 

 


 


 


------- android培训java培训、期待与您交流! ----------

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值