网络编程复习
InetAddress类的使用
一、实现网络通信需要解决的两个问题
1. 如何精确地定位网络上一台或多台主机; 定位主机上的特定的应用。
2. 找到主机后如何可靠高效地进行数据传输。
二、网络通信的两个要素:
1. 对应问题①: IP和端口号
2. 对应问题②: 提供网络通信协议: TCP/IP参考模型(应用层、传输层、网络层、物理层、数据链路层)
三、通信要素1: IP和端口号
IP的理解
1. IP: 唯一的标识 Internet 上的计算机(通信实体)
2. 在Java中使用InetAddress类代表IP
3. IP分类: IPv4 和 IPv6 ; 万维网 和 局域网
4. 域名: www.baidu.com www.mi.com www.sina.com www.vip.com
域名解析:域名容易记忆,当在连接网络时输入一个主机的域名后,域名服务器(DNS)负责将域名转化为IP地址,这样才能和主机建立链接
5. 本地回路地址: 127.0.0.1 对应着: localhost
InetAddress类:
此类的一个对象就代表着一个具体的IP地址
实例化
getByName(String host)
getLocalHost()
常用方法
getHostName()获取域名
getHostAddress()获取IP地址
端口号
正在计算机上运行的进程
要求: 不同的进程有不同的端口号
范围: 被规定为一个16位的整数 0~65535
端口号与IP地址的组合得出一个网络套接字: Socket
四、通信要素2: 网络通信协议
1. 分型模型
2. TCP和UDP的区别
TCP:可靠传输;进行大数据量传输;效率低
UDP:不可靠传输;数据报大小限制64kb;效率高
3. TCP的三次握手、四次挥手
TCP网络编程
例题1
客户端发送信息给服务端,服务端将数据显示在控制台上
public class TCPTest1 {
@Test
public void client() {
Socket socket
= null
;
OutputStream os
= null
;
try {
InetAddress inet1
= InetAddress
.getByName("127.0.0.1");
socket
= new Socket(inet1
,8899);
os
= socket
.getOutputStream();
os
.write("你好,我是客户端".getBytes());
} catch (IOException e
) {
e
.printStackTrace();
} finally {
if (os
!= null
){
try {
os
.close();
} catch (IOException e
) {
e
.printStackTrace();
}
}
if (socket
!= null
){
try {
socket
.close();
} catch (IOException e
) {
e
.printStackTrace();
}
}
}
}
@Test
public void server() {
ServerSocket ss
= null
;
Socket socket
= null
;
InputStream is
= null
;
ByteArrayOutputStream baos
= null
;
try {
ss
= new ServerSocket(8899);
socket
= ss
.accept();
is
= socket
.getInputStream();
baos
= new ByteArrayOutputStream();
byte[] buffer
= new byte[5];
int len
;
while ((len
= is
.read(buffer
)) != -1){
baos
.write(buffer
,0,len
);
}
System
.out
.println(baos
.toString());
System
.out
.println("收到了来自于:"+socket
.getInetAddress().getHostAddress()+"的数据");
} catch (IOException e
) {
e
.printStackTrace();
} finally {
if (baos
!= null
){
try {
baos
.close();
} catch (IOException e
) {
e
.printStackTrace();
}
}
if (is
!= null
){
try {
is
.close();
} catch (IOException e
) {
e
.printStackTrace();
}
}
if (socket
!= null
){
try {
socket
.close();
} catch (IOException e
) {
e
.printStackTrace();
}
}
if (ss
!= null
){
try {
ss
.close();
} catch (IOException e
) {
e
.printStackTrace();
}
}
}
}
}
例题2
客户端发送文件给服务端,服务端将文件保存在本地。
public class TCPTest2 {
@Test
public void client(){
Socket socket
= null
;
OutputStream os
= null
;
BufferedInputStream bis
= null
;
try {
InetAddress inet1
= InetAddress
.getByName("127.0.0.1");
socket
= new Socket(inet1
,8899);
os
= socket
.getOutputStream();
bis
= new BufferedInputStream(new FileInputStream("滑稽.jpg"));
byte[] buffer
= new byte[1024];
int len
;
while ((len
= bis
.read(buffer
)) != -1){
os
.write(buffer
,0,len
);
}
} catch (IOException e
) {
e
.printStackTrace();
} finally {
if (bis
!= null
){
try {
bis
.close();
} catch (IOException e
) {
e
.printStackTrace();
}
}
if (os
!= null
){
try {
os
.close();
} catch (IOException e
) {
e
.printStackTrace();
}
}
if (socket
!= null
){
try {
socket
.close();
} catch (IOException e
) {
e
.printStackTrace();
}
}
}
}
@Test
public void server(){
ServerSocket ss
= null
;
Socket socket
= null
;
InputStream is
= null
;
BufferedOutputStream bos
= null
;
try {
ss
= new ServerSocket(8899);
socket
= ss
.accept();
is
= socket
.getInputStream();
bos
= new BufferedOutputStream(new FileOutputStream("滑稽1.jpg"));
byte[] buffer
= new byte[1024];
int len
;
while ((len
= is
.read(buffer
)) != -1){
bos
.write(buffer
,0,len
);
}
System
.out
.println("接收成功");
} catch (IOException e
) {
e
.printStackTrace();
} finally {
if (bos
!= null
){
try {
bos
.close();
} catch (IOException e
) {
e
.printStackTrace();
}
}
if (is
!= null
){
try {
is
.close();
} catch (IOException e
) {
e
.printStackTrace();
}
}
if (socket
!= null
){
try {
socket
.close();
} catch (IOException e
) {
e
.printStackTrace();
}
}
if (ss
!= null
){
try {
ss
.close();
} catch (IOException e
) {
e
.printStackTrace();
}
}
}
}
}
例题3
从客户端发送文件给服务端,服务端保存到本地。
并返回"发送成功"客户端。且关闭相应连接
异常采用try-catch-finally接受
public class TCPTest3 {
@Test
public void client() throws IOException
{
Socket socket
= new Socket(InetAddress
.getByName("127.0.0.1"),9909);
OutputStream os
= socket
.getOutputStream();
BufferedInputStream bis
= new BufferedInputStream(new FileInputStream("滑稽.jpg"));
byte[] buffer
= new byte[1024];
int len
;
while ((len
= bis
.read(buffer
)) != -1){
os
.write(buffer
,0,len
);
}
socket
.shutdownOutput();
InputStream is
= socket
.getInputStream();
ByteArrayOutputStream baos
= new ByteArrayOutputStream();
byte[] buffer1
= new byte[20];
int len1
;
while ((len1
= is
.read(buffer1
)) != -1){
baos
.write(buffer1
,0,len1
);
}
System
.out
.println(baos
.toString());
baos
.close();
is
.close();
bis
.close();
os
.close();
socket
.close();
}
@Test
public void server() throws IOException
{
ServerSocket socket
= new ServerSocket(9909);
Socket accept
= socket
.accept();
InputStream is
= accept
.getInputStream();
BufferedOutputStream bos
= new BufferedOutputStream(new FileOutputStream("滑稽2.jpg"));
byte[] buffer
= new byte[1024];
int len
;
while ((len
= is
.read(buffer
))!= -1){
bos
.write(buffer
,0,len
);
}
System
.out
.println("本地接受数据完成");
OutputStream os
= accept
.getOutputStream();
os
.write("文件已接受并保存".getBytes());
os
.close();
bos
.close();
is
.close();
accept
.close();
socket
.close();
}
}
UDP网络编程
代码举例
public class UDPTest {
@Test
public void sender() throws IOException
{
DatagramSocket socket
= null
;
try {
socket
= new DatagramSocket();
String str
= "我是UDP方式发送的导弹";
byte[] data
= str
.getBytes();
InetAddress inet
= InetAddress
.getByName("127.0.0.1");
DatagramPacket packet
= new DatagramPacket(data
,0,data
.length
,inet
,9090);
socket
.send(packet
);
} catch (IOException e
) {
e
.printStackTrace();
} finally {
if (socket
!= null
){
try {
socket
.close();
} catch (Exception e
) {
e
.printStackTrace();
}
}
}
}
@Test
public void receiver() throws IOException
{
DatagramSocket socket
= null
;
try {
socket
= new DatagramSocket(9090);
byte[] buffer
=new byte[100];
DatagramPacket packet
= new DatagramPacket(buffer
,0,buffer
.length
);
socket
.receive(packet
);
System
.out
.println(new String(packet
.getData(),0,packet
.getLength()));
} catch (IOException e
) {
e
.printStackTrace();
} finally {
if (socket
!= null
){
try {
socket
.close();
} catch (Exception e
) {
e
.printStackTrace();
}
}
}
}
}
URL编程
1. URL(Uniform Resource Locator)的理解:
统一资源定位符,对应着互联网上的某一资源地址
2. URL的5个基本结构:
https://localhost:8080/examples/beauty.jpg?username=Tom
协议:// 主机名(域名) :端口号 资源地址 参数列表
3. 如何实例化:
URL url = new URL("https://www.bilibili.com/video/BV1Kb411W75N?p=629");
4. 常用方法:
System
.out
.println(url
.getProtocol());
System
.out
.println(url
.getHost());
System
.out
.println(url
.getPort());
System
.out
.println(url
.getPath());
System
.out
.println(url
.getFile());
System
.out
.println(url
.getQuery());
5. 可以读取、下载对应的url资源:
public class URLTest1 {
public static void main(String
[] args
){
HttpURLConnection openConnection
= null
;
InputStream is
= null
;
BufferedOutputStream bos
= null
;
try {
URL url
= new URL("https://www.bilibili.com/video/BV1Kb411W75N?p=629");
openConnection
= (HttpURLConnection
) url
.openConnection();
openConnection
.connect();
is
= openConnection
.getInputStream();
bos
= new BufferedOutputStream(new FileOutputStream("c.mp4"));
byte[] buffer
= new byte[1024];
int len
;
while ((len
= is
.read(buffer
)) != -1){
bos
.write(buffer
,0,len
);
}
System
.out
.println("下载完成");
} catch (IOException e
) {
e
.printStackTrace();
} finally {
if (is
!= null
){
try {
is
.close();
} catch (IOException e
) {
e
.printStackTrace();
}
}
if (bos
!= null
){
try {
bos
.close();
} catch (IOException e
) {
e
.printStackTrace();
}
}
if (openConnection
!= null
){
try {
openConnection
.disconnect();
} catch (Exception e
) {
e
.printStackTrace();
}
}
}
}
}