什么是网络编程?
在网络通信协议下,不同计算机上运行的程序,进行的数据传输。
常见的软件架构
C/S : 客户端/服务器
B/S : 浏览器/服务器
网络编程三要素
IP、端口号、协议
IP :设备在网络中的地址,是唯一的标识
端口号 :应用程序在设备中的唯一标识
协议 : 数据在网络中的传输规则,常见的协议有 UDP ,TCP , http 等
UDP 通信程序
发送方
- 创建发送方 DatagramSocket 对象
- 数据打包(DatagramPacket)
- 发送数据
- 释放资源
接收方
- 创建接收端的 DatagramSocket 对象
- 接收打包好的数据
- 解析数据包
- 释放资源
UDP 代码示例 (聊天室)
要求:
- UDP发送数据,数据来自键盘录入,直到输入的数据是886, 发送数据结束
- UDP接收数据,因为接收端不知道发送端什么时候停止发送,故采用死循环接受数据
Send代码块:
public class Send {public static void main(String[] args) throws IOException {// 1.创建DatagramSocket发送对象DatagramSocket ds = new DatagramSocket();// 2.打包数据Scanner sc = new Scanner(System.in);while (true) {System.out.println("please input your message");String str = sc.nextLine();if("886".equals(str)){break;}byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("127.0.0.1");int port = 10086;DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);// 3.发送数据ds.send(dp);}// 4.释放资源ds.close();}
}
Receive代码块:
public class Receive {public static void main(String[] args) throws IOException {// 1. 创建 DatagramSocket 对象DatagramSocket ds = new DatagramSocket(10086);// 2. 接受数据包byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);while (true) {ds.receive(dp);// 3. 解析数据包byte[] data = dp.getData();int len = dp.getLength();String ip = dp.getAddress().getHostName();String name = dp.getAddress().getHostAddress();System.out.println("ip 为 :" + ip + "主机名为 : " + name + "的人发送了数据 :" + new String(data, 0, len));}}
}
注意
DatagramSocket
类用于创建用于发送和接收数据报(datagram
)的套接字(socket
)。DatagramSocket
类提供了发送和接收数据报的机制。DatagramPacket
类表示数据报包,它是一个容器,用于保存要发送或接收的数据。数据报包包括数据、目的地址和端口号。
UDP的三种通信方式
- 单播:向指定的IP地址传输数据
- 组播:向一组IP地址传输数据,组播地址:224.0.0.0 - 239.255.255.255
- 广播:广播地址:255.255.255.255
TCP通信协议
TCP通信协议是一种可靠的网络协议,它在通信两端各建立一个Socket对象,通信之前要确保连接已经建立,通过Socket 产生 IO 流 来进行网络通信
客户端
- 创建客户端的Socket对象与指定服务器连接
Socket(String host, int port)
- 获取输出流,写数据
OutputStream getOutputStream()
- 释放资源 void close()
服务器
- 创建服务器端的Socket对象(ServerSocket)
ServerSocket(int port)
- 监听客户端连接,返回一个Socket 对象
Socket accept()
- 获取输出流,读数据,并把数据显示在控制台上
InputStream getInputStream()
- 释放资源
void close()
TCP 代码示例
服务器端(Server):
public class Server {public static void main(String[] args) throws IOException {// TCP 协议 : 接受对象// 1. 创建对象 ServerSocketServerSocket ss = new ServerSocket(50000);// 2. 监听客户端的连接Socket socket = ss.accept();// 3. 从连接通道中获取输入流读取数据InputStream is = socket.getInputStream();// 字节流转化为字符流InputStreamReader isr = new InputStreamReader(is);// 字符流转化为缓冲流BufferedReader br = new BufferedReader(isr);int b;while ((b = br.read()) != -1){System.out.println((char)b);}// 4. 释放资源socket.close();ss.close();}
}
客户端(Client) :
public class Client {public static void main(String[] args) throws IOException {// TCP 协议 :发送数据// 1. 创建 Socket 对象// 细节:在创建对象的同时会连接服务器,如果连不上,则会报错Socket socket = new Socket("127.0.0.1",50000);// 2. 可以从连接通道中获取输出流OutputStream os = socket.getOutputStream();// 写出数据os.write("你好你好".getBytes());// 3. 释放资源os.close();socket.close();}
}