一、网络编程
1.网络协议(TCP/IP)
1.1.概述
- 传输层协议中有两个非常重要的协议:
-
- 传输控制协议TCP(Transmission Control Protocol)
- 用户数据报协议UDP(User Datagram Protocol)
- **TCP/IP 以其两个主要协议:传输控制协议(TCP)和网络互联协议(IP)**而得名,实际上是一组协议,包括多个具有不同功能且互为关联的协议。
- IP(Internet Protocol)协议是网络层的主要协议,支持网间互连的数据通信。
- TCP/IP协议模型从更实用的角度出发,形成了高效的四层体系结构,即物理链路层、IP层、传输层和应用层。
1.2.TCP三次握手
1.3.网络架构:B/S 、C/S
- B/S : 浏览器服务器Browser / Server 基于浏览器,比如网页版淘宝
- C/S : 客户端服务器Client/Server 基于特定客户端,比如下载的淘宝APP
1.4.TCP特点
- 安全,可靠,能重传,不丢包,如果丢失会重新传输但是不会重复传输
- 有序,顺序不会乱
- 面向链接,如果链接不上,不会进行数据传输
- 请求需要往返,简称三次握手
2.Socket
- 利用套接字(Socket)开发网络应用程序早已被广泛的采用,以至于成为事实 上的标准。
- 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标 识符套接字。
- 通信的两端都要有Socket,是两台机器间通信的端点。
- 网络通信其实就是Socket间的通信。
- Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输。
- 一般主动发起通信的应用程序属客户端,等待通信请求的为服务端。
- Socket分类:
-
- 流套接字(stream socket):使用TCP提供可依赖的字节流服务数据
- 报套接字(datagram socket):使用UDP提供“尽力而为”的数据报服务
3.常用方法
- Socket类的常用构造器:
-
- public Socket(InetAddress address,int port)创建一个流套接字并将其连接到指定IP 地址的指定端口号。
- Ø public Socket(String host,int port)创建一个流套接字并将其连接到指定主机上的指定端口号。
- Socket类的常用方法:
-
- public InputStream getInputStream()返回此套接字的输入流。可以用于接收网络消息
- public OutputStream getOutputStream()返回此套接字的输出流。可以用于发送网络消息
- public InetAddress getInetAddress()此套接字连接到的远程 IP 地址;如果套接字是未连接的,则返回 null。
- public InetAddress getLocalAddress()获取套接字绑定的本地地址。 即本端的IP地址
- public int getPort()此套接字连接到的远程端口号;如果尚未连接套接字,则返回 0。
- public int getLocalPort()返回此套接字绑定到的本地端口。 如果尚未绑定套接字,则返回 -1。即本端的 端口号。
- public void close()关闭此套接字。套接字被关闭后,便不可在以后的网络连接中使用(即无法重新连接 或重新绑定)。需要创建新的套接字对象。 关闭此套接字也将会关闭该套接字的 InputStream 和 OutputStream。
- public void shutdownInput()如果在套接字上调用 shutdownInput() 后从套接字输入流读取内容,则流将 返回EOF(文件结束符)。 即不能在从此套接字的输入流中接收任何数据。
- public void shutdownOutput()禁用此套接字的输出流。对于 TCP 套接字,任何以前写入的数据都将被发 送,并且后跟 TCP 的正常连接终止序列。 如果在套接字上调用 shutdownOutput() 后写入套接字输出流, 则该流将抛出 IOException。 即不能通过此套接字的输出流发送任何数据。
4.TCP服务端
若提示:Address already in use 则表示该端口已被占用
public static void main(String[] args) throws Exception{ //开启端口,如果端口被占用可以换其他的端口,也可以结束该端口进程然后占用该端口 ServerSocket ss =new ServerSocket(10000); System.out.println("服务端已启动!"); //等待客户端连接 // 程序执行到这里就会进入等待状态 Socket skt=ss.accept(); System.out.println("客户端已连接!"); //获取输出流向客户端输出数据 OutputStream os =skt.getOutputStream(); PrintWriter pw= new PrintWriter(new OutputStreamWriter(os,"GBK")); //接收客户端发来的数据 BufferedReader br =new BufferedReader(new InputStreamReader(skt.getInputStream(),"GBK")); Scanner scanner=new Scanner(System.in); String msg=null; while (!(msg=br.readLine()).equals("完毕")) { System.out.println("小红:"+msg); pw.println(scanner.nextLine()); pw.flush(); } //先开启后关闭,和栈的先进后出类似 os.close(); skt.close(); ss.close(); System.out.println("已断开链接,服务器已关闭"); }
5.TCP客户端
若出现 Connection refused 则表示连接不上服务端,要么是服务端没有启动,要么是客户端写的IP和端口与服务端不匹配
public static void main(String[] args) throws Exception { //绑定服务端IP和端口 Socket skt=new Socket("127.0.0.1",10000); System.out.println("链接成功!"); //接收服务端发送数据 InputStream is=skt.getInputStream(); //转换为字符串 InputStreamReader isr=new InputStreamReader(is,"GBK"); //转换为缓冲流 BufferedReader br=new BufferedReader(isr); //向服务端发送数据 PrintWriter pw =new PrintWriter(new OutputStreamWriter(skt.getOutputStream(),"GBK")); Scanner scanner=new Scanner(System.in); String msg=null; while (!(msg=scanner.nextLine()).equals("完毕")) { pw.print(msg); pw.flush(); System.out.println("小明"+br.readLine()); } br.close(); isr.close(); is.close(); skt.close(); }
6.UDP/IP
6.1.特点
- 不保证可靠(在某些情况下会不可靠)
- 可能丢包
- 无连接
- 速度快
6.2.服务端
//打开UDP对象,监听某个端口 DatagramSocket ds =new DatagramSocket(10000); byte[] buf =new byte[1024]; //声明一个包接收器 DatagramPacket dp=new DatagramPacket(buf,buf.length); while(true){ //阻塞式接收 ds.receive(dp); //字节输入输出流 ByteArrayInputStream bais=new ByteArrayInputStream(buf); //数据流 DataInputStream dis =new DataInputStream(bais); System.out.println(dis.readUTF()); } }
6.3.客户端
public static void main(String[] args) throws Exception{ Scanner scanner=new Scanner(System.in); String str=null; while (!(str=scanner.nextLine()).equals("完毕")) { //字节数组输出流 ByteArrayOutputStream baos=new ByteArrayOutputStream(); //封装为数据流 DataOutputStream dos =new DataOutputStream(baos); //写入到ByteArray数组流中 dos.writeUTF(str); //转换为字节数组 byte[] buf =baos.toByteArray(); DatagramPacket dp=new DatagramPacket(buf, buf.length,new InetSocketAddress("127.0.0.1",10000)); //数据传输,通过指定端口把数据包传递出去 DatagramSocket ds =new DatagramSocket(9999); ds.send(dp); ds.close(); } }
二、正则表达式
1.概念
-
正则表达式 : 定义了字符串的匹配模式,可以用来搜索,编辑,校验等文本处理工作
-
正则表达式并不仅限于某一种语言,但是在不同语言中会有细微的差别
2.常用语法
2.1.普通表示方式
- \ 转义符
- 字符的取值范围
- [abc] : 表示可以匹配abc中任意一个字符
- [^abc] : 可以匹配非abc中任意一个字符
- [a-z] : 表示小写字符任意一个
- [0-9] : 表示任意一个数字
- [0-9a-zA-Z] : 代表大小写字母和数字中任意一个
- [^0-9a-zA-Z] : 代表非字母数字
2.2.简单字符表示方式
- . : 表示任意单个字符
- \d : 表示数字 [0-9] (java中 所有正则表达式的 \ 都要写两个 \)
- \D : 表示非数字 [^0-9]
- \s : 表示由空字符组成 [ \r\t\r\x\f] 比如空格 换行符 制表符 之类的
- \S : 表示非空
- \w : 表示字母数字下划线 [0-9a-zA-Z_]
- \W : 表示 非字母数字下划
2.3.数量表示方式
- ? : 表示出现0次或1次 [0-9]?
- : 表示1次或多次 [0-9]+
- : 表示任意次数
- {n} : 表示n次 \d{11} 表示11个数字
- {n,} : 表示n次及n次以上 \d{n,} 表示 大于等于11个数字
- {n,m} : 表示n到m次
- () 表示一个整体
- | 表示或
- 匹配整数和小数
- ^\d+(.\d+)?
- ([1-9]\d*(.\d+)?)|( 0(.\d+)?)
- [\u4e00-\u9fa5] 汉字范围
-
猜你喜欢
网友评论
- 搜索
- 最新文章
- 热门文章