1.网络
由点和线构成,表示诸多对象间的相互联系(概念而已,不重要)
2.计算机网络
为实现资源共享和信息传递,通过通信线路连接起来的若干主机
按照地理范围网络分为:
局域网、城域网、广域网(互联网、物联网和万维网)
3.网络模型
OSI(Open System Interconnection)开放式系统互联
七层:
第一层:物理层,它为设备之间的数据通信提供传输信号和物理介质(双绞线、光导纤维)
第二层:数据链路层,通过规程或协议(差错控制)来控制传输数据的正确性(MAC)
第三层: 网络层,它负责定义能够标识所有网络节点的逻辑地址(IP地址)
第四层:传输层,负责是否选择差错恢复协议、数据流重用,错误顺序重排(TCP、UDP)
第五层:会话层
第六层:表示层
第七层:应用层,负责文件访问和管理、可靠运输服务、远程操作服务(HTTP、FTP、SMTP)
TCP/IP协议
第一层:网络接口层(物理层+数据链路层),负责建立电路连接
第二层:网络层,负责分配地址和传送二进制数据,主要协议是IP协议
第三层:传输层,负责传送文本数据,主要协议是TCP、UDP协议
第四层:应用层(会话层+表示层+应用层),负责传送各种最终形态的数据,是直接与用户 打交道的层,典型的协议是HTTP、FTP协议等
4.通信协议
TCP协议:传输控制协议
它是一种面向连接的、可靠的、基于字节流的传输层通信协议。数据大小无限制。建立连接的过程需要三次过程,断开连接的过程需要四次挥手
建立连接的过程:
断开连接的过程:
UDP协议:用户数据包协议
它是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,每个包的大小为64KB
IP协议:互联网协议/国际协议
负责数据从一台机器发送到另一台机器;给互联网的每台设备分配一个唯一标识(IP地址)
5.IP与端口
IP分类:
A类:政府机构,1.0.0.1~255.255.255.254
B类:中型企业,128.0.0.1~191.255.255.254
C类:个人用户,192.0.0.1~223.255.255.254
D类:用于组播,224.0.0.1~239.255.255.254
E类:用于实验,240.0.0.1~255.255.255.254
回环地址:127.0.0.1,指本机,一般用于测试使用
测试IP命令(查看本机网卡是否损坏): ping ip地址
查看IP命令(查看本机的IP地址):ipconfig
端口号:在通信实体上进行网络通讯程序的唯一标识
端口分类:
1、公认端口:0~1023
2、注册端口:1024~49151
3、动态或私有端口:49152~65535
常用端口:
MySql:3306
Oracle:1521
Tomcat:8080
SMTP:25
Web服务器:80
FTP服务器:21
端口为什么重要呢?比如你和你的朋友微信或qq聊天,那么你和你朋友的电脑ip地址是不变的,那么怎么区分你朋友是微信给你发的消息还是qq发给你的消息呢?这就需要端口号
6.网络编程
InetAddress类:
概念:表示互联网协议(IP)地址对象,封装了与该IP地址相关的所有信息,并提供获取信息的常用方法。
方法:
1、public static InetAddress getLocalHost()返回本地主机的地址
2、public static InetAddress getByName(String host)根据主机名称获得地址对象
3、public static InetAddress[] getAllByName(String host) 获取所有相关地址对象
4、public String getHostAddress()获取IP地址字符串
5、public String getHostName()获得IP地址主机名
//1.创建本机IP地址对象
//1.1getLocalhost()
InetAddress ia=InetAddress.getLocalHost();
System.out.println("主机地址:"+ia.getHostAddress()+"主机名:"+ia.getHostName());
//1.2getByName("ip地址")
InetAddress ia2=InetAddress.getByName("192.168.137.1");
System.out.println("主机地址:"+ia2.getHostAddress()+" 主机名:"+ia2.getHostName());
//1.3getByName("127.0.0.1")
InetAddress ia3=InetAddress.getByName("127.0.0.1");
System.out.println("主机地址:"+ia3.getHostAddress()+" 主机名:"+ia3.getHostName());
//1.4getByName("localhost")
InetAddress ia4=InetAddress.getByName("localhost");
System.out.println("主机地址:"+ia4.getHostAddress()+" 主机名:"+ia4.getHostName());
//2.创建局域网IP地址对象
InetAddress ia5=InetAddress.getByName("192.168.137.110");
System.out.println(ia5.isReachable(2000));
System.out.println("主机地址:"+ia5.getHostAddress()+" 主机名:"+ia5.getHostName());
//3.创建外网IP地址对象
InetAddress ia6=InetAddress.getByName("www.baidu.com");
System.out.println(ia6.isReachable(2000));
System.out.println("主机地址:"+ia6.getHostAddress()+" 主机名:"+ia6.getHostName());
InetAddress[] ia7=InetAddress.getAllByName("www.baidu.com");
for (InetAddress inetAddress : ia7) {
System.out.println(inetAddress.getHostAddress());
}
/**打印结果为:
主机地址:192.168.137.1主机名:LAPTOP-THIJCNUT
主机地址:192.168.137.1 主机名:LAPTOP-THIJCNUT.mshome.net
主机地址:127.0.0.1 主机名:www.xmind.net
主机地址:127.0.0.1 主机名:localhost
false
主机地址:192.168.137.110 主机名:192.168.137.110
true
主机地址:39.156.66.18 主机名:www.baidu.com
39.156.66.18
39.156.66.14
*/
基于TCP的网络编程
1、服务器端:
1)创建ServerSocket,指定端口号
2)调用accept等待客户端接入
3)使用输入流,接收请求数据到服务器(等待)
4)使用输出流,发送响应数据给客户端
5)释放资源
/**
* 1、创建ServerSocket 并指定端口号
* 2、调用accept()方法,接收客户端请求
* 3、获取输入流,读取客户端发送的数据
* 4、获取输出流,发送数据到客户端
* 5、关闭释放资源
*/
//1、创建ServerSocket 并指定端口号
ServerSocket s=new ServerSocket(8087);
//2、调用accept()方法,接收客户端请求
Socket so=s.accept();
//3、获取输入流,读取客户端发送的数据
InputStream is=so.getInputStream();
BufferedReader bf=new BufferedReader(new InputStreamReader(is,"utf-8"));
String data = bf.readLine();
System.out.println("客户端发送的数据"+data);
// 4、获取输出流,发送数据到客户端[可选可不选]
//5、关闭释放资源
bf.close();
so.close();
s.close();
2、客户端
1)创建Socket,指定服务器IP+端口号
2)使用输出流,发送请求数据给服务器
3)使用输入流,接收响应数据到客户端(等待)
4)释放资源
/**
* 基于TCP客户端开发
*
* 1.创建Socket套接字,并指定服务器的地址和端口号
* 2.获取输出流,发送数据给服务器
* 3.获取输入流,读取服务器回复的数据
* 4.关闭资源
*/
// 1.创建Socket套接字,并指定服务器的地址和端口号
Socket socket=new Socket("192.168.8.115", 8087);
// * 2.获取输出流,发送数据给服务器
OutputStream os=socket.getOutputStream();
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os,"utf-8"));
bw.write("好久不见");
// * 3.获取输入流,读取服务器回复的数据
// * 4.关闭资源
bw.close();
socket.close();
小案例:上传文件到服务器(服务器将其保存在某个位置)
//1.创建ServerSocket,并指定端口号
ServerSocket serverSocket=new ServerSocket(7888);
//2.调用accept方法
Socket socket=serverSocket.accept();
//3.获取输入流,读取客户端发来的数据
InputStream is=socket.getInputStream();
FileOutputStream fos=new FileOutputStream("g:\\001.jpg");
byte[]b=new byte[1024];
int count=0;
while((count=is.read(b))!=-1) {
fos.write(b, 0, count);
}
//4.获取输出流,响应客户端数据
//5.关闭资源
fos.close();
socket.close();
serverSocket.close();
System.out.println("执行完毕");
//1创建Socket ,指定服务器的ip地址和端口号,与服务器建立连接
Socket socket=new Socket("192.168.8.115", 7888);
//2获取输出流
OutputStream os=socket.getOutputStream();
FileInputStream fis=new FileInputStream("g:\\科学家.jpg");
int count=0;
byte[] b=new byte[1024];
while((count=fis.read(b))!=-1) {
os.write(b, 0, count);
}
//3获取输入流,读取服务器的响应数据
//4关闭资源
os.close();
fis.close();
socket.close();
小案例:
基于TCP协议实现多个客户端向服务器发送数据
服务器端:
//1.创建ServerSocket,并指定端口号
ServerSocket serverSocket=new ServerSocket(9999);
System.out.println("服务器已启动。。。。");
//2.调用accept()方法,接收客户端发来的数据
while(true) {
Socket socket=serverSocket.accept();
System.out.println(socket.getInetAddress()+"进来了。。。。");
new SocketThread(socket).start();
}
线程类:
private Socket socket;
public SocketThread(Socket socket) {
this.socket=socket;
}
@Override
public void run() {
BufferedReader br=null;
try {
//3.获取输入流,读取客户端发送过来的数据
InputStream is=socket.getInputStream();
br=new BufferedReader(new InputStreamReader(is, "utf-8"));
while(true) {
String data= br.readLine();//所以。。。
if(data.equals("886")||data.equals("拜拜")) {
break;
}
System.out.println("客户端"+socket.getInetAddress()+"发送了数据为"+data);
}
//4.获取输出流,响应客户端,给客户端发送数据【可选】
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
System.out.println("客户端"+socket.getInetAddress()+"退出了");
try {
br.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户端:
//1.创建Socket,并指定服务器的ip地址和端口号
Socket socket=new Socket("192.168.8.115", 9999);
//2.获取输出流,向服务器端发送数据
OutputStream os=socket.getOutputStream();
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os,"utf-8"));
Scanner sc=new Scanner(System.in);
while(true) {
System.out.println("请输入数据:");
String str=sc.next();
if(str!=null) {
bw.write(str);
bw.newLine();//一定要有,否则线程类中的br.readLine()不返回数据
bw.flush();
}
if(str.equals("886")||(str.equals("拜拜"))) {
break;
}
}
//3.获取输入流,读取服务器响应的数据【可选】
//4.关闭资源
bw.close();
socket.close();