一、基础知识
1.什么是计算机网络?
1.定义:
计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备
,通过通信线路连接起来,在网络操作系统,网络管理软件以及通信协议的管理和
协调下,(实现资源共享和信息传递的计算机系统).
2.网络编程的目的?
1.传递信息
2.数据交换
3.通信
3.如何准确的定位网络上的一台主机?
ping 域名
1.如何准确的定位网络上的一台主机
(1).本地Ipv4 (cmd > ipconfig)
(2).端口号
(3).计算机上的某个资源
2.定位了网络上的一台主机,如何传输数据?
(1).javaweb 网页编程 (架构 B/S >浏览器)
(2).TCP/IP 网络编程 (架构 C/S >客户端(QQ软件))
4.网络通信的要素
1.如何使新网络的通信
(1).通信双方的地址: ip 与 端口号
(2).网络通信的协议: http,ftp,tcp,udp...
TCP/IP参考模型
5.OSI七层参考模型
重点学习的是 IP .UDP .TCP
应用层: 比如QQ等,应用
传输层: 比如:通信
网络层: 比如 :封包
数据链路层: 比如:具体传输
二、IP详解
1.IP详解
(1).IP的用处:
唯一定位一台网络上的计算机
(2).本机IP(localgost)
127.0.0.1
(3).IP的分类
1.通过ip的地址进行分类
(1).ipv4地址:
ipv4 127.0.0.1,四个字节组成,每个字节的长度为0~255,一共42亿个,(2011)
(2).ipv6地址:
ipv6 ,128位,8个无符号整数组成
2.通过ip的公网和私网进行分类
(1).公网---互联网
(2).私网---局域网
eg: 192.168.xx.xx 专门给组织内部使用的
(3).ABCD类地址
ABCD类的地址分类: (折半操作)
(4).域名:
1.主要目的:是为了记忆域名
2.Java 获取IP地址
基本思路:
1.InetAddress 没有构造器不能new 只能进行调用
InetAddress.getByName("www.baidu.com"); //获取域名和地址
2.获取域名(网站)的ip地址
(1).InetAddress.getByName(域名);
3.获取本机的ip地址
(1).InetAddress.getByName("127.0.0.1");
(2).InetAdress.getLocalHost();
package com.Kuangstudy.Net;
import javax.swing.*;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Test {
public static void main(String[] args) {
//因为inetAddress是没有构造器的,所以new不了
try {
//获得百度的IP地址。
InetAddress byName_address1 = InetAddress.getByName("www.baidu.com");
System.out.println("百度 "+byName_address1);
//
System.out.println(byName_address1.getAddress());
//获得规范的名字 也就是ip
System.out.println(byName_address1.getCanonicalHostName());
//获得主机的名字 还是ip
System.out.println(byName_address1.getHostAddress());
//获得域名
System.out.println(byName_address1.getHostName());
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
三、端口详解
1.端口
端口表示一个程序的进程;
IP 是家属楼,端口是一户
1.不同的进程有不同的端口号,用来区分软件.
2.端口被规定为0~65535个
3.TCP,UDP:
每一个都有65535,也就是说一共有 65535*2个,单个协议下,端口号不能冲突。TCP与UDP是两个协议
4.端口分类:
(1).公有端口:0~1023;
HTTP :80 HTTPS :443 FTP(远程链接):21 Telent(远程监听) 23
(2).程序注册端口:1024~49151,分配用户或则程序
Tomcat : 8080 MySQL 3306 Oracle 1521
(3).动态、私有: 49152-65535
查看所有端口
| 端口流
netstat -ano //查看所有的端口
netstat -ano|findstr "6942" //查看指定的端口
tasklist|findstr "2460" //查看2460的端口的进程
基本思路:
1.InetSocketAddress
2.获取地址
inetSocketAddress_one.getAddress()
3.获取主机名
inetSocketAddress_one.getHostName()
4.获取端口号
inetSocketAddress_one.getPort()
import java.net.InetSocketAddress;
public class Test_InetSocket {
public static void main(String[] args) {
InetSocketAddress inetSocketAddress_one = new InetSocketAddress("127.0.0.1", 8080);
System.out.println(inetSocketAddress_one);
InetSocketAddress inetSocketAddress_two = new InetSocketAddress("localhost", 8080);
System.out.println(inetSocketAddress_two);
//获得主机的地址
System.out.println(inetSocketAddress_one.getAddress());
//获得主机的名字(域名)
System.out.println(inetSocketAddress_one.getHostName());
//获得主机的端口号
System.out.println(inetSocketAddress_one.getPort());
}
}
四、通信协议
1.定义
网络通信协议:速率,传输码率,代码结构,传输控制.....
2.TCP/IP协议(一个集合)
TCP/IP包括:
重要协议:
1.TCP:用户传输协议
2.UDP:用户数据报协议
....
出名的协议:
1.TCP: 用户传输协议
2.IP:网络互联协议
3.TCP与UDP的对比
TCP : (eg:打电话 对方可拒绝与不可拒绝)
(1).链接稳定
(2).三次握手,四次挥手
请求连接 同意链接 链接
(3).客户端、服务端
(4).传输完成,释放链接,效率低
UDP : (eg:发短信 对方不能拒绝)
(1).不连接.不稳定
(2).客户端、服务端 (没有明确的界限)
(3).不管有没有准备好,都可以发给你.
三次握手:
1.判断两个事务是否连接上:(至少需要三次回应)
A.你瞅啥?
B:瞅你咋地?
A:打一架?
(…)链接成功
四次分手
1.判断两个事务是否断开连接:(需要四次操作)
A:我要走了
B:你真的要走了吗?
B:你真的真的要走了吗?
A我真的走了
(…)断开成功
(五)、TCP
1.TCP实现聊天的项目
Socket: 实现两台主机链接点的中间工具。(链接到指定IP,的端口号)
客户端通过申请链接服务端的端口,从而达到发送消息的模式.
serveSocket: 服务端创建套接字端口与客户端链接(与指定端口)
服务端窗口:
4.获取客户端的端口 通过服务端 套接字
ServerSocket serverSocket = new ServerSocket(9999);
5.等待客户端链接
Socket socket=serverSocket.accept();
6.读取客户端发送的信息
InputStream is=socket.getInputStream();
7.打印输出
(1).管道流的方法
(2).教学用法
package com.Kuangstudy.Net;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
//服务端
public class TcpClientDem0 {
public static void main(String[] args) throws Exception{
//1.我得有一份地址
ServerSocket serverSocket = new ServerSocket(9999);
//4.等待客户端链接过来
Socket socket=serverSocket.accept();
//5.读取客户端的信息
InputStream is=socket.getInputStream();
/*
//6.设置读取得缓冲区
byte []buf=new byte[1024];
//7.设置判断得操作
int count=0;
//8.开始进行读取
while ((count=is.read(buf))!=-1){
System.out.println(new String(buf,0,count));
}*/
//管道流实现读取文件信息
ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
//6.设置缓冲区
byte []buf=new byte[1024];
int count=0;
while ((count=is.read(buf))!=-1){
byteArrayOutputStream.write(buf,0,count);
}
System.out.println(byteArrayOutputStream.toString());
//先开得后关闭
byteArrayOutputStream.close();
is.close();
}
}
客户端窗口:
1.初始化一个IP和端口号
2.创建一个套接字的链接,把IP和端口连接起来
Socket socket = new Socket(inetAddress,port);
3.利用IO流的输出流进行发送信息
OutputStream os=socket.getOutputStream();
package com.Kuangstudy.Net;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
//客户端
public class TcpClientDem1 {
public static void main(String[] args) throws Exception {
//1.要知道服务器的地址,和端口号
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
int port=9999;
//2.创建一个Socket链接
Socket socket = new Socket(inetAddress,port);
//3.发送消息 IO流
OutputStream os=socket.getOutputStream();
os.write("你好呀,我是李明".getBytes());
os.close();
}
}
管道流的示意图
2.TCP上传文件的实现
客户端:
1.先读取(获得)文件 "123.jpg"(输入流)
2.再写入(输出)服务端文件"123.jpg";(文件输出流)
package com.Kuangstudy.Net;
import java.io.*;
import java.net.Socket;
//客户端
public class TCPDemo1 {
public static void main(String[] args) throws Exception{
//1.创建一个Socket链接
Socket socket=new Socket("127.0.0.1",9000);
//2.输出信息
OutputStream outputStream=socket.getOutputStream();
//3.文件输入流
FileInputStream fileInputStream=new FileInputStream(new File("src/123.jpg"));//这样写的化是读取本idea下的文件
//4.读取文件
byte []buf=new byte[1024];
int count=0;
while ((count=fileInputStream.read(buf))!=-1){
outputStream.write(buf,0,count);
}
//通知服务端我接收完毕
socket.shutdownOutput();
//客户端来接受信息
InputStream inputStream_one = socket.getInputStream();
int count_one=0;
byte []buf_one=new byte[1024];
while ((count_one=inputStream_one.read(buf_one))!=-1){
System.out.println(new String(buf,0,count_one));
}
outputStream.close();
fileInputStream.close();
}
}
服务端:
1.等待服务端连接创建
2.读取(获得)客户端文件(输出流)
3.写入文件ideal中(文件写入)
package com.Kuangstudy.Net;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
//服务端
public class TCPDemo2 {
public static void main(String[] args) throws Exception{
//1.创建服务
ServerSocket serverSocket=new ServerSocket(9000);
//2.监听客户端链接
Socket socket=serverSocket.accept();//阻塞或则监听,一直等待客户端链接 和Scanner一样
//3.获取输入流
InputStream inputStream=socket.getInputStream();
//4.文件输出
FileOutputStream fileOutputStream=new FileOutputStream(new File("receive.jpg"));
byte[]buf=new byte[1024];
int count=0;
while ((count=inputStream.read(buf))!=-1){
fileOutputStream.write(buf,0,count);
}
//通知客户端我传送完毕了
OutputStream outputStream_one = socket.getOutputStream();
outputStream_one.write("我已经传送完毕,服务端已关闭".getBytes(StandardCharsets.UTF_8));
serverSocket.close();
inputStream.close();
fileOutputStream.close();
}
}
(六)、Tomcat
服务端:
(1).自定义:(Serve) s
(2).Tomcat服务器(Serve) s
客户端:
(1).自定义:(Customer) c
(2).浏览器:(Broeser) b
Tomcat 就是指一个服务器,我们可以自定义对服务器进行打开和关闭。
(七)、UDP
就好比如:发短信、发送导弹。(需要知道对方的地址)
1.DatagreamPacket (数据报包)
1.UDP实现消息发送
基本思路:
1.DatagramSocket 数据报套接字主要功能是:
(1). 开放端口
(2). 接受报包
(3). 发送报包
2.DataframPack 数据报包的主要功能是:
(1).缓存区 存储数据
接受
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDP_dialog_two {
public static void main(String[] args) throws Exception {
//1.创建数据报套接字
DatagramSocket datagramSocket=new DatagramSocket(9090);
//2.数据包报
//2.1 设置缓冲区
byte []buf=new byte[1024];
//2.2
DatagramPacket datagramPacket=new DatagramPacket(buf,0,buf.length);
//3.数据报套接字
datagramSocket.receive(datagramPacket);
System.out.println(datagramSocket.getLocalPort()+" "+datagramSocket.getInetAddress());
System.out.println(new String(datagramPacket.getData(),0,datagramPacket.getLength()));
//4.关闭
datagramSocket.close();
}
}
发送
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDP_dialog_one {
public static void main(String[] args) throws Exception {
//1.通过数据报开放端口
DatagramSocket datagramSocket=new DatagramSocket();
//2.进行数据报包套接字
//2.1 信息写入
String string="你好,我是您UDP的第一个小用户!";
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
int port=9090;
//2.2 把信息补充 发送给谁
DatagramPacket datagramPacket=new DatagramPacket(string.getBytes(),0,string.getBytes().length,inetAddress,port);
//3.数据报传送消息
datagramSocket.send(datagramPacket);
//4.关闭数据报
datagramSocket.close();
}
}
2.UDP实现聊天的操作
2.1(未使用多线程单方面输入与单方面输出)
在这里插入代码片
发送者
package com.Kuangstudy.Net;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
//发送者1
public class UDPSenderDmeo1 {
public static void main(String[] args) throws Exception {
DatagramSocket datagramSocket=new DatagramSocket(8888);
//缓冲数据: 控制台读取System.in
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in));
while (true){
//读取一行
String string_one=bufferedReader.readLine();
byte []buf=string_one.getBytes();
//打包
DatagramPacket packet=new DatagramPacket(buf,0,buf.length,new InetSocketAddress("localhost",6666)); //发送给谁?
//发送包
datagramSocket.send(packet);
if(buf.equals("bye")){
break;
}
}
datagramSocket.close();
}
}
接收者
package com.Kuangstudy.Net;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
//接收者1
public class UDPSenderDmeo2 {
public static void main(String[] args) throws Exception {
//1.接受的端口
DatagramSocket datagramSocket=new DatagramSocket(6666);
while (true) {
//准备接受包裹
byte[] buf = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(buf, 0, buf.length );
datagramSocket.receive(datagramPacket); //阻塞接受
//断开连接
byte []buf_two=datagramPacket.getData();
//接受的数据
String string_one=new String(buf_two,0,buf_two.length);
//打印输出
System.out.println(string_one.trim());
if (string_one.trim().equals("bye".trim())){
break;
}
}
datagramSocket.close();
}
}
2.2(多线程实现双面的输出)
发送者是:学生/接收者是老师
package com.Kuangstudy.Net;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
//发送者1
public class UDPSenderDmeo1 implements Runnable {
DatagramSocket datagramSocket=null;
BufferedReader bufferedReader=null;
private int fromPort;
private String toIP;
private int toPort;
public UDPSenderDmeo1(){
}
public UDPSenderDmeo1( int fromPort, String toIP, int toPort) throws Exception {
this.fromPort = fromPort;
this.toIP = toIP;
this.toPort = toPort;
datagramSocket=new DatagramSocket(fromPort);
bufferedReader=new BufferedReader(new InputStreamReader(System.in));
}
@Override
public void run() {
while (true) {
try {
//读取一行
String string_one = bufferedReader.readLine();
byte[] buf = string_one.getBytes();
//打包
DatagramPacket packet = new DatagramPacket(buf, 0, buf.length, new InetSocketAddress(this.toIP, this.toPort)); //发送给谁?
//发送包
datagramSocket.send(packet);
if (buf.equals("bye")) {
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
datagramSocket.close();
}
}
发送者是:老师 接收者是:学生
package com.Kuangstudy.Net;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
//接收者1
public class UDPSenderDmeo2 implements Runnable {
private String msgFrom;
DatagramSocket datagramSocket=null;
private int port;
public UDPSenderDmeo2() {
}
public UDPSenderDmeo2(int port,String msgFrom) {
this.msgFrom=msgFrom;
this.port = port;
try {
datagramSocket=new DatagramSocket(port);
} catch (Exception e){
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
try {
//准备接受包裹
byte[] buf = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(buf, 0, buf.length );
datagramSocket.receive(datagramPacket); //阻塞接受
//断开连接
byte []buf_two=datagramPacket.getData(); //获得数据
//接受的数据
String string_one=new String(buf_two,0,buf_two.length);
//打印输出
System.out.println(msgFrom+":"+string_one.trim());
if (string_one.trim().equals("bye".trim())){
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
datagramSocket.close();
}
}
实现发送者是:学生的接口 ,接收者是:老师
import com.Kuangstudy.Net.UDPSenderDmeo1;
import com.Kuangstudy.Net.UDPSenderDmeo2;
public class TalkStudent {
public static void main(String[] args) throws Exception {
//开启两个线程
new Thread(new UDPSenderDmeo1(7777,"localhost",9999)).start();
new Thread(new UDPSenderDmeo2(8888,"老师")).start();
}
}
实现发送者是:老师的接口 ,接收者是:学生
import com.Kuangstudy.Net.UDPSenderDmeo1;
import com.Kuangstudy.Net.UDPSenderDmeo2;
public class TalkTeacher_02 {
public static void main(String[] args) throws Exception{
new Thread(new UDPSenderDmeo1(5555,"localhost",8888)).start();
new Thread(new UDPSenderDmeo2(9999,"学生")).start();
}
}
(八)、URL
1.定义:
统一资源定位符:定位资源的,定位互联网上的某一项。
2.协议: //IP:端口/项目名/资源
3.
(1). DNS 域名解析 www.baidu.com 实质上是:IP
1.爬取资源包
import com.Kuangstudy.Net.UDPSenderDmeo1;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
public class Demo2 {
public static void main(String[] args) throws Exception{
//下载文件
URL url = new URL("");
//2.链接此资源
HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
//3.
InputStream inputStream = urlConnection.getInputStream();
FileOutputStream fileOutputStream=new FileOutputStream("Security.jpg");
byte []buf=new byte[1024];
int count=0;
while ((count=inputStream.read(buf))!=-1){
fileOutputStream.write(buf,0,count);
}
inputStream.close();
fileOutputStream.close();
urlConnection.disconnect();
}
}
2.URL知识点
import java.net.URL;
public class Demo1 {
public static void main(String[] args)throws Exception {
URL url = new URL("http://localhost:8080/helloworld/index.jsp?username=liming&password=123");
System.out.println(url.getProtocol()); //得到协议名
System.out.println(url.getHost()); //得到主机名
System.out.println(url.getPort()); //得到端口号
System.out.println(url.getPath()); //获得文件
System.out.println(url.getFile()); //全路径
System.out.println(url.getQuery()); //全参数
}
}
"http://dl.stream.qqmusic.qq.com/C400000LQTRH4d6iQO.m4a?guid=3228671748&vkey=32B4FCD4F80B08521BEA1EB37A2AF2B1C6433807F310F20C8F78D52F4976FCC1114EC84B5EEDAE4827FA3928DEB1880E807485D82E7C1760&uin=&fromtag=120032"