《疯狂Java讲义》学习笔记(十三)网络编程
程序员文章站
2022-06-06 21:21:55
...
1、基本网络支持
- 使用InetAddress
Java提供了InetAddress类来代表IP地址,InetAddress下还有两个子类:Inet4Address、Inet6Address,分别代表IPv4和IPv6地址
// 可以通过如下两个静态方法来获取InetAddress实例:
getByName(String host):根据主机域名获取
getByAddress(byte[] addr):根据原始IP获取
// 常用API:
String getCanonicalHostNam():获取全限定域名
String getHostAddress():返回对应的IP地址
String getHostName():获取IP地址的主机名
boolean isReachable():测试是否可以到达该地址
- 使用URLDecoder和URLEncoder
在地址头中如果出现中文字符,可能换转换成类似乱码,事实上不是乱码,这是application/x-www.form-urlencoded MINE字符串
URLDecoder类包含一个decode(String s,String enc)静态方法,它可以将看上去是乱码的特殊字符串转换成腹痛字符串,类似解密
URLEncode类包含一个encode(String s,String enc)静态方法,它可以将普通字符串转换成application/x-www.form-urlencoded MINE字符串 - URL、URLConnection和URLPermission
URL对象代表题哦那诡异资源定位器,它是指向互联网资源的指针;URL可以由协议名、主机、端口和资源组成:
protocol://host:port/resourceName
URI实例代表一个统一资源识别符,它不能定位任何资源,唯一作用就是解析;而URL则包含一个可打开到达该资源的输入流,可以将URL理解成URI的特例
常用API:
String getFile():获取该URL的资源名
String getHost():获取该URL的主机名
String getPath():获取该URL的路径部分
int getPort():获取该URL的端口
String getProtocol():获取该URL的协议名称
String getQuery():获取该URL的查询字符串部分
URLConnection openConnection():返回一个URLConnection对象,它代表了与URL所引用的远程对象的连接
InputStream openStream():打开与此URL的连接,并返回一个用于读取该URL资源的InputStream
2、基于TCP协议的网络编程
TCP/IP通讯协议在通信的两端各建立一个Socket,从而在通信的两端之间形成网络虚拟链路
IP和TCP这两个协议的功能不尽相同,也可以分开单独使用,但它们是在同一时期作为一个协议来设计的,并且在功能上也是互补的;只有结合两者,才能保证Internet在复杂的环境下正常运行。凡事要连接到Internet的计算机,都必须同时安装和使用这两个协议,因此在实际中常把这两个协议统称为TCP/IP协议
- 使用ServerSocket创建TCP服务器端
Java中能接收其它通信实体连接请求的类是ServerSocket,ServerSocket对象用于监听来自客户端的Socket连接,如果没有连接,它将一直处于等待状态。ServerSocket包含一个监听来自客户端连接请求的方法:
Socket accept():接收到连接请求后返回一个与客户端Socket对应的Socket
ServerSocket(int port):用指定的端口port来创建一个ServerSocket,该端口应该有一个有效的端口整数值,0~65535
ServerSocket(int port,int backlog):backlog用于改变连接队列长度
ServerSocket(int port,int backlog,InetAddress localAddr):在机器存在多个IP地址的情况下,允许通过localAddr参数来指定将ServerSocket绑定到指定的IP地址
当ServerSocket使用完毕后,应当使用close()方法来关闭该ServerSocket
服务器应该不断地接收来自客户端的所有请求,所以Java程序通常会通过循环不断地调用ServerSocket的accept()方法
ServerSocket ss = new ServerSocket(3000);
white(true){
Socket s = ss.accept();
}
- 使用Socket进行通信
Socket(InetAddress/String remoteAddress,int port):创建连接到指定远程主机、远程端口的Socket,该构造器没有指定本本地地址、本地端口,默认使用本地主机的默认IP地址,默认使用系统动态分配的端口
Socket(InetAddress/String remoteAddress,int port,InetAddress localAddr,int localPort):适用于本地主机有多个IP地址的情形
服务端例子:
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(3000);
while(true){
Socket s = ss.accept();
PrintStream ps = new PrintStream(s.getOutputStream());
ps.println("我是服务端!");
ps.close();
s.close();
}
}
}
客户端例子:
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket("127.0.0.1",3000);
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = br.readLine();
System.out.println("来自服务器的数据:"+line);
br.close();
socket.close();
}
}