网络通讯三要素:
IP地址:InetAddress
网络中设备的标识,不易记忆,可用主机名,目前IPV4是32位,已经耗尽,IPV6是128位
公网地址,可以直接用Internet访问,内网地址,就是局域网
端口号:
用于标识进程的逻辑地址,不同进程的标识
传输协议
通讯规制,常见协议:
TCP,三次握手完成连接,是可靠协议,效率底点,安全高
UDP,对数据打包,封装,不需要建立连接,只负责发送,每个数据包在64K内,效率高,但是不安全
InetAddress类——代表ip地址
静态方法:
getAddress——返回原始ip地址
getAllByName(String host(主机名)) ——获取IP地址组成的数组
getByName(String host/ip地址)——获取IP地址对象
getLocalHost——获取本地主机名
对象方法:
getHostAddress——获取主机ip地址
getHostName——获取主机名
使用UDP协议发送数据
创建发送端Socket对象
DatagramSocket()——随意分配端口号
DatagramSocket(int port)——确定端口号
DatagramSocket ds = new DatagramSocket();
创建数据并打包
DatagramPacket——表示数据包
String s = "hello";
byte[] bys = s.getBytes();
int length = bys.length;
InetAddress address = InetAddress.getByName("主机名");
int port = 8888;
DatagramPacket dp = new DatagramPacket(bys ,length,address,port);
发送数据
ds.send(dp);
释放资源
ds.close();
使用UDP协议接受数据
创建接受端Socket对象
DatagramSocket ds = new DatagramSocket(8888) ;需要指定接受端的端口
接受数据包
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys,bys.length);
ds.receive(dp);//阻塞——等着数据过来
解析数据包
InetAddress address = dp.getAddress();
byte[] data =dp.getData();
int length = dp.getLength();
sysout(address.getHostAddress());
sysout(new String(data,0,length));——收到多少数据就接受多少
释放资源
dp.close();
使用UDP协议收发数据注意事项:
端口号错误,数据可以正常发出,不会出现异常,但是收不到数据
Address already in user:Cannot bind——端口号被占用
使用TCP协议发送数据:
//创建发送端Socket对象(创建连接:ip,端口)
Socket s = new Socket(InetAddress.getByName("主机名"),端口号);
//获取输出流对象
OutputStream os = s.getOutpuStream();
//发送数据
String str = "hello";
os.write(str.getBytes());
//释放资源
s.close();
使用TCP协议接受数据
//创建接受端Socket对象(创建连接:ip,端口)
ServerSocket ss = new ServerSocket(端口号);
//监听(阻塞)
Socket s = ss.accept();
//获取输入流对象
InputStream is = s.getInputStream();
//获取数据
byte[] bys = new byte[1024];
int len = is.read(bys);
//输出数据
sysout("client-->"+s.getInetAddress().getHostName());//输出发送过来的主机名
sysout(new String(bys,0,len));
//释放资源
s.close();
Connection refused:connect——连接失败,被拒绝了