做冒菜店网站,网站建设时如何选择合适的服务器,小程序开发哪里有,网站布局设计软件1. 网络编程
1.1 概述 Java是 Internet 上的语言#xff0c;它从语言级上提供了对网络应用程 序的支持#xff0c;程序员能够很容易开发常见的网络应用程序。 Java提供的网络类库#xff0c;可以实现无痛的网络连接#xff0c;联网的底层 细节被隐藏在 Java 的本机安装系统…1. 网络编程
1.1 概述 Java是 Internet 上的语言它从语言级上提供了对网络应用程 序的支持程序员能够很容易开发常见的网络应用程序。 Java提供的网络类库可以实现无痛的网络连接联网的底层 细节被隐藏在 Java 的本机安装系统里由 JVM 进行控制。并 且 Java 实现了一个跨平台的网络库程序员面对的是一个统一的网络编程环境。
1.2 网络基础
计算机网络把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规 模大、功能强的网络系统从而使众多的计算机可以方便地互相传递信息、 共享硬件、软件、数据信息等资源。网络编程的目的直接或间接地通过网络协议与其它计算机实现数据交换进行通讯。网络编程中有两个主要的问题1如何准确地定位网络上一台或多台主机定位主机上的特定的应用.2找到主机后如何可靠高效地进行数据传输。
1.3 网络通信 通信双方地址1IP找到对应电脑 2端口号找到对应应用程序 一定的规则即网络通信协议。有两套参考模型 1OSI参考模型模型过于理想化未能在因特网上进行广泛推广 2TCP/IP参考模型(或TCP/IP协议)事实上的国际标准。 1.3.1 IP IP 地址InetAddress唯一的标识 Internet 上的计算机通信实体。本地回环地址(hostAddress)127.0.0.1 主机名(hostName)localhost IP地址分类方式1 IPV44个字节组成4个0-255。大概42亿30亿都在北美亚洲4亿。2011年初已经用尽。以点分十进制表示如192.168.0.1 IPV6128位16个字节写成8个无符号整数每个整数用四个十六进制位表示 数之间用冒号分开如3ffe:3201:1401:1280:c8ff:fe4d:db39:1984 IP地址分类方式2 公网地址(万维网使用)和私有地址(局域网使用)。192.168. 开头的就是私有址址范围即为192.168.0.0--192.168.255.255专门为组织机 构内部使用 特点不易记忆 1.3.2 端口 端口号标识正在计算机上运行的进程程序不同的进程有不同的端口号被规定为一个 16 位的整数 0~65535。 端口分类 公认端口0~1023。被预先定义的服务通信占用如HTTP占用端口80FTP占用端口21Telnet占用端口23 注册端口1024~49151。分配给用户进程或应用程序。如Tomcat占用端口8080MySQL占用端口3306Oracle占用端口1521等。 动态/私有端口49152~65535。 端口号与IP地址的组合得出一个网络套接字Socket。
1.4 OSI七层模型 OSI七层网络模型Open System Interconnection Model是国际标准化组织ISO提出的一个用于计算机或通信系统间互联的标准体系结构。它将通信系统划分为七个层次每个层次负责不同的功能从物理连接到最终用户的应用。这七个层次分别是 物理层Physical Layer负责管理电腦通訊設備和網絡媒體之间的互通传输比特流0和1。 数据链路层Data Link Layer负责網絡尋址、錯誤偵測和改錯将数据封装成帧Frame。 网络层Network Layer负责通过路由选择算法为数据报Packet通过通信子网选择最适当的路径定义了IP地址。 传输层Transport Layer负责监控数据传输服务的质量保证数据报的正确传输定义了TCP和UDP协议。 会话层Session Layer负责建立和管理应用程序之间的通信连接实现数据的分割和重组。 表示层Presentation Layer负责数据格式的转换将应用处理的信息转换为适合网络传输的格式或者将来自下一层的数据转换为上层能处理的格式。 应用层Application Layer负责直接向用户提供服务完成用户希望在网络上完成的各种工作如网页浏览、文件传输、电子邮件等。 1.5 网络协议 1、概述 传输层协议中有两个非常重要的协议 传输控制协议TCP(Transmission Control Protocol) 用户数据报协议UDP(User Datagram Protocol)。 2、网络架构 : B/S C/S B/S : 浏览器服务器Browser / Server 基于浏览器,比如网页版淘宝 C/S : 客户端服务器Client/Server 基于特定客户端,比如下载的淘宝APP 1.5.1TCP/IP TCP/IP 以其两个主要协议传输控制协议(TCP)和网络互联协议(IP)而得名实际上是一组协议包括多个具有不同功能且互为关联的协议。 IP(Internet Protocol)协议是网络层的主要协议支持网间互连的数据通信。 TCP/IP协议模型从更实用的角度出发形成了高效的四层体系结构即物理链路层、IP层、传输层和应用层。 TCP 1. 面向连接它在传输数据之前会建立一条专用的通信连接并在数据传输结束后释放连接。 2. 可靠它可以保证数据的正确性、完整性和顺序性通过重传、确认、流量控制和拥塞控制等机制避免数据的丢失、重复和乱序。 3. 面向字节流它将数据视为一个连续的字节序列没有边界和结构。 4. TCP只支持点对点的通信即一条连接只有两个端点。 5. TCP的传输速度较慢受拥塞控制算法的影响会根据网络状况动态调整发送速率。 1.5.1.1 Socket 利用套接字(Socket)开发网络应用程序早已被广泛的采用以至于成为事实 上的标准。网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标 识符套接字。通信的两端都要有Socket是两台机器间通信的端点。网络通信其实就是Socket间的通信。Socket允许程序把网络连接当成一个流数据在两个Socket间通过IO传输。一般主动发起通信的应用程序属客户端等待通信请求的为服务端。 Socket分类 流套接字stream socket使用TCP提供可依赖的字节流服务 数据报套接字datagram socket使用UDP提供“尽力而为”的数据报服务 1.5.1.2 常用方法 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。 即不能通过此套接字的输出流发送任何数据。 1.5.4 代码示例 实现服务端与客户端对话
// 服务端
public class Server {public static void main(String[] args) throws Exception {// 创建一个ServerSocket对象绑定端口号ServerSocket server new ServerSocket(8081);System.out.println(服务端已启动);// 获取用户端链接返回一个socket对象Socket socket server.accept();System.out.println(客户端已链接);Manager.socket(socket);}
}
// 公共代码
public class Manager {public static void socket(Socket socket) throws Exception {// 创建输入流BufferedReader br new BufferedReader(new InputStreamReader(socket.getInputStream(),GBK));// 创建输出流PrintWriter pw new PrintWriter(new OutputStreamWriter(socket.getOutputStream(),GBK));// 输出线程Thread outThread new Thread(new Runnable() {Overridepublic void run() {// 接收写入的数据Scanner scanner new Scanner(System.in);String msg null;// 连续写入while ((msg scanner.nextLine()) ! null) {pw.println(msg);pw.flush();// 当写入数据为bye时结束if (msg.equals(bye)) {break;}}System.out.println(聊天结束);}});outThread.start();// 输入String msg null;while ((msg br.readLine()) ! null) {System.out.println(socket.getInetAddress().getHostName() : msg);// 当输入bye时结束if (msg.equals(bye)) {break;}}// 合并线程后一同关闭outThread.join();br.close();socket.close();}}// 客户端
public class Client {public static void main(String[] args) throws Exception{Socket socket new Socket(192.168.200.1,8081);// 客户端已启动System.out.println(客户端已启动);Manager.socket(socket);}
}1.5.2 UDP/IP 1.5.2.1 概述 UDPUser Datagram Protocol是一种无连接的传输层协议它提供了一种简单快速的数据传输服务但不保证数据的可靠性、顺序性和完整性。UDP适用于那些对实时性要求高、对可靠性要求低的应用如视频、音频、游戏等。 UDP/IP协议是指在IP协议的基础上使用UDP协议来传输数据的方式。UDP/IP协议的优点是传输速度快开销小灵活性高缺点是不可靠容易丢失、重复或乱序数据包需要应用层来处理错误和恢复。 1.5.2.2 代码示例
// 服务端
public class UDPServer {public static void main(String[] args) throws Exception {// 打开UDP对象监听某个接口DatagramSocket ds new DatagramSocket(8081);// 创建数组保存数据byte[] buff new byte[1024];// 声明一个包接收器DatagramPacket dp new DatagramPacket(buff, buff.length);while (true) {// 阻塞式接收ds.receive(dp);// 字节输入流ByteArrayInputStream bais new ByteArrayInputStream(buff);// 数据流DataInputStream dis new DataInputStream(bais);System.out.println(dis.readUTF());}}}
// 客户端
public class UDPClient {public static void main(String[] args) throws Exception {Scanner scanner new Scanner(请输入要发送的信息: );String str null;while ((str scanner.nextLine()).equals(bye)) {// 字节数组输出流ByteArrayOutputStream bais new ByteArrayOutputStream();// 封装为数据流DataOutputStream dos new DataOutputStream(bais);// 写入到ByteArray数组流中dos.writeUTF(str);// 转换为字节数组byte[] buff bais.toByteArray();DatagramPacket dp new DatagramPacket(buff, buff.length,new InetSocketAddress(192.168.200.1,8081));// 传输数据通过指定端口把数据包传递出去DatagramSocket ds new DatagramSocket(9999);ds.send(dp);ds.close();}}
}2. 正则表达式 2.1 概述 正则表达式 : 定义了字符串的匹配模式,可以用来搜索,编辑,校验等文本处理工作 正则表达式并不仅限于某一种语言,但是在不同语言中会有细微的差别 2.2 常用语法 \ 转义符 字符的取值范围 [abc] : 表示可以匹配abc中任意一个字符 [^abc] : 可以匹配非abc中任意一个字符 [a-z] : 表示小写字符任意一个 [0-9] : 表示任意一个数字 [0-9a-zA-Z] : 代表大小写字母和数字中任意一个 [^0-9a-zA-Z] : 代表非字母数字 简单字符表示方式 . : 表示任意单个字符 \d : 表示数字 [0-9] (java中 所有正则表达式的 \ 都要写两个 \\) \D : 表示非数字 [^0-9] \s : 表示由空字符组成 [ \r\t\r\x\f] 比如空格 换行符 制表符 之类的 \S : 表示非空 \w : 表示字母数字下划线 [0-9a-zA-Z_] \W : 表示 非字母数字下划线 数量表示方式 ? : 表示出现0次或1次 [0-9]? : 表示1次或多次 [0-9] * : 表示任意次数 {n} : 表示n次 \d{11} 表示11个数字 {n,} : 表示n次及n次以上 \d{n,} 表示 大于等于11个数字 {n,m} : 表示n到m次 () 表示一个整体 | 表示或 其它正则表达式语法,正则表达式速查表-在线工具 (yum.im) 2.3 java中的正则表达式 2.3.1 Pattern 用于创建一个正则表达式也可以说式创建一个匹配模式他的构造方法是私有的 不可以直接创建可以通过Pattern.complie(String regex)创建一个正则表达式 只能做一些简单的匹配操作
public class Regex_01 {public static void main(String[] args) {test2();}// String[] split(CharSequence input) : 根据正则表达式进行分割,返回字符串数组public static void test1() {String str 1.2.3.4;// 创建正则表达式Pattern pattern Pattern.compile(\\.);// 分割,返回字符串数组String[] arr pattern.split(str);// 使用String类中的分割方法arr str.split(\\.);}// Pattern.matches() : 静态方法,用于快速匹配字符串// 全词匹配public static void test2(){String str 123456790;String regex \\d{9};System.out.println(Pattern.matches(regex, str));// String中的方法System.out.println(str.matches(regex));}
}2.3.2 Matcher 构造方法也是私有的不能随意创建只能通过Pattern.matcher(CharSequence input)方法得到该类的实例 Matcher m p.matcher(aaaaab);支持便捷强大的正则匹配操作包括分组、多次匹配支持
/** Matcher 匹配器* * matches : 全词匹配* * find : 在任意位置均可* * lookingAt : 从前向后匹配*/
public class Regex_02 {public static void main(String[] args) {String regex \\d{11};String input 131a11231231213a111111111111s12345678900;// 引擎Pattern pattern Pattern.compile(regex);// 匹配器,使用完之后要重新生成匹配器Matcher matcher pattern.matcher(input);// 全词匹配System.out.println(matcher.matches());// 前面符合条件就行matcher pattern.matcher(input);System.out.println(matcher.lookingAt());// 任意位置均可,所以当有多个符合条件的数据时,可以使用多次find// 第一次find找第一次符合条件的.第二次find找第二个符合条件的,以此类推matcher pattern.matcher(input);System.out.println(matcher.find());System.out.println(matcher.find());//find结合group 可以做到数据提取input 张三电话是13113113111李四电话是13113113112王五电话是13113113113赵小六电话是13113113114;// 一个() 就是一个整体,也可以作为一个分组regex (.{2,3})电话是(\\d{11});pattern Pattern.compile(regex);matcher pattern.matcher(input);while (matcher.find()) {// 无参 和 传入 0 都是提取匹配到的数据// 1 就是匹配到的第一组数据,() 就是一个组// 2 就是第二组 以此类推System.out.println(matcher.group(1) : matcher.group(2));// 匹配元素的起始下标// System.out.println(matcher.start());// 匹配元素的结束下标// System.out.println(matcher.end());}}
}