上海古都建筑设计集团,上海办公室装修设计公司,上海装修公司高质量的内容分享社区,上海装修公司我们不是内容生产者,我们只是上海办公室装修设计公司内容的搬运工平台

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

guduadmin201月前

一、网络编程

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

网友评论

搜索
最新文章
热门文章
热门标签
 
 梦见坟是什么兆头周公解梦  梦见观音佛像  梦见自己杀人即将被抓