网络
网络模型与协议
OSI
常被说成OSI七层,TCP/IP五层或者四层
七层模型 : 应用层,表示层,会话层,传输层,网络层,链路层,物理层
五层模型 : 应用层,传输层,网络层,链路层,物理层
四层模型 : 应用层,传输层,网络层,链路层
应用层:
http(超文本传输协议)
ftp(文件传输协议)
stmp (邮件发送协议)
pop3(邮件接收协议)
ssh ( 安全shell,用于远程登录)
传输层:
tcp(安全可靠的协议)
udp(不可靠)
网络层:
ip : 地址的作用是用来定位到网络上另一台计算机
windows下可以使用 ipconfig
来查看ip地址
linux 下可以使用 ifconfig
来查看ip地址
端口是计算机与外界通信交流的入口和出口
端口号的作用是用来标记,要访问对方的哪个程序
- http服务使用 80 端口
- ftp服务使用21 端口
- ssh服务使用22端口
- qq使用的是8000端口
- oracle监听端口使用1521 8080
- mysql监听端口是3306
- redis使用的是6379端口
- tomcat使用的是8080端口
传输层协议TCP
特点 :
是一个有连接、可靠的协议。所谓有连接,指的是在进行 TCP通信之前,两个需要通信的
主机之间要首先建立一条数据通道,就好像打电话进行交流之前,首先要让电话接通一样。所
谓可靠,指的是 TCP 协议能够保证: 1、发送端发送的数据不会丢失; 2、接收端接受的数据包
的顺序,会按照发送端发送的包的顺序接受。也就是说, TCP协议能够保证数据能够完整无误的
传输。
传输层协议UDP
特点 :
1)与 TCP 协议相比, UDP 是一个无连接,不可靠的协议。 即:数据的发送方只负责将数
据发送出去,数据的接受方只负责接受数据。发送方和接收方不会相互确认数据的传输是否成功。
2)相对于 TCP 而言, UDP 有一个优点:效率较高。因此,当我们在对数据传输的正确率
不太关心,但是对传输效率要求较高的情况下,可以采用 UDP 协议。典型的使用 UDP 协议的
是网络语音以及视频聊天应用。
java中的网络编程
Socket API 对tcp、udp协议做了封装,能够连接到对方主机,收发数据
服务器端 :
public static void main(String[] args) throws IOException {
// 可以与客户端的socket建立连接 端口号一般使用4位以上的数字
ServerSocket ss = new ServerSocket(5555);
System.out.println("ready...等待客户端连接");
// 端点
Socket socket = ss.accept();// 等待客户端连接我服务器方法,直到有客户端连接
InputStream is =socket.getInputStream();
.....
.....
}
客户端:
public static void main(String[] args) throws IOException {
// 本机ip地址在dos界面使用`ipconfig`来查看
// 它的别名 localhost
// 端点
Socket socket = new Socket("localhost", 5555);
OutputStream os = socket.getOutputStream();
Scanner sc = new Scanner(System.in);
String s = sc.nextLind();
os.write(s.getBytes());
}
扩展设计模式(一)
单例(singleton) 模式
定义: 在jvm虚拟机中, 某个类只有一个实例,就称之为单例。
饿汉式单例
方法一
public class Singleton {
// 1. 把构造方法变为私有,这样就限制了其它类创建Singleton的实例
private Singleton(){}
// 2. Singleton类自己创建唯一的一个实例
private static Singleton me = new Singleton();
// 3. 提供一个公共方法返回此唯一实例
public static Singleton getInstance() {
return me;
}
}
//实例只需调用getInstance方法即可
方法二
public enum Singleton4 {
ME;
private Singleton4(){
System.out.println("Singleton4 的构造方法被调用");
}
public static void test() {
System.out.println("test");
}
public static void main(String[] args) {
Singleton4.test();
}
}
懒汉式单例
刚开始不创建,第一次用到时才创建方式一
public class Singleton2 {
private Singleton2() { }
private volatile static Singleton2 me; // null 设为volatile保证它的可见性
// 潜在问题, 需要考虑线程安全, 可以使用synchronized来解决
public static synchronized Singleton2 getInstance() { // 锁住了Singleton2.class
// 先判断是不是第一次使用me(是否为null)
if( me == null ) { // 线程1. null // 线程2. null
me = new Singleton2();
}
return me;
}
// double check 方式
public static Singleton2 getInstance2() {
if( me == null ) {
// 优化,进一步缩小了synchronized的范围,仅在第一次调用getInstance2方法时才会同步
synchronized (Singleton2.class) {
if( me == null ) {
me = new Singleton2();
}
}
}
return me;
}
}
方式二(优化)
public class Singleton3 {
private Singleton3() {
System.out.println("Singleton3 构造方法被调用");
}
private static class Holder {
private static Singleton3 ME = new Singleton3();
}
public static Singleton3 getInstance() {
return Holder.ME;
}
public static void test() {
System.out.println("test");
}
}