通信要素一:IP和端口号
IP地址:InetAddress
- 唯一的标识Internet上的计算机(通信实体)
- 本地回环地址(hostAddress):127.0.0.1 主机名(hostname):localhost
- 分类方式一:IPV4和IPV6
- IPV4:4个字节组成,4个0-255。大概42亿,2011年初已用尽。以点分十进制表示,如:192.168.0.1
- IPV6:16个字节表示(128位),写成8个无符号整数,每个整数用四个十六进制位表示,数之间用冒号分开,如:3ffe:3201:1401:1280:c8ff:fe4d:db39:1984
- 分类方式二:
-
公网地址(万维网使用)
-
私有地址(局域网使用)
192.168开头就是私有地址,范围在192.168.0.0~192.168.255.255间。专门为组织机内部使用
-
域名:www.baidu.com
本地回路地址:127.0.0.1【对应localhost】
- 如何实例化InetAddress
- getByName(String host)
- getLocalHost()
- 常用方法:getHostName();getHostAddress()
端口号
标识计算机上运行的进程
- 不同进程有不同端口号
- 被规定为一个16位的整数0~65535
- 端口分类
-
公认端口:0~1023
被预先定义的服务通信占用(如:HTTP占用80,FTP占用21,Telnet占用23
-
注册端口:1024~49151
分配给用户进程或应用程序(如:Tomcat占用8080,MySQL占用3306,Oracle占用1521)
-
动态/私有端口:49152~65535
-
- 端口号与IP地址组合得出一个网络套接字:Socket
通信要素二:网络协议
对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准
通信协议分层思想
在制定协议时,把复杂成分分解成简单成分,再将其复合起来。最常见的是层次方式。同层可通信、上一层可以调用下一层,而与再下一层不发生关系。各层互不影响,利于系统的开发和扩展
传输层协议中有两个非常重要的协议:
传输控制协议TCP(Transmission control Protocol)
用户数据报协议UDP(User Datagram Protocol)
IP(Internet Protocol)协议是网络层的主要协议,支持网间的数据通信
TCP协议
- 使用TCP协议前,须先建立TCP连接,形成传输数据通道
- 传输前,采用“三次握手”方式,点对点通信,是可靠的
- TCP协议进行通信的两个应用进程:客户端、服务的
- 在连接中可进行大数据量的传输
- 传输完毕,需释放已建立的连接,效率低
UDP协议
- 将数据、源、目的封装成数据包,不需要建立连接
- 每个数据报的大小限制在64K内
- 发送不管对方是否准备好,接收方收到也不确认,是不可靠的
- 可以广播发送
- 发送数据结束无需释放资源,开销小,速度快
TCP网络编程
客户端发送文件给服务端,服务端将文件保存到本地
服务器端server:
- 自定义
- Tomcat服务器
ServerSocket ss=new ServerSocket(9090);
Socket socket=ss.accept();
InputStream is=socket.getInputStream();
FileOutputStream fos=new FileOutputStream(new File("2.jpg"));
byte[] buffer=new byte[1024];
int len;
while ((len=is.read(buffer))!=-1){
fos.write(buffer,0,len);
}
//向客户端发出回复
OutputStream os=socket.getOutputStream();
os.write("收到文件".getBytes());
os.close();
fos.close();
is.close();
socket.close();
ss.close();
客户端client:
- 自定义
- 浏览器
Socket socket=new Socket(InetAddress.getByName("127.0.0.1"),9090);
OutputStream os=socket.getOutputStream();
FileInputStream fis=new FileInputStream(new File("1.jpg"));
byte[] buffer=new byte[1024];
int len;
while ((len=fis.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();
fis.close();
os.close();
socket.close();
UDP网络编程
发送端sender:
DatagramSocket socket=new DatagramSocket();
String str=new String("我是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);
socket.close();
接收端receiver:
DatagramSocket socket=new DatagramSocket(9090);
byte[] data=new byte[1024];
DatagramPacket packet=new DatagramPacket(data,0,data.length);
socket.receive(packet);
System.out.println(new String(packet.getData(),0,packet.getLength()));
socket.close();
URL网络编程
URL(Uniform Resource Locator):统一资源定位符,表示Internet上某一资源的地址
-
是一种具体的URI,即URL可以用来标识一个资源,还指明了如何locate这个资源
-
通过URL可以访问Internet上的各种网络资源,比如最常见的www,ftp站点。浏览器通过解析给定的URL可以在网络上查找相应的文件或其他资源
-
基本由5个部分组成
<传输协议>://<主机名>:<端口号>/<文件名>#<片段名>?参数列表
如:http://192.168.1.100:8080/helloworld/index.jsp#a?username=X&password=123456
#片段名:即锚点,例如看小说,直接定位到章节
?参数列表方式:参数名=参数值&参数名=参数值……
URL常用方法:
- public String getProtocol():获取该URL的协议名
- public String getHostl():获取该URL的主机名
- public String getPort():获取该URL的端口名
- public String getPath():获取该URL的文件路径
- public String getFile():获取该URL的文件名
- public String getQuery():获取该URL的查询名