在开始之前,让我们高喊我们的口号:
键盘敲烂,年薪百万!
我听说关注我的人未来都会暴富哦!
目录
常见的软件架构 :简单来说BS就是浏览器+服务器。而CS就是软件+服务器。
什么是网络编程?
常见的软件架构 :简单来说BS就是浏览器+服务器。而CS就是软件+服务器。
BS和CS架构的优缺点
一般来说像精美的游戏等对画质要求高的用CS,而像商城等对画质要求不高的用BS。因为BS是我服务器现场传送图片和画面到你的显示屏上的。而CS则是一开始就把需要用的图片和画面下载到了本地,服务器只需要告诉你的电脑现在需要显示哪个图片,速度和画面都会很快。
网络编程3要素
一个例子:你要在地球上找到你喜欢的人?第一步要知道对方的位置,第二步加上WX(你用微信发消息,对方用微信收消息),第三步开始聊天(用双方都懂的语言)
IP
IPv6就可以让地球上每一粒沙子都 打上ip地址
小结:
IPv4小细节
这样比如一个网吧,它只需要一个公有的地址,然后再给每个电脑重新分配内部IP,这样以节省地址。
建议自己练习的话就用这个IP地址。这个不会发给你连接的公网IP,而是你发给自己的网卡,网卡发现是这个就自己发送回来了。
小结:
ping不仅可以测试在同一个网络下不同ip地址的设备是否和自己连接畅通,也可以ping网址,因为网址底层就是ip地址。
InetAddress类的使用
import java.net.InetAddress;
import java.net.UnknownHostException;
public class MyInetAddressDemo1 {
public static void main(String[] args) throws UnknownHostException {
/*
static InetAddress getByName(String host) 确定主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址
String getHostName() 获取此IP地址的主机名
String getHostAddress() 返回文本显示中的IP地址字符串
*/
//1.获取InetAddress的对象
//IP的对象 一台电脑的对象
InetAddress address = InetAddress.getByName("DESKTOP-5OJJSAM");
System.out.println(address);
String name = address.getHostName();
System.out.println(name);//DESKTOP-5OJJSAM
String ip = address.getHostAddress();
System.out.println(ip);//192.168.1.100
}
}
端口号
其实可以当电脑上有很多个孔,每个孔都有编号,你的电脑通过65535发送消息出去,你的女生也必须要用同样的65535 的端口号进行接收才能看见你的消息。
协议
协议简单来说就是数据传输的规则。
这里主要理解UDP和TCP协议,
UDP协议不检查网络是否通畅,直接发送内容,至于能不能接收到就无所谓,常用于对数据要求不高的功能,比如视频电话等
TCP协议要检查网络是否通畅,常用语不能丢失非常重要的传输,比如安装包、发送邮件等
UDP协议(发送数据)
import java.io.IOException;
import java.net.*;
public class SendMessageDemo {
public static void main(String[] args) throws IOException {
//发送数据
//1.创建DatagramSocket对象(快递公司)
//细节:
//绑定端口,以后我们就是通过这个端口往外发送
//空参:所有可用的端口中随机一个进行使用
//有参:指定端口号进行绑定
DatagramSocket ds = new DatagramSocket();
//2.打包数据
String str = "你好威啊!!!";
byte[] bytes = str.getBytes();
InetAddress address = InetAddress.getByName("127.0.0.1");
int port = 10086;
DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
//3.发送数据
ds.send(dp);
//4.释放资源
ds.close();
}
}
UDP协议(接收数据)
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class ReceiveMessageDemo {
public static void main(String[] args) throws IOException {
//接收数据
//1.创建DatagramSocket对象(快递公司)
//细节:
//在接收的时候,一定要绑定端口
//而且绑定的端口一定要跟发送的端口保持一致
DatagramSocket ds = new DatagramSocket(10086);
//2.接收数据包
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
//该方法是阻塞的
//程序执行到这一步的时候,会在这里死等
//等发送端发送消息
System.out.println(11111);
ds.receive(dp);
System.out.println(2222);
//3.解析数据包
byte[] data = dp.getData();
int len = dp.getLength();
InetAddress address = dp.getAddress();
int port = dp.getPort();
System.out.println("接收到数据" + new String(data,0,len));
System.out.println("该数据是从" + address + "这台电脑中的" + port + "这个端口发出的");
//4.释放资源
ds.close();
}
}
这里的发送和接收的代码可以配合使用。先运行接受数据的代码,然后你会发现只打印了1111,这是因为在等发送的数据过来,然后在运行发送数据的代码,这样再回过头来看接收数据的控制台,就会发现继续执行下去了,打印了你好威啊!!!
聊天室小练习
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class SendMessageDemo {
public static void main(String[] args) throws IOException {
/*
按照下面的要求实现程序
UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束
UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收
*/
//1.创建对象DatagramSocket的对象
DatagramSocket ds = new DatagramSocket();
//2.打包数据
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请输入您要说的话:");
String str = sc.nextLine();
if("886".equals(str)){
break;
}
byte[] bytes = str.getBytes();
InetAddress address = InetAddress.getByName("255.255.255.255");
int port = 10086;
DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
//3.发送数据
ds.send(dp);
}
//4.释放资源
ds.close();
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class ReceiveMessageDemo {
public static void main(String[] args) throws IOException {
/*
按照下面的要求实现程序
UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束
UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收
*/
//1.创建对象DatagramSocket的对象
DatagramSocket ds = new DatagramSocket(10086);
//2.接收数据包
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
while (true) {
ds.receive(dp);
//3.解析数据包
byte[] data = dp.getData();
int len = dp.getLength();
String ip = dp.getAddress().getHostAddress();
String name = dp.getAddress().getHostName();
//4.打印数据
System.out.println("ip为:" + ip + ",主机名为:" + name + "的人,发送了数据:" + new String(data,0,len));
}
}
}
可以这样设置,发送端就可以运行多个了。也就是多个发送端,发送到一个接收端显示,这样就像一群人在聊天了
最终效果
今天的分享就到这里,欢迎在评论区交流
一起学习,一起进步!
如果你能关注我
那就是对我创作的最大鼓励啦!