网络通信三要素
1)ip地址
2)端口号
3)应该有一些规则(协议UDP/TCP)
Ip地址的分类:
IP地址的组成
IP地址 = 网络号码+主机地址
A类IP地址:第一段号码为网络号码,剩下的三段号码为本地计算机的号码
一般情况:国防部/大的国部门
B类IP地址:前二段号码为网络号码,剩下的二段号码为本地计算机的号码
一般情况:大学里面的多媒体教室
C类IP地址:前三段号码为网络号码,剩下的一段号码为本地计算机的号码
私人地址
127.0.0.1--->表示本地计算机的回环地址
端口号:0~65535有效端口号
0-1024属于保留端口
mysql:3306
协议:
UDP协议 --->UDP编程
不需要建立连接通道的
数据大小有限制
不可靠连接
执行效率高
TCP协议 ---->TCP编程
需要建立连接通道
数据大小无限制
可靠连接
执行效率低
InetAddress:类表示互联网协议 (IP) 地址
常用方法:
public static InetAddress getByName(String host)
throws UnknownHostException在给定主机名的情况下确定主机的 IP 地址。
public String getHostAddress()返回 IP 地址字符串(以文本表现形式)
public String getHostName()获取此 IP 地址的主机名。
参数:
主机名可以是机器名(如 "java.sun.com"),也可以是其 IP 地址的文本表示形式
例如:
package com.westos.Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class InetAddressDome {
public static void main(String[] args) throws UnknownHostException {
//创建Address类对象,在知道主机名的情况下获取IP值
InetAddress address = InetAddress.getByName("DESKTOP-JM461TS");
//调用getHostAddress方法来获取IP的文本形式
String ip = address.getHostAddress();
System.out.println(ip);//192.168.43.204
System.out.println("----------------------");
//当你知道你的IP地址时可以通过IP地址获取你的主机名
InetAddress address2 = InetAddress.getByName("192.168.43.204");
//获取主机名的文本格式
String name = address2.getHostName();
System.out.println(name);//DESKTOP-JM461TS
}
}
运行结果:
192.168.43.204
---------------
DESKTOP-JM461TS
Socket(套接字)包含udp编程和tcp编程
都是网络中的套接字:只有通过ip地址和端口号来进行唯一的标识。
原理:
两端必须都有Socket对象
中间采用流的形式进行传输
例如:
我们在用的QQ就是通过这种形式来运行的:一个发送端将数据封装在一个数据报包通过底层的传输比特流发送给接收端,然后接收端也创建一个数据报包来接受传输中的实际数据,最终将它以字符串的数据展示出来
Udp编程:
1)不需要建立连接通道
2)数据大小有限制
3)不可靠连接---->传输速度快!
先来看看udp编程的案例:
先来创建一个发送端类:
package com.westos.socket;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/* 发送端的开发步骤:
* 1)创建发送端的Socket对象
* 2)创建数据,并打包
* 3)调用当前发送端Socket对象中的发送的方法
* 4)关闭资源
*
*/
public class SendDome {
public static void main(String[] args) throws IOException {
/**
* 1)创建发送端的Socket对象
* 创建DatagramSocket类对象
*/
DatagramSocket ds=new DatagramSocket();
/**
* 2)创建数据并打包
* DatagramPacket数据报包
* DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
*/
//写数据
byte[] bys="My best wishes...".getBytes();
//获取数据的长度
int len = bys.length;
//获取IP地址对象
InetAddress address = InetAddress.getByName("DESKTOP-JM461TS");
//指定端口号
int port=10086;
DatagramPacket dp=new DatagramPacket(bys,0,len,address,port);
/**
* 3)调用当前发送端Socket对象中的发送的方法
* public void send(DatagramPacket p)
* throws IOException从此套接字发送数据报包
*/
ds.send(dp);
/**
* 4)关闭资源
*/
ds.close();
}
}
再创建一个接收端类:
package com.westos.socket;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
*Udp编程的接收端 开发步骤:
* 1)创建Socket对象
* 2)创建一个数据报包(接收容器)
* 3)调用Socket对象中的接收的方法
* 4)解析实际传递的数据
* 5)将解析的数据(ip,数据)展示在控制台上
* 6)关闭资源
*注意:
*接收端不要运行多次,会出现异常:
* java.net.BindException: Address already in use: Cannot bind
*/
public class receiveDome {
public static void main(String[] args) throws IOException {
/**
* 1)创建接受端的Socket对象
* 创建DatagramSocket类对象
* 构造方法:
* public DatagramSocket(int port)创建数据报包套接字对象并且将其绑定到本地主机上的指定端口
*/
DatagramSocket ds=new DatagramSocket(10086);
/**
* 2)创建一个接收的数据报包
* public DatagramSocket(int port)创建数据报包套接字对象并且将其绑定到本地主机上的指定端口
*/
byte[] bys=new byte[1024];
int len=bys.length;
DatagramPacket dp=new DatagramPacket(bys,len);
/**
* 3)调用Socket对象的接收方法
* public void receive(DatagramPacket p):接收数据报包
*/
ds.receive(dp);
//获取IP的文本形式
//public InetAddress getAddress() :返回ip地址对象 数据报包类:DataGramPacket
InetAddress address = dp.getAddress();
String ip = address.getHostAddress();
/**
* 4)解析实际的传递的数据
* public byte[] getData() :获取缓冲中实际数据(从接收容器中获取)
* public int getLength()返回将要发送或接收到的数据的长度。
*/
byte[] bys2 = dp.getData();
int len2 = dp.getLength();
String str=new String(bys2,0,len2);
System.out.println("目前接收到的数据是"+str+",来自于"+ip);
/**
* 关闭资源
*/
ds.close();
}
}
注意要点:
我们的接收端不要运行多次,否则会出现异常:Exception in thread "main" java.net.BindException: Address already in use: Cannot bind,所以这是我们需要注意的一个点。