------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、网络编程
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 {
//创建客户端Socket对象
Sockets = new Socket("192.168.3.100", 22222);
//封装键盘录入
BufferedReaderbr = new BufferedReader(new InputStreamReader(System.in));
//获取输出流
//OutputStream os = s.getOutputStream();
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 {
//创建服务器Socket对象
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();
//ss.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();
}
}
2、单例设计模式:当我们想要在所有程序运行状态中,所用的一个类的对象,都是同一个对象的时候就用单例模式
单例饿汉式举例:
public class Student {
//把构造方法私有,是为了不让外界随意创建
privateStudent() {
}
//类本身要创建一个对象。
//由于静态只能访问静态,所以这里加静态
//为了不让外界通过类名直接访问s成员变量,就加私有
privatestatic Student s = new Student();
//提供公共的方式让别人使用
//为了让外界能够直接通过类名访问该方法,需要对该方法加静态
publicstatic Student getStudent() {
// return new Student(); //这是有问题的
return s;
}
}
单例懒汉式举例:
public class Teacher {
privateTeacher() {
}
privatestatic Teacher t = null;
publicsynchronized static Teacher getTeacher() {
// t1,t2,t3三个线程过来了
// 如果t是null的时候,才创建对象
if (t == null) {
//t1进来了,CPU的执行权就被t2抢到了,同理t3
t= new Teacher();
}
return t;
}
}
模板设计模式:当我们执行的某些程序时发现执行的所有的程序 外面的框框都不会变,只需要改变同样地方的一些东西的时候,就可以使用模板模式
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();
}
}