文章目录
前言
提示:本文章问题:
什么是网络?
何为网络协议?
IP和端口是干嘛的?
TCP和UDP协议、URL能干嘛?
如何通过Java写聊天程序,如何下载网络资源
什么是ip和端口号以及它们有什么用(电脑是通过什么来识别另一台电脑及内部的应用程序),TCP和UDP的主要区别,主要的通信协议,如何通过TCP和UDP实现聊天通讯,文件上传(客户端上传文件到服务器端)。
一、网络和网络协议
1.简单例子来形容网络编程
定义:就好像自己给朋友写一封信一样,需要知道对方的邮编、地址、姓名等信息,最后还要填写自己信息(姓名和地址等)。
计算机网络
是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
2.网络编程目的:
- 无线电台…传播交流信息、数据交换、通信。
- 需要做的准备:
- ip、端口、定位到计算机上的某个资源。
3.OSI七大网络模型和四层概念模型
小结:
1.网络编程中有两个主要问题:
- 如何准确的定位到网络上的一台或者多台主机
- 找到主机之后如何进行通信
2.网络编程中的要素
- IP和端口号
- 网络通信协议 udp、tcp
二、IP和端口Port
1.IP(InelAddress)
- 唯一定位一台网络计算机
- 127.0.0.1:本机localhost
2.ip的值的分类
- IPV4:4个字节组成,0-255;
- IPV6:128位,8个无符号整数;
如图:
公网(互联网),私网(局域网) - ABCDE类地址;
A类:1.0.0.1~126.255.255.254(0000 0001 0000 0000 0000 0000 0000 0001
~0111 1111 1110 1111 1111 1111 1111 1110),注意127.x.x.x不能用。
B类:128.0.0.1~191.255.255.254(1000 0000 0000 0000 0000 0000 0000 0001
~1011 1111 1111 1111 1111 1111 1111
1110),注意169.254.x.x被微软买断,用作用户获取不到IP时自动分配的IP地址。
C类:192.0.0.1~223.255.255.254(1100 0000 0000 0000 0000 0000 0000 0001
~1101 1111 1111 1111 1111 1111 1111 1110)
D类:224.0.0.1~239.255.255.254(1110 0000 0000 0000 0000 0000 0000 0001
~1110 1111 1111 1111 1111 1111 1111 1110)
E类:240.0.0.1~255.255.255.254(1111 0000 0000 0000 0000 0000 0000 0001
~1111 1111 1111 1111 1111 1111 1111 1110)
私有地址
A类:10.0.0.0~10.255.255.255
B类:172.16.0.0~172.31.255.255
C类:192.168.0.0~192.168.255.255
子网掩码
定义:
子网掩码 (Subnet mask)是一个32位的2进制数 ,它必须结合IP地址一起使用。
子网掩码只有一个作用,就是将某个IP地址划分成“网络地址”
和“主机地址”
两部分。用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,还是在广域网上。
举例:
有时候我们会看到192.168.1.123/24这样的表示方法,其中/24就是子网掩码255.255.255.0的缩写
默认子网掩码:
网络类型 | 默认子类掩码 | 缩写 |
---|---|---|
A类 | 255.0.0.0 | /8 |
B类 | 255.255.0.0 | /16 |
C类 | 255.255.255.0 | /24 |
- 192.168.xx.xx专门给组织内部使用的。
2022/10/13-第100天(我与她)
代码测试:
import java.net.InetAddress;
import java.net.UnknownHostException;
public class NettoIp {
public static void main(String[] args) throws UnknownHostException {
//查询网站ip地址
InetAddress inetAddress = InetAddress.getByName("www.baidu.com");
//常用方法
System.out.println(inetAddress.getCanonicalHostName());//ip规范的名字
System.out.println(inetAddress.getHostAddress());//ip
System.out.println(inetAddress.getHostName());//域名
}
}
运行截图
2.端口Port
ip是确定唯一主机,端口号是用确定主机里面唯一的应用程序。
代码实例
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
public class NettoIp {
public static void main(String[] args) throws UnknownHostException {
//端口号常用的api函数
InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1",8080);
System.out.println(socketAddress);
System.out.println(socketAddress.getAddress());
System.out.println(socketAddress.getHostName());
System.out.println(socketAddress.getPort());
}
}
运行截图:
拓展:
三、通信协议
网络通信协议:速率、传输码率、代码结构、传输控制…
TCP(用户传输协议)
TCP/IP协议:实际上是一组协议;
ip:网络传输协议。
- 连接、稳定;
- 类似于打电话,是先准备好,建立连接通话;
- 三次握手、四次挥手;
- 客户端、服务器端;
- 传输完成,释放链接,效率低。
代码实例
(1)简单的TCP聊天(服务器-客户端)
//客户端
//1.要知道服务器的地址和端口号
InteAddress serverIP = InetAddress.getByName("127.0.0.1");
int port = 9999;
//2.创建一个socket链接
Socket socket = new Socket(serverIP,port);
//3.发送消息IO流
OutputStream os = socket.getOutputStream();
os.write("我是暴躁茹".getBytes());
finally
{
if(os!=null)
{
os.close();
}
if(socket!=null)
{
socket.close();
}
}
服务器端
//服务器端
//1.需要一个自己的地址:port端口号
ServerSocket serverSocket = new ServerSocket(9999);
//2.等待客户端链接过来,实现监听-》类似于c++ 中的Scaner
Socket socket = serverSocket.accept();
//3.读取客户端的消息
InputStream is = socket.getInputStream();
/*
//普通信息传输方式-》字节流
byte[] buffer = new byte[1024];
int len;
while((len = is.read(buffer))!=-1)
{
String msg = new String(buffer,0,len);
System.out.println(msg);
}
*/
//管道流
ByteArrayOutStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while((len = is.read(buffer))!=-1)
{
baos.write(buffer,0,len);
}
System.out.println(baos.toString());
finally
{
if(baos!=null)
{
baos.close();
}
if(is!=null)
{
is.close();
}
if(socket!=null)
{
socket.close();
}
if(serverSocket!=null)
{
serverSocket.close();
}
}
(2)TCP文件上传
//1.创建一个Socket链接
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9000);
//2.创建一个输出流
OutputStream os = socket.getOutputStream();
//3.读取文件
FileInputStream fis = new FileInputSrream(new File("baoru.jpg"));
//4.写出文件
byte[] buffer = new byte[1024];
int len;
while((len = fis.read(buffer))!=-1)
{
os.write(buffer,0,len);
}
//通知服务器,我已经结束
socket.shutdownOutput();//我已经传输完了
//确定服务器已经接受完毕,才能够断开链接
InputStream inputStream = socket.getInputStream();
//String byte[]
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bytr[] buffer2 = new byte[1024];
int len2;
while((len2 = inputStream.read(buffer2))!=-1)
{
baos.write(buffer2,0,len2);
}
System.out.println(baos.toString());
//5.关闭资源
baos.close();
inputStream.close();
fis.close();
os.close();
socket.close();
服务器
//服务器端
//1.创建服务
ServerSocket serverSocket = new ServerSocket(9000);
//监听客户端的链接
Socket socket = serverSocket.accept();//阻塞式监听,会一直等待客户端链接
//3.获取输入流
InputStream is = socket.getInputStream();
//4.文件输出
FileOutputStrem fos = new FileOutputStream(new File("receive.jpg"));
byte buffer = new byte[1024];
int len;
while((len = is.read(buffer))!=-1)
{
fos.write(buffer,0,len);
}
//通知客户端我接受完毕了
OutputStream os = socket.getOutputStream();
os.write("我接受完毕了,你可以断开了",getBytes());
//关闭资源
fos.close();
is.close();
socket.close();
serverSocket.close();
UDP(用户数据报协议)
- 不连接、不稳定;
- 类似于发信息,不管有没有准备好都会发给你;
- 客户端、服务器端,没有明确的界限
- 导弹原理、
四、通过url下载文件
该处使用的url网络请求的数据。
代码示例:
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class UrlDown {
public static void main(String[] args) throws IOException {
//1.下载url
URL url = new URL("https://webfs.ali.kugou.com/202205222150/eeb3c7ac322beadd5be3bf63977f816d/part/0/960115/KGTX/CLTX001/ac4f18157bc6f54e755132823d241bbd.mp3");
//2.链接到这个资源
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
InputStream inputStream = urlConnection.getInputStream();
FileOutputStream fileOutputStream = new FileOutputStream("4.mp3");//输出文件类型以及文件名
//转换为字节流的形式
byte[] buffer=new byte[1024];
int len;
while((len=inputStream.read(buffer))!=-1){
fileOutputStream.write(buffer,0,len);
}
//断开链接
fileOutputStream.close();
inputStream.close();
urlConnection.disconnect();
}
}
总结
在过三天,是一个值得纪念的日子。
愿我们能够一起相伴下去,一起努力下去。