概述
第一节 网络基础知识
常用的通信协议
MAC地址:(Media Access Control Address,媒体存取控制位址),
IP:(Internet Protocol,网际协议)
UDP:(User Datagram Protocol,用户数据报协议)
TCP:(Transmission Control Protocol,传输控制协议)
HTTP协议:(Hyper Text Transfer Protocol,超文本传输协议)
FTP: (File Transfer Protocol,文件传输协议)
SMTP: (Simple Mail Transfer Protocol,简单邮件传输协议)
POP3/IMAP
POP3:(Post Office Protocol-Version3 邮件协议版本3)
IMAP:(Internet Message Access Protocol 消息访问协议)
① mac地址:
每个计算设备上都有若干个网卡
每个网卡上有(全球唯一)单独的硬件地址,MAC地址
② IP地址:
IP地址:每个网卡/机器都有一个或多个IP地址
IPV4:192.168.0.100,每段从0到255
IPV6: 128bit长,分成8段,每段4个16进制数
• FE80:0000:0000:0000:AAAA:0000:00C2:0002
• https://baike.baidu.com/item/IPv6/172297?fr=aladdin
– 查询:Windows平台ipconfig, Linux/Mac平台ifconfig
为实现网络通信,每台电脑必须有一个与众不同的标识,这就是IP地址,由32位(4段8位)的二进制数组成。格式:76.73.91.155
• 保留ip:127.0.0.1 本机
• 公网(万维网/互联网)和内网(局域网)
– 网络是分层的
– 最外层是公网/互联网
– 底下的每层都是内网
– ip地址可以在每个层次的网重用
– tracert 看当前机器和目标机器的访问中继
③ 通讯协议:TCP和UDP
• TCP:Transmission Control Protocol
– 传输控制协议,面向连接的协议
– 两台机器的可靠无差错的数据传输
– 双向字节流传递
• UDP: User Datagram Protocol
– 用户数据报协议,面向无连接协议
– 不保证可靠的数据传输
– 速度快,也可以在较差网络下使用
④域名(Domain Address):
为了便于记忆纯数字的IP地址而采用的一种字符串形式的域名地址来标识网络上的机器。如:
⑤ 端口(Port):
• port:端口,0-65535
– 0~1023, OS已经占用了,80是Web,23是telnet
– 1024~65535,一般程序可使用(谨防冲突)
• 两台机器通讯就是在IP+Port上进行的
• 在Windows/Linux/Mac上都可以通过netstat -an来查询
⑥URL:
URL(Uniform Resource Locator):统一资源定位器,用于表示Internet上资源的地址
URL一般由协议名、资源所在的主机名和资源名等部分组成。如:
http:// xueyuan.zhbit.com / computer/Article1.html
对应 | URL |
---|---|
就是URL的后半段即统一资源标识(computer/Article1.html ) | URI(Uniform Resource Indicator) |
http | 协议名 |
xueyuan.zhbit.com | 主机名 |
两台机器通讯就是在IP+Port上进行的
InetAddress类
-
InetAddress类没有提供公共的构造器,而是提供了如下几个静态方法来获取InetAddress实例
public static InetAddress getLocalHost()
public static InetAddress getByName(String host)
-
InetAddress提供了如下几个常用的方法
public String getHostAddress()
:返回 IP 地址字符串(以文本表现形式)。
public String getHostName()
:获取此 IP 地址的主机名
public boolean isReachable(int timeout)
:测试是否可以达到该地址
InetAddress inet1 = InetAddress.getByName("192.168.10.14");
System.out.println(inet1);
InetAddress inet2 = InetAddress.getByName("www.atguigu.com");
System.out.println(inet2);
//getHostName()
System.out.println(inet2.getHostName());
//getHostAddress()
System.out.println(inet2.getHostAddress());
第二节 Java UDP编程
计算机通讯:数据从一个IP的port出发(发送方),运输到另外一个IP的port(接收方)
• UDP:无连接无状态的通讯协议,
– 发送方发送消息,如果接收方刚好在目的地,则可以接受。如果不在,那这个消息就丢失了
– 发送方也无法得知是否发送成功
– UDP的好处就是简单,节省,经济
连接方法
• DatagramSocket:通讯的数据管道
– send 和receive方法
– (可选,多网卡)绑定一个IP和Port
• DatagramPacket
– 集装箱:封装数据
– 地址标签:目的地IP+Port
• 实例
– 无主次之分
– 接收方必须早于发起方执行
代码(1) UdpRecv.java
代码(2) UdpSend.java
第三节 Java TCP 编程
TCP协议:有链接、保证可靠的无误差通讯
– ①服务器:创建一个ServerSocket,等待连接
– ②客户机:创建一个Socket,连接到服务器
– ③服务器:ServerSocket接收到连接,创建一个Socket和客户的
Socket建立专线连接,后续服务器和客户机的对话(这一对Socket)
会在一个单独的线程(服务器端)上运行
– ④服务器的ServerSocket继续等待连接,返回①
软件服务器有两个要求:
1)它能够实现一定的功能
2)它必须在一个公开地址上对外提供服务。
ServerSocket: 服务器码头(门口的礼仪小姐)
– 需要绑定port
– 如果有多块网卡,需要绑定一个IP地址
Socket: 运输通道(通道)
– 客户端需要绑定服务器的地址和Port
– 客户端往Socket输入流写入数据,送到服务端
– 客户端从Socket输出流取服务器端过来的数据
– 服务端反之亦然
Socket编程
1.两个进程间可以通过一个双向的网络通信连接实现数据交换,这种通信链路的端点被称为套接字(Socket)。
2.套接字分为服务器套接字(Server Socket)和客户端套接字(Client Socket)
3.Socket通常用来实现Client-Server连接,所需信息:
① 远程计算机的机器名或IP地址
② 试图连接的端口号(Port Number)
4.java.net包中定义的两个类Socket和ServerSocket 分别用来实现双向连接的Client和Server端。
Server | Client |
---|---|
ServerSocket s(port #) | Socket s(host,port #) |
s.accept()等待连接 | Socket() 主动发起连接 |
OutputStream | OutputStream |
InputStream | InputStream |
socket.close() | socket.close() |
服务端的输出流,就是客户端的输入流,客户端的输出流,就是服务端的输入流
规则:
服务端等待响应时,处于阻塞状态
• 服务端可以同时响应多个客户端
• 服务端每接受一个客户端,就启动一个独立的线程与之对应
• 客户端或者服务端都可以选择关闭这对Socket的通道
• 实例
– 服务端先启动,且一直保留
– 客户端后启动,可以先退出
Socket建立连接的基本步骤
1.建立网络连接
2.打开连接到Socket的输入/输出流
3.通过已打开的I/O流进行数据读写操作
4.关闭已打开的I/O流和Socket
5.全过程进行异常捕获
Socket服务器端编程(工作过程包含以下四个基本的步骤):
- 调用 ServerSocket(int port) :创建一个服务器端套接字,并绑定到指定端口上。用于监听客户端的请求。
- 调用 accept():监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字对象。
- 调用 该Socket类对象的 getOutputStream() 和 getInputStream ():获取输出流和输入流,开始网络数据的发送和接收。
- 关闭ServerSocket和Socket对象:客户端访问结束,关闭通信套接字
try {
//创建服务端口的Socket
ServerSocket s = new ServerSocket(8888);
//等待客户端发出的连接请求
Socket st = s.accept();
//创建输出流
OutputStream os = st.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
dos.writeUTF(“写给客户端的信息"); //向客户端输出信息
dos.close(); //关闭输出流
st.close(); //关闭输出流
}catch (IOException e) {
e.printStackTrace();
}
Socket客户器端编程(工作过程包含以下四个基本的步骤:)
- 创建Socket:根据指定服务端的 IP 地址或端口号构造 Socket类对象。若服务器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常
- 打开连接到Socket 的输入/出流:使用 getInputStream()方法获得输入流,使用getOutputStream()方法获得输出流,进行数据传输
- 按照一定的协议对Socket 进行读/写操作:通过输入流读取服务器放入线路的信息(但不能读取自己放入线路的信息),通过输出流将信息写入线程。
- 关闭Socket:断开客户端到服务器的连接,释放线路
try {
//创建客户端口的Socket
Socket st = new Socket("127.0.0.1", 8888);
//创建监听服务器端的输入流
InputStream is = st.getInputStream();
DataInputStream dis = new DataInputStream(is);
//读出服务器端发出的信息
System.out.println(dis.readUTF());
dis.close(); //关闭输出流
st.close(); //关闭输出流
}catch (IOException e) {
e.printStackTrace();
}
URL类
概念
-
URL(Uniform Resource Locator)
:统一资源定位符,它表示 Internet 上某一资源
的地址。 -
它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。
-
通过 URL 我们可以访问 Internet 上的各种网络资源,比如最常见的 www,ftp站点。浏览器通过解析给定的 URL 可以在网络上查找相应的文件或其他资源。
构造器
- 为了表示URL,java.net 中实现了类 URL。我们可以通过下面的构造器来初始化一个 URL 对象:
public URL (String spec):通过一个表示URL地址的字符串可以构造一个URL对象。
例如:URL url = new URL ("http://www. atguigu.com/");
public URL(URL context, String spec):通过基 URL 和相对 URL 构造一个 URL 对象。
例如:URL downloadUrl = new URL(url, “download.html")
public URL(String protocol, String host, String file);
例如:new URL("http","www.atguigu.com", “download. html");
public URL(String protocol, String host, int port, String file); 例如: URL gamelan = new URL(“http”,"www.atguigu.com", 80, “download.html");
URL类的构造器都声明抛出非运行时异常,必须要对这一异常进行处理,通常是用 try-catch 语句进行捕获。
方法
项目 | Value |
---|---|
public String getProtocol( ) | 获取该URL的协议名 |
public String getHost( ) | 获取该URL的主机名 |
public String getPort( ) | 获取该URL的端口号 |
public String getPath( ) | 获取该URL的文件路径 |
public String getFile( ) | 获取该URL的文件名 |
public String getQuery( ) | 获取该URL的查询名 |
第四节 Java HTTP 编程
了解一下
jdk11有HTTP相关的类了
• http://www.ecnu.edu.cn/index.html?a=1&b=2&c=3
• http:// 协议名
www.ecnu.edu.cn 域名
index.html 资源文件名字
?a=1&b=2&c=3 提供给资源文件的参数根据资源文件的参数不同,资源文件返回的也不同
?后面都是算参数
URLConnection类
• 获取资源的连接器
• 若希望输出数据,例如向服务器端的 CGI (公共网关接口-Common Gateway Interface-的简称,是用户浏览器和服务器端的应用程序进行连接的接口)程序发送一些数据,则必须先与URL建立连接,然后才能对其进行读写,此时需要使用URLConnection 。
• 根据URL的openConnection()方法获得URLConnection
• connect方法,建立和资源的联系通道
• getInputStream方法,获取资源的内容
• URLConnection:表示到URL所引用的远程对象的连接。当与一个URL建立连接时,首先要在一个 URL 对象上通过方法 openConnection()
生成对应的 URLConnection对象。如果连接过程失败,将产生IOException.代码案例如下:
URL netchinaren = new URL (“http://www.atguigu.com/index.shtml”);
URLConnectonn u = netchinaren.openConnection( );
HTTP状态返回码:
200,请求成功;
404,请求失败;
500,服务器错误;
访问方式
– GET:从服务器获取资源到客户端()
– POST:从客户端向服务器发送数据()
– PUT:上传文件
– DELETE:删除文件
– HEAD:报文头部
– OPTIONS:询问支持的方法
– TRACE:追踪路径
– CONNECT:用隧道协议连接代理
代码案例
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class URLTest1 {
public static void main(String[] args) {
HttpURLConnection urlConnection = null;
InputStream is = null;
FileOutputStream fos = null;
try {
URL url = new URL("http://localhost:8080/examples/beauty.jpg");
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.connect();
is = urlConnection.getInputStream();
fos = new FileOutputStream("day10\beauty3.jpg");
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
fos.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 (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (urlConnection != null) {
urlConnection.disconnect();
}
}
}
}
其他
URI、URL和URN的区别
URI,是uniform resource identifier,统一资源标识符
,用来唯一的标识一个资源。而URL是uniform resource locator,统一资源定位符
,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。而URN,uniform resource name,统一资源命名
,是通过名字来标识资源,比如mailto:java-net@java.sun.com。也就是说,URI是以一种抽象的,高层次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式。URL和URN都是一种URI。
在Java的URI中,一个URI实例可以代表绝对的,也可以是相对的,只要它符合URI的语法规则。而URL类则不仅符合语义,还包含了定位该资源的信息,因此它不能是相对的。
最后
以上就是精明台灯为你收集整理的Java网络编程:TCP,UDP,sock编程第一节 网络基础知识InetAddress类第二节 Java UDP编程第三节 Java TCP 编程URL类第四节 Java HTTP 编程其他的全部内容,希望文章能够帮你解决Java网络编程:TCP,UDP,sock编程第一节 网络基础知识InetAddress类第二节 Java UDP编程第三节 Java TCP 编程URL类第四节 Java HTTP 编程其他所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复