------- 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.想要获取想要的字符串:用获取