一、网络编程概述
1、定义
计算机网络
- 指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源的共享和信息传递的计算机系统
网络编程- 用来实现网络互联的不同计算机上运行程序的间 可以进行数据交换。
2、IP地址
- 每个设备在网络中的唯一标识,不可变的,接入网络后就会产生的
- 每台网络终端在网络中都有一个独立的地址,我们在网络中传输数据就是使用这个地址。
- 查看本机IP:cmd 输入ipconfig;
- ping: 测试连接。
- 本地回路地址 :
- IPv4:4个字节组成(32位0~255),4组。IPV4地址大概由42亿个,2011年初已经用尽。
- IPv6:8组,每组4个16进制数。
3、端口号
- 每个程序在设备上的唯一识别标识。
- 每个网络程序都要绑定一个端口号,不同计算机进行网络数据传输时,除了确定要发送到那台机器上(IP:地址)外还需要明确到要发送到那个程序。
- 端口号范围:0~65535 。
- 编写网络应用需要绑定一个端口号,尽量使用1024以上的端口号,因为1024以下的端口号基本都被系统程序占用了。
4、协议- 为计算在网络中进行数据交互而建立的规则、标准或约定的集合。
- 原始网络编程协议
UDP协议:面向无连接,数据不安全 ,但是传输速度快。不区分客户端与服务端。
TCP协议: 面向连接(三次握手),数据安全,速度略低。分为客户端和服务端。其三次握手为:1 客户端向服务端发起连接请求 。 2服务端响应请求。 3客户端发送确认信息。
二、Socket通信
- 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字
- 通信两端都具有Socket套接字。
- 网络通信其实就是Socket之间的通信。
三、UDP传输协议
1、定义
UDP协议User Datagram Protocol的简称,中文名时用户数据包协议。是OSI(Open System Interconnection,[开放式系统互联]) 参考模型中一种无连接的[传输层]协议,提供面向事务的简单不可靠信息传送服务。
2、特点
- UDP是一个无连接协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。
- 由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。
- UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包而言UDP的额外开销很小。
- UDP协议吞吐量不受拥挤控制算法的调节,只受[应用软件]生成数据的速率、传输带宽、源端和终端主机性能的限制。
- UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。
- 虽然UDP是一个不可靠的协议,但它是分发信息的一个理想协议。例如,在屏幕上报告股票市场、显示航空信息等等。UDP也用在[路由信息协议]中修改路由表。在这些应用场合下,如果有一个消息丢失,在几秒之后另一个新的消息就会替换它。UDP广泛用在多媒体应用中。
3、基本使用方法
- 发送Send
- 创建DatagramSocket, 随机端口号
- 创建DatagramPacket, 指定数据, 长度, 地址, 端口
- 使用DatagramSocket发送DatagramPacket
- 关闭DatagramSocket
- 接收Receive
- 创建DatagramSocket, 指定端口号
- 创建DatagramPacket, 指定数组, 长度
- 使用DatagramSocket接收DatagramPacket
- 关闭DatagramSocket
- 从DatagramPacket中获取数据
- 接收方获取ip和端口号
- String ip = packet.getAddress().getHostAddress();
- int port = packet.getPort();
4.代码演示01
- 发送端
public static void main(String[] args) throws Exception {
//确定要发送的内容
String str = "你愿意跟我一起去吃麻辣烫吗?";
//创建发送端Socket 可以ip ,会提供一个随机的
DatagramSocket socket = new DatagramSocket();
//创建装载数据的包 要指明IP地址,端口号,
DatagramPacket packet = new DatagramPacket(str.getBytes(), str.getBytes().length,
InetAddress.getByName("127.0.0.1"), 6666);
//发送数据
socket.send(packet);
//关闭socket
socket.close();
}
- 接收端
public static void main(String[] args) throws Exception {
//创建接收端Socket,必须指定端口,不然接收不到
DatagramSocket socket = new DatagramSocket(6666);
//创建装载数据的包
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
//接收数据, 阻塞方法
socket.receive(packet);
//获取接收到的数据
byte[] bs = packet.getData();
//获取接收到的有效数据的长度
int len = packet.getLength();
System.out.println(new String(bs,0,len));
//获取对方法的端口号
System.out.println(packet.getPort());
//获取对方的ip地址
System.out.println(packet.getAddress());
//关闭socket
socket.close();
}
代码演示02-优化版
public static void main(String[] args) throws Exception {
//从键盘录入数据
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//创建发送端Socket 可以ip ,会提供一个随机的
DatagramSocket socket = new DatagramSocket();
//循环接收数据
while(true){
String str = br.readLine();
//创建装载数据的包 要指明IP地址,端口号,
DatagramPacket packet = new DatagramPacket(str.getBytes(), str.getBytes().length,
InetAddress.getByName("127.0.0.1"), 6666);
//发送数据
socket.send(packet);
if("结束".equals(str)){
break;
}
}
//关闭socket
socket.close();
}
五. TCP协议
-
定义
- 客户端和服务器间的交流, 客户端发送信息,服务器接收到,并返回信息
- 长连接
-
使用步骤
- 客户端
- 创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器
- 调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
- 输入流可以读取服务端输出流写出的数据
- 输出流可以写出数据到服务端的输入流
- 服务端
- 创建ServerSocket(需要指定端口号)
- 调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
- 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
- 输入流可以读取客户端输出流写出的数据
- 输出流可以写出数据到客户端的输入流
- 客户端
-
演示
- 客户端
public static void main(String[] args) throws Exception {
Socket socket = new Socket("127.0.0.1", 6666);
//发送信息
OutputStream stream = socket.getOutputStream();
String str = "我很中意你呀";
stream.write(str.getBytes());
//接收返回的信息
InputStream is = socket.getInputStream();
byte[] bs = new byte[1024];
int len ;
len=is.read(bs);
System.out.println(new String(bs,0,len));
socket.close();
}
服务端
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(6666);
Socket socket = server.accept();
//接收信息
InputStream is = socket.getInputStream();
byte[] bs = new byte[1024];
int len ;
len = is.read(bs);
System.out.println(new String(bs,0,len));
//返回信息
OutputStream stream = socket.getOutputStream();
String str = "哎呀, 知道了";
stream.write(str.getBytes());
socket.close();