什么是网络编程?
在网络通信协议下,不同计算机上运行的程序,进行的数据传输。
应用场景:即时通信、网游、金融证券、国际贸易,邮件等等。
不管是什么场景,都是计算机跟计算机之间通过网络进行数据传输。
常见的软件架构有两种,分别为CS(ClientServer)和BS(BrowserServer)
CS:在用户本地需要下载并安装客户端程序,在远程有一个服务器端程序
BS:只需要一个浏览器,用户通过不同的网址,客户访问不同的服务器
在CS当中,是通过客户端访问服务器,BS则是通过浏览器访问服务器。
BS架构优缺点:
1.不需要开发客户端,只需要页面+服务器。
2.用户不需要下载,打开浏览器就能使用。
3.如果应该过大,用户体验会受到影响。
CS架构优缺点:
1.画面可以做的非常精美,用户体验好
2.需要开发客户端,也需要开发服务端
3.用户需要下载和更新的时候太麻烦
网络编程三要素
1.IP:设备在网络中的地址,是唯一的标识。
2.端口号:应用程序在设备中唯一的标识。
3.协议:数据在网络当中传输的规则,常见的有:UDP、TCP、http、https、ftp.
IP:
全称:Internet Protocol ,是互联网协议地址,也称IP地址。
是分配给上网设备的数字标签。是网络中的地址,是唯一的。
常见的IP分类为IPv4,IPv6
IPv4:
全称:Internet Protocol version 4,互联网通信协议第四版。
采用32位地址长度,分成4组,点分十进制表示法
每组范围0~255,例如IP:192.168.1.66
因为范围0~255的限定,IPv4目前已经不能满足所有人的使用。
IPv6:
全称:Internet Protocol version 6,互联网通信协议第6版
次用128位地址长度,分成8组。冒分十六进制表示法
2001:0DB8:0000:0023:0008:0800:200C:417A
省略前面的0
2001:DB8:0:23:8:800:200C:417A
特殊情况:如果计算出的16进制标识形式中有多个连续的0
FF01:0:0:0:0:0:0:1101
0位压缩法:
FF01::1101
IPv4地址分类形式
1.公网地址(万维网使用)和私有地址(局域网使用)
2.192.168.开头的是私有地址,范围即为192.168.0.0–192.168.255.255,专门为组织机构内部使用,以此节省IP。
例如,以网吧为例,网吧中的电脑都是使用公网IP,然后由路由器给每台电脑分配局域网IP。
特殊IP地址:
127.0.0.1。也可以是localhost:是回送地址也称本地回环地址,也称本地IP,永远只会寻找当前所在本机。
常见的CMD命令
1.ipconfig:查看本机IP地址
2.ping:检查网络是否连通(后面可以跟随网址或者IP)
InetAddress类的使用
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Test {
public static void main(String[] args) throws UnknownHostException {
//static InetAdress getByName(String host) 确定主机名称的IP地址,主机名称可以是机器名称,也可以是IP地址
//String getHostName() 获取IP地址的主机名
//String getHostAddress() 返回文本显示中的IP地址字符串
//获取InetAddress对象
InetAddress address=InetAddress.getByName("192.168.1.100");
System.out.println(address);
String name=address.getHostName();
System.out.println(name);
String ip=address.getHostAddress();
System.out.println(ip);
}
}
输出结果
/192.168.1.100
192.168.1.100
192.168.1.100
端口号
应用程序在设备中的唯一标识。
端口号:由两个字节表示的整数,取值范围:0~65535
其中0~1023之间的端口号用于一些知名的网络服务或应用
我们自己使用1024以上的端口号就可以了
注意:一个端口号只能被一个应用程序使用
例如,微信通过一定的端口号向其他微信发送信息
协议
计算机网络中,连接和通信的规则被称为网络通信协议
OSI参考模型:世界互联协议标准,全球通信规范,单模型过于理想化,未能在因特网上得到广泛推广
TCP/IP参考模型(或TCP/IP协议):事实上的国际标准
UDP协议:
1.用户数据报协议(User Datagram Protocol)
2.UDP使面向无连接通信协议。
速度快,有大小限制以此最多发送64K,数据不安全,易丢失数据
TCP协议:
1.传输控制协议TCP(Transmission Control Protocol)
2.TCP协议是面向连接的通信协议
速度慢,没有大小限制,数据安全
UDP通信程序 (发送数据)
UDP发送数据可以理解为分为4步
例如,我们生活中寄快递时候有以下四步
1.找快递公司
2.打包物品
3.快递公司发送包裹
4.付钱走人
上面这四步对应UDP中4步
1.创建发送端的DatagramSocket对象
2.数据打包(DatagramPacket)
3.发送数据
4.释放资源
import java.io.IOException;
import java.net.*;
public class Test {
public static void main(String[] args) throws IOException {
//创建DatagramSocket对象(快递公司)
//细节:
//绑定端口:通过这个端口往外发送
//空参:所有可用端口中随机一个使用
//有参:指定端口进行绑定
DatagramSocket ds=new DatagramSocket();
//打包数据
String s="你好";
byte[] b=s.getBytes();
InetAddress address=InetAddress.getByName("127.0.0.1");
int port=10086;
DatagramPacket dp=new DatagramPacket(b,b.length,address,port);
//发送资源
ds.send(dp);
//释放资源
ds.close();
}
}
运行程序后会发现控制台什么都没有输出,正是因为UDP的无连接性,数据是否发送成功与他无关。
UDP通信程序 (接收数据)
同样,还是以快递为例,收快递需要以下4步
1.找快递公司 -------------- 创建接收端的DatagramSocket对象
2.接收箱子------------------- 接收打包的数据
3.从箱子里面拿到东西 ------------------- 解析数据包
4.签收走人 ------------------------ 释放资源
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
class Demo {
public static void main(String[] args) throws IOException {
// 创建DatagramSocket对象(快递公司)
// 细节:
//在接收的数据时候,一定要绑定端口而且绑定的端口,要与发送的端口一样
DatagramSocket ds = new DatagramSocket(10086);
//接收数据
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
ds.receive(dp);
//解析数据包
byte[] b = dp.getData();
int len = dp.getLength();
System.out.println("接收到数据" + new String(b, 0, len));
System.out.println("该数据是从" + dp.getAddress() + "这台电脑发出的");
System.out.println("端口号:"+dp.getPort());
//释放资源
ds.close();
}
}
先运行接收端,然后在运行发送端,在接收端会打印以下内容:
接收到数据你好
该数据是从/127.0.0.1这台电脑发出的
端口号:57255
UDP的三种通信方式
1.单播
一台电脑给一台发送信息,发送端给一个接收端
2.组播
一台电脑给多个发送信息,发送端为一个,接收端为一组
组播地址:224.0.0.0~239.255.255.255
其中224.0.0.0~224.0.0.255为预留的组播地址
3.广播
一台电脑给局域网所有发送信息,发送端给局域网中所有发送数据。
广播地址:255.255.255.255
TCP通信程序
TCP通信协议时一种可靠的网络协议,它在通信的两端各建立一个Socket对象,通信之前要保证连接已经建立,通过Socket产生IO流来进行网络通信。
客户端:
1.创建客户端的Socket对象与指定服务端连接
Socket(String host,int port)
2.获取输出流,写数据
OutputStream getOutputStream()
3.释放资源
void close()
服务器:
1.创建服务器端的Socket对象(ServerSocket)
ServerSocket(int port)
2.监听客户端连接,返回一个Socket对象
Socket accept()
3获取输入流,读数据
InputStream getInputStream()
4.释放资源
void close()
服务端代码:
import java.io.DataInputStream;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Demo {
public static void main(String[] args) throws IOException {
//创建对象ServerScoket
ServerSocket ss=new ServerSocket(10000);
//监听客户端连接
Socket socket= ss.accept();
//从连接通道中获取输入流数据
InputStream in=socket.getInputStream();
DataInputStream da=new DataInputStream(in);
while (true){
try {
System.out.println(da.readUTF());
}catch (EOFException e){
da.close();
in.close();
socket.close();
ss.close();
break;
}
}
}
}
客户端:
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class Test {
public static void main(String[] args) throws IOException {
//创建Socket对象
//如果连接不上,代码会报错
Socket socket=new Socket("127.0.0.1",10000);
//可以从连接通道中获取输出流
OutputStream os=socket.getOutputStream();
DataOutputStream da=new DataOutputStream(os);
da.writeUTF("你好");
da.writeUTF("我很好");
da.close();
os.close();
socket.close();
}
}
启动服务端后,服务端会一直在accept()方法处死等,只有客户端建立连接后,才会进行之后的代码。