ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

day27

2022-04-12 19:31:06  阅读:154  来源: 互联网

标签:Socket 对象 ip day27 地址 主机 String


定时器:

定时器是一个应用十分广泛的线程工具,可用于调度多个定时任务以后台线程的方式执行。
在Java中,可以通过Timer和TimerTask类来实现定义调度的功能。

如何创建定时器呢?
//创建定时器对象
//Timer()
//创建一个新的计时器。
//Timer timer = new Timer();

如何调度任务执行呢?
//需求:在指定的延迟后执行指定任务的执行。定时在未来的某一时刻执行任务
//void schedule(TimerTask task, long delay)
--delay 这个类型表示的是毫秒

//需求:在指定的延迟之后开始 ,重新执行固定延迟执行的指定任务。
//void schedule(TimerTask task, long delay, long period)

//timer.cancel(); --终止此计时器

设计模式:

设计模式:经验的总结
1、创建型 创建对象
2、结构型 对象的组成
3、行为型 对象的功能

创建型模式:
1、单例模式:指的是在程序的运行过程中,内存只允许有一个对象存在
如何保障类在内存只有一个对象呢?
1、构造方法私有化
2、在类的内部成员变量位置上创建一个对象
3、提供公共的方法将唯一的对象返回出来获取
--饿汉式:类一加载,对象就创建好了
--懒汉式:用的时候,再去创建对象
面试题:你知道java中的单例模式吗?开发中你喜欢用哪一种?
知道,有饿汉式和懒汉式,饿汉式是指类加载的时候,对象就创建好了,懒汉式指的是用的时候再去创建对象;但是,开发中使用饿汉式,因为懒汉式可能会有线程安全问题。
2、简单工厂模式(静态工厂方法模式)
3、工厂方法模式
上一个案例中我们使用的是简单工厂模式的思想,我们想创建一个新的动物就需要去改动原来的工厂类。正常情况下,工厂类一旦创建就不能被修改,所以在原来的简单工厂模式下进行改进得到工厂方法模式。

网络编程:

网络参考模型图:
OSI参考模型: TCP/IP参考模型:
应用层、表示层、会话层 -- 应用层
传输层 -- 传输层
网络层 -- 网络层
数据链路层、物理层 -- 主机至网络层

网络编程的三要素:IP地址,端口号,协议
举例:
某一天,xxx喜欢上一个女孩,他想和这个女孩表白,怎么办?
1、首先他要去找到这个女生 -- IP地址
2、找到这个女孩之后,他要开始表白了,跟她说话,对着耳朵说话。 -- 端口号
3、他要说什么呢?“I Love You”
但是呢,那个女生没有学过英文,听不懂。
他就没有必要说英文,说她能听懂的语言,说“我爱你” -- 协议 (TCP,UDP)

网络编程三要素:
1、IP地址:计算机在网络中的唯一标识。
查看windows中ip地址:win + R,输入cmd,输入ipconfig查看 //192.168.10.112
查看Mac中的ip地址:终端窗口中,输入ifconfig查看

IP地址应该也是在计算机中进行存储的,但是呢,计算机只能识别二进制的数据,这里IP应该实际上也是二进制才对的。
IP:192.168.10.112
换成二进制:11000000.10101000.00001010.01110000
实际上存储的时候是没有.的:11000000101010000000101001110000,但是呢,我们今后的学习过程中,难免会遇到配置ip地址的时候,记忆的时候拿着这个二进制的ip地址去记忆使用,表示起来会很麻烦,所以,为了更方便的表达ip地址,国际上规定我们就把ip地址的每一个字节上的数据换算成十进制的,然后在字节与字节之间使用.来进行分割,这样的表示法:点分十进制表示法。

IP地址的组成:网络号段 + 主机号段组成
IP地址的分类:IP地址主要分为A,B,C,D,E五类,其中A,B,C类是比较常用的,D,E类为特殊地址。

1)A类地址(由一个网络号段和3个主机号段组成)
A类地址第一个字节为网络地址(其中最高位固定是0),另外三个字节为主机地址
A类地址的范围是:1.0.0.0 ~ 126.255.255.255,其中0和127作为特殊地址
A类网络默认的子网掩码为255.0.0.0,也可以写成 /8
A类网络中最大可以承受的主机数量:256*256*256-2.(减去的是1个主机为为0的网络地址和1个广播地址)
在计算网络中,主机ID全部为0的地址为网络地址,而主机ID全部为255的地址为广播地址,这两个地址是不能分配给主机用的。

2)B类地址(由两个网络号段和两个主机号段组成)
B类地址第一个字节(最高位固定为10)和第二个字节为网络号段,另外两个字节为主机号段
B类地址的范围是:128.0.0.0 ~ 191.255.255.255
B类网络默认的子网掩码是255.255.0.0.也可写成 /16
B类网络可以最大承受主机数量为:256*256-2

3)C类地址(由三个网络号段和一个主机号段组成)
C类地址第一个字节(最高为固定是110),第二个字节,第三个字节为网络号段,第四个字节为主机号段
C类地址范围:192.0.0.0 ~ 223.255.255.255
C类网络默认的子网掩码255.255.255.0 也可写成 /24
C类网络可以承受最大主机数:256-2

4)D类 224.0.0.1---239.255.255.254

5)E类 240.0.0.1---247.255.255.254

几个特殊的IP地址:
1、localhost == 本机 == 127.0.0.1
127.0.0.1 本地回环地址,可以用来测试本机的网络是否有问题。
测试网络是否联通:ping + ip地址/主机名

2、广播地址
x.x.x.255

3、网络地址
x.x.x.0

4、查看ip地址:
Windows: ipconfig
Mac:ifconfig
Linux:
centOS6: ifconfig
centOS7:ip addr

2、端口号:
物理端口 网卡口
逻辑端口 我们指的就是逻辑端口
A:每个网络程序都会至少有一个逻辑端口
B:用于标识进程的逻辑地址,不同进程的标识
C:有效端口:0~65535,其中0~1024系统使用或保留端口。
通过netstat -ano可以查看端口号

3、协议
UDP协议(发短信,飞鸽传书)
TCP协议(建立连接,极域) 三次握手,四次挥手 ack

InetAddress:

为了方便我们获取和操作IP地址,java提供了一个类InetAddress 供我们使用。

InetAddress addressName = InetAddress.getByName("192.168.10.112");
System.out.println(addressName);
//public static InetAddress getByName(String host) throws UnknownHostException
//确定主机名称的IP地址。

String hostName = addressName.getHostName();
//String getHostName()
//获取此IP地址的主机名。

String hostAddress = addressName.getHostAddress();
System.out.println(hostAddress);
//String getHostAddress()
//返回文本显示中的IP地址字符串。

UDP协议:

UDP协议发送数据的步骤:
1、创建发送端的Socket对象
2、创建数据,并将数据打包
3、调用Socket对象中的一个方法,将数据包发送出去
4、释放资源,关闭Socket对象
步骤:
//创建发送端的Socket对象
//DatagramSocket()
//构造数据报套接字并将其绑定到本地主机上的任何可用端口。
DatagramSocket ds = new DatagramSocket();

//将数据转成字节数组
byte[] bytes = "你好,数加科技".getBytes();

//获取字节数组的大小
int length = bytes.length;

//IP地址对象(你要发送给谁的ip地址)
InetAddress address = InetAddress.getByName("192.168.10.112");

//指定接收端的端口号
int port = 10086;

//创建一个数据包
//DatagramPacket(byte[] buf, int length, InetAddress address, int port)

//构造用于发送长度的分组的数据报包 length指定主机上到指定的端口号。
DatagramPacket dp = new DatagramPacket(bytes, length, address, port);

//调用Socket对象中的一个方法,将数据包发送出去
//void send(DatagramPacket p)

//从此套接字发送数据报包。
ds.send(dp);

//释放资源,关闭Socket对象
ds.close();

UDP接收端代码步骤:
1、创建接收端的Socket对象
2、创建一个数据包(用来接收数据的容器)
3、调用Socket对象中一个方法接收数据
4、解析数据包,打印在控制台上
5、释放资源
注意:接收端不能重复启动
步骤:
//1、创建接收端的Socket对象
//DatagramSocket(int port)
//构造数据报套接字并将其绑定到本地主机上的指定端口。
DatagramSocket ds = new DatagramSocket(10086);

//2、创建一个数据包(用来接收数据的容器)
//DatagramPacket(byte[] buf, int length)
//构造一个 DatagramPacket用于接收长度的数据包 length 。
byte[] bytes = new byte[1024];
int length = bytes.length;
DatagramPacket dp = new DatagramPacket(bytes, length);

//3、调用Socket对象中一个方法接收数据
//void receive(DatagramPacket p)
//从此套接字接收数据报包
ds.receive(dp); //阻塞式方法

InetAddress address = dp.getAddress();
String ip = address.getHostAddress();
String hostName = address.getHostName();

//4、解析数据包,打印在控制台上
//byte[] getData()
//返回数据缓冲区。
byte[] data = dp.getData();
int length1 = dp.getLength(); //获取实际的数据长度
String s = new String(data, 0, length1);
System.out.println(hostName + ",ip地址为:" + ip + "发送的内容为:" + s);

//释放资源
ds.close();

TCP协议:

TCP协议发送数据的步骤:
1、创建客户端的Socket对象
这一步一旦成功了,就说明连接建立成功!
2、获取通道中的输出流对象,写数据
3、释放资源
步骤:
①//Socket(InetAddress address, int port)
//创建流套接字并将其连接到指定IP地址的指定端口号。
Socket s = new Socket(InetAddress.getByName("192.168.10.112"), 12345);

②//Socket(String host, int port)
//创建流套接字并将其连接到指定主机上的指定端口号。
Socket s = new Socket("192.168.10.112", 12345);

//获取通道中的输出流对象,写数据
while (true){
Scanner sc = new Scanner(System.in);
String next = sc.next();
if ("886".equals(next)) {
break;
}

OutputStream os = s.getOutputStream();
os.write(next.getBytes());
}

//释放资源
s.close();

TCP协议服务器端接收数据步骤:
1、创建服务器端的Socket对象
2、监听客户端的连接,返回一个Socket对象,这个Socket对象就封装了客户端的ip等一些信息
3、获取通道中的输入流对象,读取数据并显示在控制台上
4、释放资源(一般情况下,服务器一旦启动,很少关闭)
步骤:
//1、创建服务器端的Socket对象
//将程序绑定到计算机上的一个端口号上
ServerSocket ss = new ServerSocket(12345);

//2、监听客户端的连接,返回一个Socket对象,这个Socket对象就封装了客户端的ip等一些信息
//Socket accept()
//侦听要连接到此套接字并接受它。
Socket socket = ss.accept(); //阻塞

while (true){
//3、获取通道中的输入流对象,读取数据并显示在控制台上
InputStream is = socket.getInputStream();
byte[] bytes = new byte[1024];
int length = is.read(bytes);
String s = new String(bytes, 0, length);

//获取客户端的ip地址
InetAddress address = socket.getInetAddress();
String ip = address.getHostAddress();
String hostName = address.getHostName();
System.out.println(ip + ",主机名:" + hostName + "发送的数据为:" + s);
}

//4、释放资源(一般情况下,服务器一旦启动,很少关闭)
ss.close();

标签:Socket,对象,ip,day27,地址,主机,String
来源: https://www.cnblogs.com/cpfhome/p/16136563.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有