网络编程

本文深入探讨网络通信原理,包括IP地址、DNS解析、TCP/IP协议等核心概念,同时详解Socket编程,涵盖TCP和UDP协议下的客户端与服务器通信流程及代码实现。

网络的相关概念

网络通信-IP

IP地址(Internet Protocol):唯一标识网络上的每一台计算机

IP地址的组成:32位,由4个8位二进制数组成

在这里插入图片描述

二进制变成十进制方法:位数数值乘以2的位数次方,最大到255

IP地址 = 网络地址 +主机地址

网络地址:标识计算机或网络设备所在的网段

主机地址:标识特定主机或网络设备

IP地址的配置和检测:

  • 查看IP地址,检测网络是否畅通

  • 查看本机的IP地址:ipconfig

  • 测试网络是否通畅:ping (再加上)目标IP地址

【1. 开始里面直接输入cmd;2. 打开dos系统;3. 输入代码】

DNS域名解析:Domain Name System,域名系统

为了好访问,好记忆。通过DNS

网络服务器:

通常指在网络环境下,具有较高计算能力,能够提供用户服务功能的计算机

B/S:浏览器服务器端的服务程序【好处:服务器端自己升级就行了】

C/S:客户端服务器端的服务程序

网络通信协议:

为在网络中不同的计算机之间进行通信而建立的规则、标准或约定的集合

【数据在网络中传输是很复杂的】

HTTP协议:超文本传输协议,互联网应用最广泛的。

FTP协议:文件传输协议。

SMTP协议:简单邮件传输协议。

TCP协议(Transmission Control Protocol 传输控制协议):面向连接的、可靠的、基于字节流的传输通信协议。

UDP协议(User Datagram Protocol 用户数据报协议):无连接的协议,在传输数据之前,客户端和服务器并不建立和维护连接,效率很快。

Socket:

通信链路的端点就被称为“套接字”(英文名Socket);是提供给应用程序的接口
在这里插入图片描述
【Socket的底层机制复杂,Java平台提供了一些简单的API,可以更简单有效的使用Socket开发而无需了解底层机制】

Socket分类
  • 流式套接字(SOCK_ STREAM)【面向连接、可靠的数据传输服务(对应服务是TCP链接)】
  • 数据报式套接字(SOCK_ DGRAM)【无连接服务(数据报似的,基于UDP)更高效】
    原始式套接字(SOCK_ RAW)

java.net包:

Socket

ServerSocket

DatagramPacket

DatagramSocket

InetAddress

……

网络通信/传输协议

  • 网络通信协议
    为在网络种不同的计算机之间进行通信而建立的规则、标准或与约定的集合
  • TCP协议
    面向连接的、可靠的、基于字节流的传输通信协议
  • UDP协议
    无连接的协议,在传输数据之前,客户端和服务器并不建立和维护连接

Socket编程

套接字使用TCP提供了两台计算机之间的通信协议。客户端创建一个套接字,并尝试连接服务器的套接字。

当连接建立时,服务器会创建有个Socket对象。客户端和服务器就可以通过对Socket对象的写入和读取来进行通信。

java.net.Socket类代表了一个套接字,并且java.net.ServerSocket类为服务器提供了一种监听客户端,并与他们建立连接的机制。

两台计算机之间使用套接字建立TCP连接的步骤如下:

1.服务器实例化一个ServerSocket对象,表示通过服务器上的端口通信;
2.服务器调用ServerSocket类的accept()方法一直等待,直到客户端连接到服务器上给定的端口;
3.服务器等待客户端实例化一个Socket对象,指定服务器名称和端口号来请求连接;
4.Socket类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个Socket对象与服务器进行通信;在服务器端,accept()方法返回服务器上一个新的socket引用,该socket连接到客户端的socket。
5. 连接建立后,通过使用I/O流进行通信,每一个socket都有一个输入流和一个输出流,客户端的输出流连接到服务器端的输入流,而客户端的输入流连接到服务器端的输出流。

客户端

public class LogicServicer {
	public static void main(String[] args) {
		try {
			//接收客户端请求
			//创建一个Socket
			ServerSocket serverSocket = new ServerSocket(5000);
			//使用accept()侦听并接收到此ServerSocket的连接
			Socket socket = serverSocket.accept();//侦听到之前都是阻塞的
			//获得输入流,获得用户的请求
			//数据流输入
			InputStream is = socket.getInputStream();
			// BufferedReader读取字符流
			BufferedReader br = new BufferedReader(new InputStreamReader(is));
			String info;
			// BufferedReader的方法可以一行一行的读
			while((info = br.readLine())!=null){
				System.out.println("客户端:"+info);
			}
			//给客户端一个响应
			String reply = "欢迎登陆";
			//通过输出流将响应发送回给客户端
			OutputStream os = socket.getOutputStream();
			os.write(reply.getBytes());	
			//释放相应资源
			os.close();
			br.close();
			is.close();
			socket.close();
			serverSocket.close();
		} catch (IOException e) {
			e.printStackTrace();
		} } }

服务端

public class LogicClient {
	public static void main(String[] args) {
		//创建一个客户端的Socket
		try {
			Socket socket = new Socket("localhost",5000);
			//通过输出流发送请求
			//直接输出数据流
			String info = "用户名:樱桃小丸子;密码:123456";
			OutputStream os = socket.getOutputStream();
			//打散成数据数组
			byte[] infos = info.getBytes();
			os.write(infos);
			//关闭输出流,这是一个半关闭
			socket.shutdownOutput();
			//通过输入流接收服务器给我的响应
			InputStream is = socket.getInputStream();
			BufferedReader br = new BufferedReader(new InputStreamReader(is));
			String reply;
			while((reply = br.readLine())!=null){
				System.out.println("服务器:"+reply);
			}
			//释放资源
			os.close();
			socket.close();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} } }

基于UDP协议的Socket网络编程步骤

利用 DatagramPacket 对象封装数据报
利用 DatagramSocket 发送数据报
利用 DatagramSocket 接收数据报
利用 DatagramPacket 处理数据报
DatagramPacket类

封装了数据报的数据、数据长度、目标地址和目标端口

DatagramSocket类

接收和发送DatagramPacket对象封装好的数据报

【两个类都在java.net包里】

例子:

礼物—数据(字符串)

包裹—DatagramPacket

快递点—DatagramSocket

寄礼物—send()

收礼物—receive()

public class LogicServicer {
	public static void main(String[] args) {	
		byte[] infos = new byte[1024];
		DatagramPacket dp = new DatagramPacket(infos,infos.length);
		//快递点
		DatagramSocket socket=null;
		try {
			socket = new DatagramSocket(5000);
			//在快递点取礼物
			socket.receive(dp);
			//拆礼物
			String info = new String(dp.getData(),0,dp.getData().length);
			System.out.println("客户端说:"+info);	
			//给客户端一个响应
			String reply ="一件羽绒服";
			byte[] reply2 = reply.getBytes();
			//客户端地址
			SocketAddress sa = dp.getSocketAddress();
			//打开一个包裹
			DatagramPacket dp1 = new DatagramPacket(reply2,reply2.length,sa);
			//寄出去
			socket.send(dp1);	
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			socket.close();
		} } }

基于UDP的Socket通信,客户端:

public class LogicClient {
	public static void main(String[] args) {
		//买礼物
		String info="心形巧克力!";
		byte[] infos = info.getBytes();
		//对方地址和邮编(端口号)
		InetAddress ia;
		//快递点
		DatagramSocket socket = null; 
		try {
			ia = InetAddress.getByName("localhost");
			//包裹包装礼物
			DatagramPacket dp = new DatagramPacket(infos, infos.length, ia, 5000);
			socket = new DatagramSocket();
			//通过快递点往外寄出礼物
			try {
				socket.send(dp);
			} catch (IOException e) {
				e.printStackTrace();
			}
			//接收服务器的响应
			byte[] replys = new byte[1024];
			DatagramPacket dp1 = new DatagramPacket(replys,replys.length);
			socket.receive(dp1);
			String reply = new String(dp1.getData(),0,dp.getData().length);
			System.out.println("服务器的响应:"+reply);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			socket.close();
		} } }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值