网络编程概述
计算机网络,是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
网络编程,就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换。
网络编程三要素
1)IP
每个设备在网络中的唯一标识,每台网络终端在网络中都有一个独立的地址,我们在网络中传输数据就是使用这个地址。IPv4:4个字节组成,4个0-255。大概42亿,30亿都在北美,亚洲4亿。2011年初已经用尽。IPv6:8组,每组4个16进制数。
ipconfig:查看本机IP
ping:测试连接
本地回路地址:127.0.0.1 255.255.255.255是广播地址
2)端口号
每个程序在设备上的唯一标识,每个网络程序都需要绑定一个端口号,传输数据的时候除了确定发到哪台机器上,还要明确发到哪个程序。端口号范围从0-65535,编写网络应用就需要绑定一个端口号,尽量使用1024以上的,1024以下的基本上都被系统程序占用了。
3)协议
a)UDP:面向无连接,数据不安全,速度快。不区分客户端与服务端。
b)TCP:面向连接(三次握手),数据安全,速度略低。分为客户端和服务端。三次握手: 客户端先向服务端发起请求, 服务端响应请求, 传输数据。
Socket套接字概述
网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字;通信的两端都有Socket;网络通信其实就是Socket间的通信;数据在两个Socket间通过IO流传输;Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和port。
UDP传输
public class Demo01_Send {
/*
* 发送方
*/
public static void main(String[] args) throws Exception {
//定义要传输的数据
String s = "Hello Word !";
//创建DatagramSocket对象,随机端口号
DatagramSocket ds = new DatagramSocket();
//创建DatagramPacket对象, 指定数据, 长度, 地址, 端口
DatagramPacket dp = new DatagramPacket(s.getBytes(), s.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666);
//发送数据
ds.send(dp);
//关闭DatagramSocket
ds.close();
}
}
class Demo02_Receive {
/*
* 接收方
*/
public static void main(String[] args) throws Exception {
//创建DatagramSocket, 指定端口号
DatagramSocket ds = new DatagramSocket(6666);
//创建DatagramPacket, 指定数组, 长度
DatagramPacket dp = new DatagramPacket(new byte[1024], 1024);
//接收数据
ds.receive(dp);
//获取数据
byte[] arr = dp.getData();
//获取数据长度
int len = dp.getLength();
//打印在控制台
System.out.println(new String(arr, 0, len));
//关闭DatagramSocket对象
ds.close();
}
}
TCP传输
public class Demo06_Clinet {
public static void main(String[] args) throws Exception, IOException {
// 创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器
Socket socket = new Socket("127.0.0.1", 12345);
// 调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
// 写出数据到服务端
os.write((System.currentTimeMillis() + "你在干啥?").getBytes());
byte[] arr = new byte[1024];
// 读取服务端输出的数据
int len = is.read(arr);
System.out.println(new String(arr, 0, len));
socket.close();
}
}
public class Demo07_Server {
public static void main(String[] args) throws IOException {
//创建ServerSocket,并指定端口号
ServerSocket server = new ServerSocket(12345);
// 调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
Socket socket = server.accept();
// 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
byte[] arr = new byte[1024];
// 读取客户端的写出的数据
int len = is.read(arr);
System.out.println(new String(arr, 0, len));
// 写出数据到客户端
os.write((System.currentTimeMillis() + "啥也没干").getBytes());
socket.close();
}
}