网络编程:
数据在网络中不断进行传输
网络三要素:
ip地址–端口–协议
找到高圆圆
1)网络中需要知道ip地址
2)找到她的ip,对她说话---> 对着"耳朵"-----> 端口port
3)对她说话 "i love you"---> 她听不懂,
说"我爱你"---->需要有一个规则 ----"协议"
ip 使用点分十进制法,中间使用.隔开
A类 国家大部门---->前一个号段是网络号段,后面三个主机号段
B类 校园/大公司服务器机房/:前面两个网络号段,后面使用两个注解号段
C类 私人地址:前面三个为网络号段,后面是主机号段
192.168.251.1--->
port端口
port端口 360软件都可以查看你电脑所有客户端软件的端口号
范围:0~65535 里面0~1024属于保留端口
传输协议
UDP协议--->数据报包(数据包的报文)
1)不需要建立连接通道
2)不可靠协议,不安全的
3)发送数据大小有限制
TCP协议--->最基本的字节流的方式发送数据
1)就必须连接通道
2)可靠协议,一种安全
3)发送数据大小无限制
需要访问百度服务器
http://www.baid.com:80
--->http:// 协议--->底层基于tcp(建立通道)
www.baidu.com---->ip地址
端口:默认80可以不写(省略)
查看ip地址 ipconfig windows系统
在Linux系统---->centos-->ifconfig
获取计算机的主机名称或者获取计算机的ip地址字符串形式?
public static InetAddress getByName(String host)
throws UnknownHostException
通过计算机主机名称或者是字符串形式的ip地址--->获取互联网ip地址对象
*
*/
public class InetAddressDemo {
public static void main(String[] args) throws UnknownHostException {
```
//public static InetAddress getByName(String host)throws UnknownHostException
//1)可以通过计算机机器名称获取ip地址对象
InetAddress inetAddress = InetAddress.getByName("DESKTOP-Q62EUJH"); //还可以指定ip地址字符串
System.out.println(inetAddress);//DESKTOP-Q62EUJH/192.168.1.5
//互联网ip地址对象: 主机名称/ip地址字符串
//public String getHostName() :通过ip地址对象获取计算机机器名
String hostName = inetAddress.getHostName() ;
System.out.println(hostName);
//获取里面的包含ip地址字符串形式
```
// public String getHostAddress()
String ip = inetAddress.getHostAddress();
System.out.println(ip);
}
}
UDP接收端的代码实现
1)创建接收端的Socket对象,绑定端口
2)创建一个接收容器—>数据包—>自定义字节缓冲区,将发送的数据包
3)接收
4)从接收容器中解析数据包的实际内容数据
5)展示数据
先运行接收端,而且接收端不能运行多次,否则端口被占用!
*/
public class UDPReceiver {
public static void main(String[] args) throws IOException {
//1)创建接收端的Socket对象,绑定端口
//public DatagramSocket(int port) throws SocketException
DatagramSocket ds = new DatagramSocket(10086) ;
```
//2)创建一个接收容器--->数据包--->自定义字节缓冲区,将发送的数据包
```
// public DatagramPacket(byte[] buf, int length)构造一个DatagramPacket用于接收长度的数据包length 。
byte[] bytes = new byte[1024] ;//1024或者1024整数倍
int length = bytes.length ;
DatagramPacket dp = new DatagramPacket(bytes,length) ; //将发送端数据缓冲到这个接收容器中
```
//3)接收,以上面这个接收容器来接收
//public void receive(DatagramPacket p)throws IOException
ds.receive(dp);
//4)从接收容器中解析数据包的实际内容数据
//从接收容器中获取public byte[] getData() 实际缓冲区的对象(从上bytes分段取数据)
byte[] bytes2 = dp.getData();
//获取里面实际缓冲区的长度
```
// public int getLength()
int length2 = dp.getLength();
//展示数据---分段取数据,每次从0开始取实际长度
String msg = new String(bytes2,0,length2) ;
//数据包里面获取哪一个ip地址发来的--->ip地址字符串形式
//public InetAddress getAddress()--->InetAddress--->getHostAddress()--->String IP地址字符串
String ip = dp.getAddress().getHostAddress() ;
System.out.println("data from --->"+ip+",发送内容是:"+msg);
```
//释放资源
ds.close();
```
}
}
Upd方式—>不需要建立连接通道,不可靠连接
Udp发送端的步骤
1)创建发送端的socket
2)创建数据报包
3)使用发送端的Socket将数据存储数据包中, 发送(本质存储数据包)
4)释放资源
public class UdpSend {
public static void main(String[] args) throws IOException {
//1)创建发送端的socket
//此类表示用于发送和接收数据报数据包的套接字。 DatagramSocket
//public DatagramSocket() throws SocketException
DatagramSocket ds = new DatagramSocket() ;
// 2)创建数据报包DatagramPacket
/**
* public DatagramPacket(byte[] buf, 要发送数据---转换成字节数组
* int length, 实际字节数长度
* InetAddress address, ip地址对象
* int port) 端口号
*/
byte[] bytes = "hello,UDP我来了".getBytes() ;
int length = bytes.length ;
InetAddress inetAddress = InetAddress.getByName("192.168.1.5");//如果自己玩,没有网线,无线ip不断变的--->本地回环地址127.0.0.1
int port = 10086 ;
DatagramPacket dp = new DatagramPacket(bytes,length,inetAddress,port);
//3)使用发送端的Socket将数据存储数据包中, 发送(本质存储数据包)
//public void send(DatagramPacket p) throws IOException
ds.send(dp) ;
//4)释放资源
ds.close() ;
}
}
UDP发送端可以不断发送数据,接收点不断展示数据,发送端可以自定义结束条件
发送端不断发送数据
需求:
UDP发送端可以不断键盘录入数据,接收端不断展示数据,
发送端可以自定义结束条件 (课堂练习)
*/
public class UdpSend {
public static void main(String[] args) {
//UDP发送端可以不断键盘录入数据
//创建发送端的socket
DatagramSocket ds = null ;
try {
ds = new DatagramSocket() ;
//键盘录入可以使用BufferedReader--->读一行
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)) ;
String line = null ;
//一次读一行内容
System.out.println("请您输一个数据");
while((line=br.readLine())!=null){
if("over".equals(line)){
break;
}
//创建数据报包,将数据存储在数据包中
DatagramPacket dp = new DatagramPacket(line.getBytes()
,line.getBytes().length,
InetAddress.getByName("10.35.162.121"),
6666) ;
//发送数据报包
ds.send(dp) ;
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if(ds!=null){
ds.close() ;
}
}
}
}
接收端不断接收数据并展示数据
接收端不断展示数据------->接收端模拟真实,不需要关闭
*/
public class UdpReceive {
public static void main(String[] args) {
try {
//创建接收端的Socket对象
DatagramSocket ds = new DatagramSocket(6666) ;
while(true){
//创建一个接收容器
//自定义一个字节数组缓冲区
byte[] buffer = new