网络通讯3要素:
1、IP地址,网络中计算机的数字标识。本地回环地址:127.0.0.1,本地主机名:localhost。
2、端口,用于标识不同的进程。端口的取值范围:0~65535,其中0~1024已被系统使用或保留。
3、协议,通讯规则。常见协议:UDP协议、TCP协议。
对IP地址的描述:java.net.InetAddress
常用方法:
static InetAddress getLocalHost() // 获取本地主机
static InetAddress getByName(String host) // 通过主机名获取主机
static InetAddress[] getAllByName(String host) // 获取主机列表
static InetAddress getByAddress(String host) // 通过主机名获取主机
static InetAddress getByAddress(byte[] addr) // 通过地址获取主机
static InetAddress getByAddress(String host,byte[] addr)
UDP与TCP
UDP:
面向无连接,无需连接,不可靠协议,速度快
将数据、源和目的封装成不超过64KB的包
具体应用:视频会议、聊天
TCP:
必须建立连接,形成数据传输通道
通过3次握手完成连接,可靠连接
无需封包,进行大数据量传输
具体应用:下载
Socket编程
在两个Socket之间通过IO进行通信。
封装了UDP的Socket:DatagramSocket
UDP的发送:
DatagramSocket ds = // 建立Socket,指定监听端口,若不指定端口由系统分配
new DatagramSocket(port);
DatagramPacket dp = // 将数据封装成DatagramSocket对象用于发送
new DatagramPacket(
data[], // 需要发送的数据
data.length, // 数据长度
InetAddress, // 目的主机
port); // 目的端口
ds.send(dp); // 发送数据
ds.close(); // 关闭资源
UDP的接收:
DatagramSocket ds = // 建立Socket,指定监听端口,若不指定端口由系统分配
new DatagramSocket(port);
DatagramPacket dp = // 新建一个数据包用于存放接收到的数据
new DatagramPacket(
data[],
data.length);
ds.receive(dp); // 接收数据
// 通过DatagramPacket对象取出数据
String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();
byte[] data = dp.getData();
int len = dp.getDataLength();
ds.close(); // 关闭资源
TCP的传输:Socket和ServerSocket
TCP传输的两端:
一个客户端,与Socket对象对应;
一个服务端,与ServerSocket对应;
Socket内部封装了两个流对象(称为Socket流),用这两个流对象可以实现客户端与服务端的通信。
TCP客户端:
Socket s =// 创建Socket服务,指定要连接的目标主机和端口
new Socket(InetAddress, port);
OutputStream out =
s.getOutputStream(); // 获取Socket输出流,并向服务端发送信息
out.write("hello".getBytes());
InputStream in =
s.getInputStream(); // 获取Socket输入流,接受来自服务端的信息
in.read(data[]);
s.close();// 关闭资源
TCP服务端:
ServerSocket ss // 建立ServerSocket服务,并监听指定端口
new ServerSocket(port);
Socket s = ss.accept(); // 接受客户端的连接请求,并获得客户端对象
InputStream in =
s.getInputStream(); // 利用客户端的 输入流 获取客户端用 输出流 发来的数据
in.read(data[]);
PrintWriter out = // 利用客户端的 输出流 向客户端发送数据
new PrintWriter(s.getOutputStream(), true);
out.println(data);
s.close();
ss.close(); // 可选操作。先关闭客户端,再关闭服务端
URL,统一资源定位符
URL的格式:
<协议名>://<资源名>
其中资源名的组成分为:
<authority>[:<port>]/<path>[?<query>[#fragment]]
authority;主机名或IP地址
port:端口,可选
path:路径,用/分隔
query:标示查询
fragment:资源中的信息片段
常用方法:
URL url = // 通过字符串创建URL对象
new URL("http://orsoul.iteye.com/blog/2186558");
常用方法:
String getProtocol()); // 获取协议名
String getHost() // 获取主机名
String getPort() // 若没有写端口,则返回-1
String getPath() // 获取路径
String getFile() // 获取文件名
String getQuery() // 获取查询部分
URLConnection openConnection() // 打开链接,并返回此链接对象
URLConnection
此类表示程序与URL之间的通信链接。
URL url = // 通过字符串创建URL对象
new URL("http://orsoul.iteye.com/blog/2186558");
URLConnection conn =
url.openConnection(); // 用过url获得链接
BufferedReader in = // 获取输入流用于读取网页上的内容
new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while (null != (line=in.readLine())) {
System.out.println(line);
}