Day32
*计算机网络:为实现资源共享和信息的传递,通过信息线路连接起来的若干主机(Host)
互联网:点与点相连
万维网:端与端相连
物联网:物与物相连
网络编程:让计算机与计算机之间建立连接、进行通信
*TCP/IP模型:
一:网络接口层,负责建立电脑与电脑直接物理设备的连接(例如,网线,路由器,网卡等)
二:网络层,物理连接实现之后,需要对每台电脑进行区分,这就给每台电脑分配了一个IP地址,就像我们的身份证一样
三:传输层:电脑之间的信息交互需要遵从一个协议:TCP/UDP
四:应用层:应用层是直接与用户进行交互的,所以我们封装了一个更加方便,简单易懂的上层协议(类似于加了一个包装类):HTTP SMTP FTP。
用户和服务器之间的时用HTTP协议(本质上也是TCP),计算机与计算机之间使用TCP协议
*TCP/UDP:
TCP协议:是一种面向连接的、可靠的、基于字节流的传输层通信协议。数据大小没有限制。建立连接需要进行三次握手,断开连接需要4次挥手
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qKmD7mWE-1584494126639)(C:\Users\吴一凡\AppData\Roaming\Typora\typora-user-images\image-20200317121618832.png)]
UDP协议:是一种没有连接环节的传输层协议,提供面向失误的简单不可靠信息传送服务,每个包的大小为64kb
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vRGDtzbF-1584494126641)(C:\Users\吴一凡\AppData\Roaming\Typora\typora-user-images\image-20200317121807541.png)]
*127.0.0.1 和 localhost 都是指本机。 查看IP命令:ipconfig 测试IP命令:ping D.D.D.D
*端口号:port,在通信实体上进行网络铜须的程序的唯一标识。通俗来说,端口号就是程序在计算机上的身份证。
*InetAddress类:概念,表示ID地址对象,封装了与该IP地址相关的所有信息,并提供了获取信息的常用方法。
import java.net.InetAddress;
import java.net.UnknownHostException;
public class TestInetAddress {
public static void main(String[] args) {
try {
InetAddress ia = InetAddress.getLocalHost();
System.out.println("主机名"+ia.getHostName());
System.out.println("主机地址"+ia.getHostAddress());
} catch (UnknownHostException e) {
e.printStackTrace();
}
try {
//·获取所有的IP地址
InetAddress[] ia2 = InetAddress.getAllByName("www.baidu.com");
for (InetAddress inetAddress : ia2) {
System.out.println(inetAddress.getHostAddress());
}
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
*Socket编程:Socket是网络中的一个通信节点
分为客户端Socket与服务器端ServerSocket;通信要求:IP+端口号
package com.qianfeng.pm.demo2;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author 吴一凡
* 服务器端
*/
public class DemoServer {
public static void main(String[] args) {
int port = 8888;
try {
//·主动指定一个端口,那么客户端代码,就可以通过这个端口找到服务端
ServerSocket serversocker = new ServerSocket(port);
System.out.println("服务端启动...等待客户端连接...");
InetAddress ia;
Socket server;
OutputStream os;
while(true) {
//·开启监听,等待客户的连接
server = serversocker.accept();//·会变成阻塞状态,等待客户端连接,才会继续执行
//·通过socket对象获取客户端主机对象
ia = server.getInetAddress();
//·通过socket对象来获取输出流对象
//·通过输出流给客户端发信息
os = server.getOutputStream();
//·用桥接器将字节流转换成字符流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
//·发送数据给客户端
bw.write("hello "+ia.getHostAddress()+"\n");//·加上换行使客户端可以通过readline来读取
//·调用flush刷新缓冲区,并发送消息,这里不能用close关闭流。
bw.flush();
//·通过输入流 接收客户端发送过来的信息
InputStream is = server.getInputStream();
//·用桥接器将字节流转换成字符流
BufferedReader br = new BufferedReader(new InputStreamReader(is));
//·读取一行信息,必须以换行作为结尾的信息才能读到
String msg = br.readLine();
System.out.println("客户端发送给我的信息:"+msg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.qianfeng.pm.demo2;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* @author 吴一凡
* 客户端
*/
public class DemoClient {
public static void main(String[] args) {
//·和服务器进行连接,必须要知道服务器端的ip地址和端口号
String ip = "127.0.0.1";
int port = 8888;
Socket client;
try {
client = new Socket(ip,port);
System.out.println("与服务端连接成功");
//·通过输入流 接收服务端发送过来的信息
InputStream is = client.getInputStream();
//·用桥接器将字节流转换成字符流
BufferedReader br = new BufferedReader(new InputStreamReader(is));
//·读取一行信息,必须以换行作为结尾的信息才能读到
String msg = br.readLine();
System.out.println("服务端发送给我的信息:"+msg);
//·给服务器发送消息
OutputStream os = client.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
bw.write("你好我是一个客户端\n");
bw.flush();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
bw.write("你好我是一个客户端\n");
bw.flush();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}