一、网络编程
1、网络的概述
网络就是计算机与计算机之间进行通信
2、网络编程三要素:IP 端口 协议
3、IP地址
a、它是网络中的设备标识
b、不易记忆,可用主机名表示,两者存在映射关系
c、本机回环地址:127.0.0.1,主机名为:localhost。
IP地址:Java中对应的是InetAddress类,存在于java.net包中。
IP的每一位数不超过256
(1)IP地址的分类:
A类 1.0.0.1---127.255.255.254 (1)10.X.X.X是私有地址(私有地址就是在互联网上不使用,而被用在局域网络中的地址) (2)127.X.X.X是保留地址,用做循环测试用的。
B类 128.0.0.1---191.255.255.254 172.16.0.0---172.31.255.255是私有地址。169.254.X.X是保留地址。
C类 192.0.0.1---223.255.255.254 192.168.X.X是私有地址
D类 224.0.0.1---239.255.255.254
E类 240.0.0.1---247.255.255.254
(2)IP地址的组成:
IP地址 = 网络号码+主机地址
A类IP地址:第一段号码为网络号码,剩下的三段号码为本地计算机的号码
256*256*256 --- 16777216
B类IP地址:前二段号码为网络号码,剩下的二段号码为本地计算机的号码
256*256 --- 65536
C类IP地址:前三段号码为网络号码,剩下的一段号码为本地计算机的号码
256
4、端口号:
a、用于标识进程的逻辑地址,不用进程的标识。
b、有效端口:0 ~65535,系统使用或保留的端口是:0~ 1024
5、传输协议:
即通信规则,包含TCP和UDP协议
TCP协议的特点:
建立连接通道
数据无限制
面向连接(三次握手)
可靠
速度慢
UDP协议的特点:
把数据打包
数据有限制
面向无连接
不可靠
速度快
6、Socket
Socket是Internet主机上(计算机)提供的服务
Socket编程 套接字编程 网络编程
InetAdress:java中计算机IP对应的类
publicstatic InetAddress getByName(String host)
IP地址:public String getHostAddress()
主机名:public String getHostName()
7、面向UDP协议编程:
UDP发送端(理解或者掌握)
A:创建发送端Socket服务对象
B:创建数据,并把数据打包
C:发送数据
D:释放资源
UDP协议接收数据步骤:
A:创建接收端Socket服务对象
B:创建数据包(接收容器)
C:调用接收方法
D:解析数据包,把数据显示在控制台
E:释放资源
UDP协议发送数据和接收数据的代码改进
UDP协议键盘录入数据发送到接收端
广播地址
每个网段的255的IP就是广播地址
比如: 192.168.1.255
只要发送端发送的192.168.1.255,如果192.168.1.*都开了接收端,就都能接收到数据
UDP编程结合线程模拟聊天室
开两个线程一个线程写接收端 一个线程写发送端
面向TCP协议编程:
TCP协议客户端的步骤:
A:创建客户端的Socket对象
B:建立连接
C:获取输出流,写数据即可
D:释放资源
TCP协议服务器端的步骤:
A:创建服务器端Socket对象
B:监听连接
C:获取输入流,读取数据,并显示
D:释放资源
TCP服务器端和客户端相互发送数据
案例:写出一个服务器,要求该服务器具有将客户端发过来的英文字母转大写的功能 ,
并将转大写后的字母发送回客户端
-
- packagecn.itcast_08;
- importjava.io.BufferedReader;
- importjava.io.BufferedWriter;
- importjava.io.IOException;
- importjava.io.InputStreamReader;
- importjava.io.OutputStreamWriter;
- importjava.net.Socket;
-
-
-
-
- public classClientDemo {
- public static void main(String[] args)throws IOException {
-
- Sockets = new Socket("192.168.3.100", 22222);
-
-
- BufferedReaderbr = new BufferedReader(new InputStreamReader(System.in));
-
-
- BufferedWriterbw = new BufferedWriter(new OutputStreamWriter(
- s.getOutputStream()));
-
- Stringline = null;
- while((line = br.readLine()) != null) {
- if ("over".equals(line)) {
- break;
- }
-
- bw.write(line);
- bw.newLine();
- bw.flush();
-
-
- BufferedReader brServer = newBufferedReader(new InputStreamReader(
- s.getInputStream()));
- String server = brServer.readLine();
- System.out.println("server:" +server);
- }
-
- br.close();
- s.close();
- }
- }
-
- packagecn.itcast_08;
-
- importjava.io.BufferedReader;
- importjava.io.BufferedWriter;
- importjava.io.IOException;
- importjava.io.InputStreamReader;
- importjava.io.OutputStreamWriter;
- import java.net.ServerSocket;
- importjava.net.Socket;
-
- public classServerDemo {
- public static void main(String[] args)throws IOException {
-
- ServerSocketss = new ServerSocket(22222);
-
-
- Sockets = ss.accept();
-
-
- BufferedReaderbr = new BufferedReader(new InputStreamReader(
- s.getInputStream()));
- BufferedWriterbw = new BufferedWriter(new OutputStreamWriter(
- s.getOutputStream()));
-
- Stringline = null;
- while((line = br.readLine()) != null) {
- bw.write(line.toUpperCase());
- bw.newLine();
- bw.flush();
- }
-
- s.close();
-
- }
- }
二、设计模式
设计模式:
设计模式是一种思想(不是技术,技术是像IO 反射 集合这样的),是一种帮助开发人员完成某些代码上的逻辑,
使代码的逻辑更严谨,是代码更加简洁,美观。(设计模式并没有提高代码的运行效率和速度,
如果想要更多的去了解如何提高程序的运行速度的思想,请去了解数据结构的思想
数据结构的思想:拿空间换时间拿时间换空间)
通常项目比较庞大的情况下才能体现出设计模式的好处
创建型:创建对象。工厂模式,单例模式。
结构型:对象间的关系。装饰模式。
行为型:对象能够做什么。模板模式。
1、工厂模式:当我们想要获取某个对象的时候,想在获取对象之前做一些初始化的动作就用到了工厂模式
简单工厂模式举例:
- public abstract class Animal {
- publicabstract void eat();
- }
- public class AnimalFactory {
- privateAnimalFactory() {
- }
- publicstatic Animal createAnimal(String type) {
- if ("dog".equals(type)) {
- returnnew Dog();
- } else if ("cat".equals(type)){
- returnnew Cat();
- } else {
- returnnull;
- }
- }
- }
- public static void main(String[] args) {
-
- Animala = AnimalFactory.createAnimal("dog");
- a.eat();
-
- a= AnimalFactory.createAnimal("cat");
- a.eat();
- }
-
- public class Cat extends Animal {
- @Override
- publicvoid eat() {
- System.out.println("猫吃老鼠");
- }
- }
-
- public class Dog extends Animal {
- @Override
- publicvoid eat() {
- System.out.println("狗吃骨头");
- }
- }
工厂方法模式举例:
- public abstract class Animal {
- publicabstract void eat();
- }
-
- public abstract class AnimalFactory {
- publicabstract Animal createAnimal();
- }
- public class Cat extends Animal {
- @Override
- publicvoid eat() {
- System.out.println("猫吃老鼠");
- }
- }
- public class CatFactory extendsAnimalFactory {
- @Override
- publicAnimal createAnimal() {
- return new Cat();
- }
- }
- public class Dog extends Animal {
- @Override
- publicvoid eat() {
- System.out.println("狗吃骨头");
- }
- }
- public class DogFactory extendsAnimalFactory {
- @Override
- publicAnimal createAnimal() {
- return new Dog();
- }
- }
- public class Pig extends Animal {
- @Override
- publicvoid eat() {
- System.out.println("猪吃饲料");
- }
- }
- public class PigFactory extendsAnimalFactory {
- @Override
- publicAnimal createAnimal() {
- return new Pig();
- }
- }
- public class AnimalTest {
- publicstatic void main(String[] args) {
-
- AnimalFactory af = new DogFactory();
- Animal a = af.createAnimal();
- a.eat();
-
- af = new CatFactory();
- a = af.createAnimal();
- a.eat();
-
- af = new PigFactory();
- a = af.createAnimal();
- a.eat();
- }
- }
- <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>
2、单例设计模式:当我们想要在所有程序运行状态中,所用的一个类的对象,都是同一个对象的时候就用单例模式
单例饿汉式举例:
- public class Student {
-
- privateStudent() {
- }
-
-
-
- privatestatic Student s = new Student();
-
-
-
- publicstatic Student getStudent() {
-
- return s;
- }
- }<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>
单例懒汉式举例:
- public class Teacher {
-
- privateTeacher() {
- }
- privatestatic Teacher t = null;
- publicsynchronized static Teacher getTeacher() {
-
-
- if (t == null) {
-
- t= new Teacher();
- }
- return t;
- }
- }<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>
模板设计模式:当我们执行的某些程序时发现执行的所有的程序 外面的框框都不会变,只需要改变同样地方的一些东西的时候,就可以使用模板模式
- public class PrintDemo1 extendsPrintTemplet {
- @Override
- publicvoid printHead() {
- System.out.println("采用第一种方案打印头");
- }
- @Override
- publicvoid printBody() {
- System.out.println("采用第一种方案打印中间");
- }
- @Override
- publicvoid printBottom() {
- System.out.println("采用第一种方案打印尾");
- }
- }
-
- public class PrintDemo2 extendsPrintTemplet {
- @Override
- publicvoid printHead() {
- System.out.println("采用第二种方案打印头");
- }
- @Override
- publicvoid printBody() {
- System.out.println("采用第二种方案打印中间");
- }
- @Override
- publicvoid printBottom() {
- System.out.println("采用第二种方案打印尾");
- }
- }
- public abstract class PrintTemplet {
- publicvoid print() {
- printHead();
- printBody();
- printBottom();
- }
- publicabstract void printHead();
- publicabstract void printBody();
- publicabstract void printBottom();
- }
- public class PrintTest {
- publicstatic void main(String[] args) {
- PrintTemplet pt = new PrintDemo1();
- pt.print();
- System.out.println("------------");
- pt = new PrintDemo2();
- pt.print();
- }
- }
3、装饰者模式:当我们觉得某个类的内容需要拓展一些功能的时候,我们会首先想到继承,确实继承可以解决在原来的基础上拓展功能
但是当子类想用原来的功能,就必须要用父类来实现,但是如果某一天父类功能改变了,我还想让子类有同样的功能和拓展功能,
这样是不能实现的。
所以我们有了装饰者设计模式,建一个装饰类,把被装饰的类作为构造方法的参数传进来,就可以实现功能的拓展,
这就是装饰者模式
装饰者模式举例:
- public interface Phone {
- publicabstract void call();
- }
- public class PhoneImpl implements Phone {
- @Override
- publicvoid call() {
- System.out.println("用手机打电话");
- }
- }
- public abstract class PhoneDecorateimplements Phone {
- privatePhone phone;
- publicPhoneDecorate(Phone phone) {
- this.phone = phone;
- }
- @Override
- publicvoid call() {
- this.phone.call();
- }
- }
-
- public class GuangGaoPhoneDecorateextends PhoneDecorate {
- publicGuangGaoPhoneDecorate(Phone phone) {
- super(phone);
- }
- @Override
- publicvoid call() {
- super.call();
- System.out.println("播放广告");
- }
- }
-
- public class ColorPhoneDecorate extendsPhoneDecorate {
- publicColorPhoneDecorate(Phone phone) {
- super(phone);
- }
- @Override
- publicvoid call() {
- System.out.println("播放彩铃");
- super.call();
- }
- }
- public class PhoneTest {
- publicstatic void main(String[] args) {
- Phone p = new PhoneImpl();
- p.call();
- System.out.println("---------------");
-
- PhoneDecorate pd = newColorPhoneDecorate(p);
- pd.call();
- System.out.println("---------------");
-
- pd = new GuangGaoPhoneDecorate(p);
- pd.call();
- System.out.println("---------------");
-
- ColorPhoneDecorate cc =newColorPhoneDecorate(p);
- pd = new GuangGaoPhoneDecorate(cc);
- pd.call();
- }
- }
-