目录
思维导图
一、网络编程入门
1、网络编程概述
计算机网络:是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
网络编程:在网络通信协议下,实现网络互联的不同计算机上运行的程序间可以进行数据交换
2、网络编程三要素
2.1、IP地址、端口、协议
IP地址:
为了让网络中的计算机能够相互通信,必须为没台计算机指定一个标识号,通过这个标识号来指定接受数据的计算机和识别发送的计算机,IP地址就是标识号,也是设备的标识
端口:
网络的通信,本质上是两个应用程序的通信,每台计算机都有很多的应用程序,在网络通信时,端口号就可以唯一标识设备中的应用程序,也就是应用程序的标识
协议:
通过计算机网络可以使多态计算机实现连接,位于同一网络中的计算机在进行连接和通信时要遵守一定的规则,在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了同一规定,通信双方必须遵守才能完成数据交换,常见的协议有UDP协议和TCP协议。
2.2、IP地址
IP地址:时网络中设备的为一标识,分为IPV4和IPV6两大类
IPV4:给每个连接在网络上的主机分配一个32bit地址,按照TCP/IP规定,IP地址用二进制来表示,每个地址长32bit,也就是4个字节,为了方便使用,IP地址通常写成10进制的形式,中间使用’ .‘分格不同字节(点分十进制表示法)。
IPV6:为扩大地址空间,IPV6采用128 位地址长度,分成8 组16进制数。
2.2.1、常用命令:
ipconfig :查看本机地址
ping IP地址:检查网络是否连通
特殊IP地址
172.0.0.1:是回送地址,可以代表本机地址,一般用来测试使用
2.2.2、InetAddress类
为了方便对IP地址的获取和操作,Java提供了InetAddress供我们使用
InetAddress:此类表示Internet协议地址
常用方法
static InetAddress getByName(String host):确定主机名称的IP地址,主机名可以是机器名称或IP地址
String getHostName():获取此IP地址的主机名
String getHostAdress():返回文本显示中的IP地址字符串
public class Demo2 {
public static void main(String[] args) throws UnknownHostException {
//static InetAddress getByName(String host):确定主机名称的IP地址,主机名可以是机器名称或IP地址
InetAddress address =InetAddress.getByName("LAPTOP-O4PAJK5L");
//String getHostName():获取此IP地址的主机名
String name =address.getHostName();
System.out.println(name);
//String getHostAdress():返回文本显示中的IP地址字符串
String str=address.getHostAddress();
System.out.println(str);
}
}
2.3、端口
端口:设备上应用程序的唯一标识
端口号:用两个字节表示的整数,它的取值范围是0~65535,其中,0~1023之间的端口号用于一写知名的网络服务和应用,普通应用程序需要使用1024以上的端口号,如果端口号被另一个服务或应用占用会导致当前程序启动失败。
2.4、协议
协议:计算机网络中,连接和通信的规则被称为网络通信协议
UDP协议:用户数据报协议(User Datagram Protocol)
面向无连接的的通信协议,传输时发送端和接收端不建立逻辑连接(发出数据前不确认接收端是否存在,接收端接收到数据后也不会返回是否接收到数据),消耗资源小,通信效率高,一般用于音频,视频和普通数据的传输,传输重要数据是不建议使用
TCP协议:传输控制协议(Transmission Protocol)
面向连接的通信协议,传输前发送端和接收端会建立逻辑连接,然后再传输数据。提供了两台计算机之间的可靠无差错的数据传输,在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的船舰都需要经过“三次握手”,可以保证传输数据的安全。
三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接问题
(1)第一次:客户端向服务器端发出连接请求,等待服务器确认
(2)第二次:服务器端向客户端回送一个响应,通知客户端收到了连接请求
(3)第三次:客户端再次向服务器发送确认信息,确认连接
二、UDP协议
UDP协议是一种不可靠的网络协议,他在通信的两端各建立一个Socket对象,但是这两个Socket只是发送、接收数据的对象,因此对于UDP协议的通信双方而言,没有所谓的客户端和服务器的概念。
1、UDP发送数据
发送数据步骤
(1)创建发送端的Socket对象(DatagramSocket)
(2)创建数据,并把数据打包
(3)调用DatagramSocket对象的方法发送数据
(4)关闭发送端
public class Demo2 {
public static void main(String[] args) throws IOException {
//(1)创建发送端的Socket对象(DatagramSocket)
DatagramSocket ds= new DatagramSocket();
//(2)创建数据,并把数据打包
// DatagramPacket(byte[] buf, int length, InetAddress address, int port)
// 构造一个数据包发送长度length的数据包到指定主机上的指定端口号
byte[] bys= "helloworld,你好!".getBytes();//数据包
// 写法一
// int length = bys.length;//长度length
// InetAddress address=InetAddress.getByName("172.20.80.131");//主机
// int port=10086;//端口号
// DatagramPacket dp=new DatagramPacket(bys,length,address,port);
DatagramPacket dp=new DatagramPacket(bys,bys.length,InetAddress.getByName("172.20.80.131"),10086);//写法二
//(3)调用DatagramSocket对象的方法发送数据
ds.send(dp);//发送数据报包
//(4)关闭发送端
ds.close();
}
}
2、UDP接收数据
接收数据的步骤
(1)创建接收端的Socket对象(DatagramSocket)
(2)创建一个数据包,用于接收数据
(3)调用DatagramSocket对象的方法接收数据
(4)解析数据包,并把数据在控制台显示
(5)关闭接收端
public class Demo2 {
public static void main(String[] args) throws IOException {
//(1)创建接收端的Socket对象(DatagramSocket)
//DatagramSocket(int port)指定一个端口
DatagramSocket ds=new DatagramSocket(10086);
//(2)创建一个数据包,用于接收数据
// DatagramPacket(byte[] buf,int length)接收数据包
byte[] bys=new byte[1024] ;
DatagramPacket dp = new DatagramPacket(bys,bys.length);
//(3)调用DatagramSocket对象的方法接收数据
ds.receive(dp);
//(4)解析数据包,并把数据在控制台显示
//byte[] data = dp.getData();//数据缓冲区
//int len =dp.getLength();//实际数据长度
//String dataString = new String(data,0,len);
//System.out.println("数据是:"+dataString);
System.out.println("数据是:"+new String(dp.getData(),0,dp.getLength()));
//(5)关闭接收端
ds.close();
}
}
三、TCP通信程序
1、TCP通信原理
TCP 通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象,从而在通信的两端形成网络虚拟链路。
一旦建立了虚拟网络链路,两端的程序就可以通过虚拟链路进行通信
Java对基于TCP协议的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生io流来进行网络通信。
2、TCP发送数据
发送数据步骤
(1)创建客户端的Socket对象(Socket)
(2)获取输出流,写数据
(3)释放资源
public class Demo2 {
public static void main(String[] args) throws IOException {
//(1)创建客户端的Socket对象(Socket)
//Socket(InetAddress address,int port);
// Socket sc=new Socket(InetAddress.getByName("172.20.80.131"),10086);
//Socket(String host,int port);
Socket sc=new Socket("172.20.80.131",10086);
//(2)获取输出流,写数据
OutputStream os = sc.getOutputStream();
os.write("hello,你好!".getBytes());
//(3)释放资源
sc.close();
}
}
3、TCP接收数据
接收数据的步骤
(1)创建服务器端的Socket对象(ServerSocket)
(2)监听客户端,返回Socket对象
(3)获取输入流,读数据,并把数据显示在控制台
(4)释放资源
public class Demo2 {
public static void main(String[] args) throws IOException {
//(1)创建服务器端的Socket对象(ServerSocket)
ServerSocket ss=new ServerSocket(10086);//指定端口
//(2)监听客户端,返回Socket对象
Socket s=ss.accept();//侦听要连接到此套接字并接受他
//(3)获取输入流,读数据,并把数据显示在控制台
InputStream is=s.getInputStream();
byte[] bys=new byte[1024];
// int len = is.read(bys);
// String data=new String(bys,0,len);
// System.out.println("数据是:"+data);
System.out.println("数据是:"+new String (bys,0,is.read(bys)));
//(4)释放资源
s.close();
ss.close();
}
}
练习
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Client {//客户端
public static void main(String[] args) throws IOException {
//创建客户端
Socket s=new Socket("172.20.80.131",10086);
//获取输出流,写入数据
OutputStream os = s.getOutputStream();
os.write("hello".getBytes());
//接收服务端反馈
InputStream is = s.getInputStream();
byte[] bys=new byte[1024];
System.out.println("客户端:"+new String(bys,0,is.read(bys)));
//释放资源
s.close();
}
}
=======================================================================================
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server{//服务器端
public static void main(String[] args) throws IOException {
//创建服务器端的Socket对象
ServerSocket ss=new ServerSocket(10086);
//监听客户端,返回Socket对象
Socket s=ss.accept();
//获取输入流,读数据,并输出到控制台
InputStream is = s.getInputStream();
byte [] bys=new byte[1024];
System.out.println("服务器:"+new String(bys,0,is.read(bys)));
//给反馈
OutputStream os = s.getOutputStream();
os.write("数据已收到".getBytes());
//释放资源
s.close();
ss.close();
}
}