目录
一、网络
一组 由 网线连接起来的计算机。
二、协议
三、IP地址
四、InetAddress
五、域名
简称域名、网域,是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。
网域名称系统(DNS,Domain Name System,将域名和IP地址相互映射的一个分布式数据库)是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网,而不用去记住能够被机器直接读取的IP地址数串。
六、端口
"端口"是英文port的意译,可以认为是设备与外界通讯交流的出口。端口可分为虚拟端口和物理端口,其中虚拟端口指计算机内部或交换机路由器内的端口,不可见。例如计算机中的80端口、21端口、23端口等。物理端口又称为接口,是可见端口,计算机背板的RJ45网口,交换机路由器集线器等RJ45端口。电话使用RJ11插口也属于物理端口的范畴。
前 1024 不建议使用
七、URL
URL :统一资源定位符。
协议:告诉浏览器 以什么样的形式 处理打开的文件;
主机名:资源所在的机器。
端口: 资源所在的程序;
路径: 资源所在的位置。
查询字符串: 访问的资源的查询 字符串信息
片段: 资源所在的段落。
URL url = new URL("https://mp.csdn.net/postedit?not_checkout=1");
System.out.println(url.getHost());
System.out.println(url.getPath());
System.out.println(url.getFile());
System.out.println(url.getDefaultPort());
System.out.println(url.getPort());
八、数据传输
基于 TCP协议: 数据的准确性。
UDP : 不能保证数据的准确。
C/S : 客户端 / 服务器
B / S : 浏览器 : 服务器
首先非常明确的是两次握手是最基本的。第一次握手,客户端发了个连接请求消息到服务端,服务端收到信息后知道自己与客户端是可以连接成功的,但此时客户端并不知道服务端是否已经接收到了它的请求,所以服务端接收到消息后的应答,客户端得到服务端的反馈后,才确定自己与服务端是可以连接上的,这就是第二次握手。
客户端只有确定了自己能与服务端连接上才能开始发数据。所以两次握手肯定是最基本的。
看到这里,你或许会问,那么为什么需要第三次握手呢?我们来看一下,假设一下如果没有第三次握手,而是两次握手后我们就认为连接成功了,那么会发生什么?第三次握手是为了防止已经失效的连接请求报文段突然又传到服务端,因而产生错误。
譬如发起请求遇到类似这样的情况:客户端发出去的第一个连接请求由于某些原因在网络节点中滞留了导致延迟,直到连接释放的某个时间点才到达服务端,这是一个早已失效的报文,但是此时服务端仍然认为这是客户端的建立连接请求第一次握手,于是服务端回应了客户端,第二次握手。
举个生活的例子:去一家公司面试,你去面试了(第一次握手),面试完你是不知道你能不能上班的,所以得需要面试官得回应确认。那么面试官发offer(第二次握手),这时候你拿了offer不一定去,你可能还有别的offer。这时候你需要去办入职(第三次握手)。才能正在得拿工资,真正得建立连接。
下面写一个简单的通信:
还是老规矩:编程之前思路是什么?
建立通信:
服务端:
1.创建服务端类
2. 在服务类类里面创建 ServerSocket对象。 创建服务器
3. 确认客户端 和 服务器连接,返回一个Socket类型的对象
4.获得底层Socket 读 写
5.包装流
6.向客户端发送一条消息
7.读客户端发来消息
客户端:
1.创建客户端
2.获得底层scoket对象
3.包装流
4.接收服务端的信息
5.向服务端回复接收了信息
下面模拟服务端和客户端连续通话:
客户端:
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket(InetAddress.getLocalHost(),9999);
//获得底层 Socket
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
//包装流
Scanner sc = new Scanner(is);
PrintWriter pw = new PrintWriter(os,true);
String str,sw;
Scanner s = new Scanner(System.in);
//客户端接收信息
while(true){
//读服务器的
str = sc.nextLine();
System.out.println("服务器说:"+str);
//写
System.out.println("----客户端:");
sw = s.next();
pw.println(sw);
if(sw.equals("拜拜")){
break;//聊到拜拜就结束
}
}
//客户端说
socket.close();
}
服务端:
public static void main(String[] args) throws IOException {
// 创建一个服务器
ServerSocket server = new ServerSocket(9999);
//确认和客户端连接返回一个socket对象
Socket socket = server.accept();
//获得底层socket对象
InputStream input = socket.getInputStream(); //读
OutputStream output = socket.getOutputStream();//写
//包装流
Scanner sc = new Scanner(input);
PrintWriter pw = new PrintWriter(output,true);
//创建String
pw.println("客户端连接服务器成功");
String str,sw;
Scanner s = new Scanner(System.in);
while(true){
//接收客户端消息 读
str = sc.nextLine();
System.out.println("客户端说:"+str);
System.out.println("----服务器:");
//写
sw = s.next();
pw.println(sw);
if(sw.equals("拜拜")){
break;
}
}
socket.close();
//读用户发过来的
总结:这里注意,客户端首先要接收服务器的消息,也就是先读后写,服务器也是一样,先读后写。