基本概念
套接字:源IP地址和目标IP地址以及源端口号和目标端口号的组合成为套接字。其用于标识客户端请求的服务器和服务
网络编程:通过使用套接字来达到进程间通信目的的编程
IP:在互联网中定位是哪一台主机
port(端口):在某一台主机中唯一表示某个程序,所以在同一台电脑重,端口是不能相同的
进程间的通信:
1.在同一台电脑重,A进程和B进程相互通信
2.在网络中(外网/内网),A电脑中的aa程序和B电脑中的bb程序相互通信(有网络连接)
网络编程的API在java.net包中
网络编程的三要素:IP地址,端口,协议(数据传递/交互的规则)
Socket:此类实现客户端套接字,套接字是两台机器间通信的端点
IP
网络之间互连的协议,在java中使用InetAddress类表示
IP的版本:IPv4,IPv6
IP地址编址方案:将IP空间划分为A、B、C、D、E五类,其中A、B、C是基本类,D、E类作为主播和保留使用
A类:10.0.0.0–10.255.255.255
B类:172.16.0.0–172.31.255.255
C类:192.168.0.0–192.168.255.255
InetAddress.getLocalHost();//返回本机IP
InetAddressgetLocalHost().isReachable(1000);是否可以连接访问,1000毫秒为等待时间
端口
端口可以认为是设备与外界通讯交流的出口。端口可分为虚拟端口和物理端口,其中虚拟端口指计算机内部或交换机路由器内的端口,不可见。
协议
网络协议的简称,是通信计算机双方必须共同遵从的一组约定,如:怎么建立连接,怎么互相识别,只有遵守这个约定,计算机之间才能相互通信交流。它的三要素是:语法、语义、语序
(1)语法:数据与控制信息的结构或格式
(2)语义:需要发出何种控制信息,完成何种动作以及做出何种响应
(3)时序:时间顺序的详细说明
http--超文本传输协议
https--用安全套接字层传送的超文本传输协议
ftp--文件传输协议
mailto--电子邮件地址
file--当地电脑或网上分享的文件
物理层:以太网、调制解调器
数据链路层:DTM、STP
网络层协议:ICMP、IGMP
传输层协议:TCP、UDP
应用层协议:HTTP、SMTP
**URL和URI的区别**
URI:表示统一资源定位的描述符,可以简单理解为:就是一个网络地址,不能进行操作
URL:表示统一资源定位符
网络上的数据的编码和解码操作:
URLEncoder:编码
URLDecoder:解码
String msg="测试string";
String str=URLEncoder.encode(msg,"UTF-8");//编码
msg=URLDecoder.decode(str,"UTF-8");解码
网络编码的两种协议
TCP、UDP
TCP:面向连接(经历三次握手)、传输可靠(保证数据正确性,保证数据顺序)、用于传输大量数据(流模式)、速度慢,建立连接需要开销较多时间和系统资源
UDP:面向非连接、传输不可靠(丢包【数据丢失】)、用于传输少量数据(数据包模式)、速度快
TCP简单程序
服务端
public class Server{
public static void main(String []args) throws Exception
{
String data="这是服务端的响应信息";
ServerSocket server=new ServerSocket(8081);
while(true)
{
Socket client=server.accept();
System.out.println("客户端的端口为"+client.getInetAddress());
PrintStream out=new PrintStream(client.getOutputStream);
out.println(data);
out.close();
}
}
}
客户端
public class Client{
public static void main(String) throws Exception{
Socket client=new Socket("localhost",8081);
Scanner sc=new Scanner(Client.getInputStream);
while(sc.hasNextLine){
String line=sc.nextLine();
System.out.println(line);
}
sc.close();
client.close();
}
}
UDP简单程序
接收端
public class Receive{
//创建接收对象
DatagramSocket receiver=new DatagramSocket(10000);
byte []buffer=new byte[1024];
//接收数据
DatagramPacket dp=new DatagramPacket(buffer,1024);
receiver.receive(dp);
//获取接收数据
String msg=new String(dp.getData(),0,dp.getLength());
System.out.println("发送过来的数据"+msg);
}
}
发送端
public class Send(){
public static void main(String []args) throws Exception{
String data="这是发送到接收端的数据";
//创建发送端对象
DatagramSocket sender = new DatagramSocket(10001);
//发送数据
DatagramPacket dp=new DatagramPacket(data.getBytes(),
data.getBytes().length,//发送数据的长度(字节数)
InetAddress.getLocalHost(),//发送给哪一个IP
10000);//发送给哪一个端口程序
sender.send(dp);
sender.close();
}
}