1.网络编程概述
A:计算机网络
* 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
B:网络编程
* 就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换。
2.网络编程三要素之IP概述
- 每个设备在网络中的唯一标识
- 每台网络终端在网络中都有一个独立的地址,我们在网络中传输数据就是使用这个地址。
- ipconfig:查看本机IP192.168.12.42
- ping:测试连接192.168.40.62
- 本地回路地址:127.0.0.1 255.255.255.255是广播地址
- IPv4:4个字节组成,4个0-255。大概42亿,30亿都在北美,亚洲4亿。2011年初已经用尽。
- IPv6:8组,每组4个16进制数。
- 1a2b:0000:aaaa:0000:0000:0000:aabb:1f2f
- 1a2b::aaaa:0000:0000:0000:aabb:1f2f
- 1a2b:0000:aaaa::aabb:1f2f
- 1a2b:0000:aaaa::0000:aabb:1f2f
- 1a2b:0000:aaaa:0000::aabb:1f2f
3.网络编程三要素之端口号概述
- 每个程序在设备上的唯一标识
- 每个网络程序都需要绑定一个端口号,传输数据的时候除了确定发到哪台机器上,还要明确发到哪个程序。
- 端口号范围从0-65535
- 编写网络应用就需要绑定一个端口号,尽量使用1024以上的,1024以下的基本上都被系统程序占用了。
- 常用端口
- mysql: 3306
- oracle: 1521
- web: 80
- tomcat: 8080
- QQ: 4000
- feiQ: 2425
- 查看端口使用情况
- netstat -ano:列出所有端口的情况。
- netstat -aon|findstr “8428”:查看被占用端口对应的PID
- tasklist|findstr “8428”:查看是哪个进程或者程序占用了8428端口
4.网络编程三要素协议
- 为计算机网络中进行数据交换而建立的规则、标准或约定的集合。
- UDP
- 面向无连接,数据不安全,速度快。不区分客户端与服务端。
- TCP
- 面向连接(三次握手),数据安全,速度略低。分为客户端和服务端。
- 三次握手: 客户端先向服务端发起请求, 服务端响应请求, 传输数据
5.Socket通信
- Socket套接字概述:
- 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
- 通信的两端都有Socket。
- 网络通信其实就是Socket间的通信。
- 数据在两个Socket间通过IO流传输。
- Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和port。
6.UDP传输
- 1.发送Send
- 创建DatagramSocket, 随机端口号
- 创建DatagramPacket, 指定数据, 长度, 地址, 端口
- 使用DatagramSocket发送DatagramPacket
- 关闭DatagramSocket
- 2.接收Receive
- 创建DatagramSocket, 指定端口号
- 创建DatagramPacket, 指定数组, 长度
- 使用DatagramSocket接收DatagramPacket
- 关闭DatagramSocket
- 从DatagramPacket中获取数据
- 3.接收方获取ip和端口号
- String ip = packet.getAddress().getHostAddress();
- int port = packet.getPort();
7.InetAddress
- 此类表示互联网协议 (IP) 地址。
- 无构造方法
public class Temp_InetAddress {
/*
* 获取IP地址:
* public static InetAddress getByName(String host)
* 在给定主机名的情况下确定主机的 IP 地址。
* public static InetAddress[] getAllByName(String host)
* 在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。(比如获取www.baidu.com的ip地址数组)
*
* 常用方法:
* public String getHostAddress()
* 返回 IP 地址字符串(以文本表现形式)。
* public String getHostName()
* 获取此 IP 地址的主机名。
*/
public static void main(String[] args) throws UnknownHostException {
InetAddress[] address = InetAddress.getAllByName("www.baidu.com");
for (InetAddress inetAddress : address) {
System.out.println(inetAddress.getHostAddress()+" "+new String(inetAddress.getAddress())+""+inetAddress.getHostName());
}
System.out.println(InetAddress.getLocalHost());
}
}
8.UDP传输优化
- 接收端Receive
DatagramSocket socket = new DatagramSocket(6666); //创建socket相当于创建码头
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024); //创建packet相当于创建集装箱
while(true) {
socket.receive(packet); //接收货物
byte[] arr = packet.getData();
int len = packet.getLength();
String ip = packet.getAddress().getHostAddress();
System.out.println(ip + ":" + new String(arr,0,len));
}
- 发送端Send
DatagramSocket socket = new DatagramSocket(); //创建socket相当于创建码头
Scanner sc = new Scanner(System.in);
while(true) {
String str = sc.nextLine();
if("quit".equals(str))
break;
//创建packet相当于创建集装箱
DatagramPacket packet = new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666);
socket.send(packet); //发货
}
socket.close();
9.UDP传输多线程
public class Temp_udp {
public static void main(String[] args) {
new Server().start();
new Client().start();
}
}
class Client extends Thread{
@Override
public void run() {
try {
DatagramSocket socket = new DatagramSocket();
DatagramPacket packet = null;
Scanner scanner = new Scanner(System.in);
while(true){
String str = scanner.nextLine();
if("quit".equals(str)){
break;
}
packet = new DatagramPacket(str.getBytes(), str.length(),InetAddress.getByName("127.0.0.1"), 4444);
socket.send(packet);
}
socket.close();
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Server extends Thread{
@Override
public void run() {
try {
DatagramSocket socket = new DatagramSocket(4444);
DatagramPacket packet = null;
byte[] bs = null;
while(true){
packet = new DatagramPacket(new byte[100], 100);
socket.receive(packet);
byte[] data = packet.getData();
System.out.print("接受地址"+packet.getAddress()+"(端口号:"+packet.getPort()+")发送来的消息:");
System.out.println(new String(data,0,packet.getLength()));
}
} catch (Exception e) {
}
}
}
10.UDP聊天
11.TCP协议
- 1.客户端
- 创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器
- 调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
- 输入流可以读取服务端输出流写出的数据
- 输出流可以写出数据到服务端的输入流
- 2.服务端
- 创建ServerSocket(需要指定端口号)
- 调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
- 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
- 输入流可以读取客户端输出流写出的数据
- 输出流可以写出数据到客户端的输入流
TCP的实现