Java笔记(网络编程、正则表达式)

一、网络编程

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三次握手

Java笔记(网络编程、正则表达式)_第1张图片

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] 汉字范围

你可能感兴趣的:(java,笔记)