通过java实现网络编程,说到底还是涉及到类
提供网络功能的四大类
1.InetAddress:封装IP地址及DNS域解析符,没有封装端口
InetAddress没有对外公共的构造方法,得到InetAddress对象的三种常用方法
//使用getLocalHost()创建新对象
InetAddress addr=InetAddress.getLocalHost();
//10.183.52.45
System.out.println(addr.getHostAddress());
//计算机名称
System.out.println(addr.getHostName());
//根据域名得到对象
InetAddress addr2=InetAddress.getByName("www.163.com");
//163服务器的IP 183.95.189.36
System.out.println(addr2.getHostAddress());
// www.163.com
System.out.println(addr2.getHostName());
//根据IP地址得到对象
InetAddress addr3=InetAddress.getByName("183.95.189.36");
// 183.95.189.36
System.out.println(addr3.getHostAddress());
// 如果DNS没有解析,还是返回IP地址
System.out.println(addr3.getHostName());
InetScoketAddress:在InetAddress基础上加入端口的概念
2.URL
由4部分组成,协议+存放资源的主机域名+端口号+资源名
创建对象的常用方法
//绝对路径构建
URL url=new URL("http://www.baidu.com:80/index.html#aa?uname=www");
//相对路径构建
url=new URL("http://www.baidu.com:80/a/");
url=new URL(url,"b");
System.out.println(url.toString());//http://www.baidu.com:80/a/b
URL url=new URL("http://www.baidu.com:80/index.html#aa?uname=www");
System.out.println("协议:"+url.getProtocol());
System.out.println("域名:"+url.getHost());
System.out.println("端口:"+url.getPort());
System.out.println("资源:"+url.getFile());
System.out.println("相对路径资源:"+url.getPath());
System.out.println("锚点:"+url.getRef());
//若存在锚点返回null,不存在则返回正确
System.out.println("参数:"+url.getQuery());
//获取输入流-网络流
InputStream is=url.openStream();
协议:http
域名:www.baidu.com
端口:80
资源:/index.html
相对路径资源:/index.html
锚点:aa?uname=www
参数:null
3.TCP协议:Socket ServerSocket
4.UDP协议:DatagramSocket DatagramPacket
代码示例:
/**
* 服务端
*/
public class UDPService {
public static void main(String[] args) throws IOException {
System.out.println("----服务端启动 等待客户端连接----");
//1)创建DataGramSocket类+指定端口
DatagramSocket server=new DatagramSocket(8888);
//2)准备接受容器,封装DatagramPacket
byte[] container=new byte[1024];
DatagramPacket packet=new DatagramPacket(container,container.length);
//3)接受数据
server.receive(packet);
//4)分析数据
byte[] data=packet.getData();
int len=packet.getLength();
System.out.println("客户端说:"+new String(data,0,len));
//服务器回复客户端
byte[] sendMsg="服务器说:okay!".getBytes();
DatagramPacket packet2=new DatagramPacket(sendMsg,sendMsg.length,
new InetSocketAddress("localhost",6666));
server.send(packet2);
//5)释放资源
server.close();
}
}
/**
*客户端
*/
public class UDPMyClient {
public static void main(String[] args) throws IOException {
//1)创建DataGramSocket类+指定端口
DatagramSocket client=new DatagramSocket(6666);
//2)准备数据
String msg="hello !";
byte[] data=msg.getBytes();
//3)打包成DatagramPacket +服务器地址+端口
DatagramPacket packet=new DatagramPacket(data,data.length,
new InetSocketAddress("localhost",8888));
//4)发送
client.send(packet);
//接受服务器的回复
byte[] container=new byte[1024];
DatagramPacket packet2=new DatagramPacket(container,container.length);
client.receive(packet2);
byte[] data2=packet2.getData();
int len=packet2.getLength();
System.out.println(new String(data2,0,len));
//5)释放资源
client.close();
}
}