【java学习笔记】-- 网络编程

本文介绍了网络通信的基础概念,包括IP地址和网络协议。详细讲解了TCP协议的Socket编程,包括Socket的原理、Java中的实现以及典型步骤。同时对比了TCP和UDP的区别,展示了UDP Socket的简单应用示例。
摘要由CSDN通过智能技术生成

一、网络相关概念

1.1、IP地址

1.1.1、概念

IP地址(Internet Protocol Address)是指互联网协议地址,又称网际协议地址。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。因此,IP地址是逻辑地址,每台主机的网卡上的MAC地址才是物理地址。

1.1.2、组成

32位。由4个8位二进制组成
在这里插入图片描述
8位二进制数的范围是0~255
IP地址 = 网络地址 + 主机地址

  • 网络地址:标识计算机或网络设备所在的网段
  • 主机地址:标识特定主机或网络设备
    在这里插入图片描述
0.0.0.0:本机
127.0.0.1:本机回环地址,用于本机测试
255.255.255.255:当前子网,一般用于向当前子网广播信息

1.1.3、配置和检测

win系统查看本机的IP地址

ipconfig

测试网络是否通畅

ping 目标ip地址

1.2、网络通信协议

DNS:Domain Name System,域名系统

为了在网络中不同的计算机之间进行通信而建立的规则、标准或约定的集合
在这里插入图片描述

二、基于TCP协议的Socket编程

2.1、Socket简介

借鉴的文章
网络通讯的方式有TCP和UDP两种,其中TCP方式的网络通讯是指在通讯的过程中保持连接,有点类似于打电话,只需要拨打一次号码(建立一次网络连接),就可以多次通话(多次传输数据).

在Java语言中,对于TCP方式的网络编程提供了良好的支持,在实际实现时,以java.net.Socket类代表客户端连接,以java.net.ServerSocket类代表服务器端连接。在进行网络编程时,底层网络通讯的细节已经实现了比较高的封装,所以在实际编程时,只需要指定IP地址和端口号码就可以建立连接。正是由于这种高度的封装,一方面简化了Java语言网络编程的难度,另外也使得使用Java语言进行网络编程时无法深入到网络的底层,所以使用Java语言进行网络底层系统编程很困难,具体点说,Java语言无法实现底层的网络嗅探以及获得IP包结构等信息。但是由于Java语言的网络编程比较简单,所以还是获得了广泛的使用。
在这里插入图片描述

  • 通信链路的端点就被称为“套接字”(英文名Socket)
  • 是提供给应用程序的接口

2.2、java.net包

使用Socket需要导入java.net包

  • Socket
  • ServerSocket
  • DatagramPacket
  • DatagramSocket
  • InetAddress
  • ……

2.3、基于TCP协议的Socket网络编程

基于TCP协议的Socket网络编程用来实现双向安全连接网络通信

2.3.1、Socket通信模型

  • 进行网络通信时,Socket需要借助数据流来完成数据的传递工作
    在这里插入图片描述

2.3.2、Socket网络编程步骤

在这里插入图片描述
网络编程模型:客户端/服务器(C/S)

代码示例

public class Server {

	public static void main(String[] args) throws IOException {
		ServerSocket ss = new ServerSocket(10086);
		Socket soc = ss.accept();
		InputStream is = soc.getInputStream();
		BufferedReader br = new BufferedReader(new InputStreamReader(is));

		String str;
		while ((str = br.readLine()) != null) {
			System.out.println("这里是服务器端,接收到的客户端信息为:" + str);
		}

	}

}
-----------------------------------------------------------------------------------------

public class Client {

	public static void main(String[] args) throws IOException {

		// 创建客户端端点
		Socket socket = new Socket("localhost", 10086);

		// 获取输出流将登录信息发送给服务器端
		OutputStream os = socket.getOutputStream();
		
		String str = "用户名和密码";
		byte[] bytes = str.getBytes();
		os.write(bytes);
		
		System.out.println("向服务器发送请求成功");
		
		//关闭输出流
		socket.shutdownOutput();
		
	}
}


三、基于UDP协议的Socket编程

3.1、TCP和UDP对比

TCPUDP
是否连接面向连接面向非连接
传输可靠性可靠不可靠
速度

3.2、步骤

  1. 利用 DatagramPacket 封装数据包
  2. 利用 DatagramSocket 发送数据包
  3. 利用 DatagramSocket 接收数据包
  4. 利用 DatagramPacket 处理数据包
    代码示例
public class Send {

	public static void main(String[] args) {

		DatagramSocket ds = null;
		InetAddress ia = null;
		String mess = "你好,我想咨询一个问题";
		try {
			ia = InetAddress.getByName("localhost");
			DatagramPacket dp = new DatagramPacket(mess.getBytes(), mess.getBytes().length, ia, 8800);
			//创建DatagramSocket对象,向服务器发送数据
			ds = new DatagramSocket();
			ds.send(dp);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			ds.close();
		}
		
	}

}
---------------------------------------------------------------------

public class Receive {

	public static void main(String[] args) {

		DatagramSocket ds = null;

		byte[] buf = new byte[1024];
		DatagramPacket dp = new DatagramPacket(buf, 1024);
		
		try {
			ds = new DatagramSocket(8800);
			ds.receive(dp);
			//显示接收到的信息
			String mess = new String(dp.getData(), 0, dp.getLength());
			System.out.println(dp.getAddress().getHostAddress()+"说:"+mess);
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			ds.close();
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值