java学习笔记017 网络编程

1.网络通信要素
两个问题?
	如何定位到网络上的主机?定位到主机上的应用?
		通信地址
			IP
			端口号
	找到主机后如何可靠高效地进行数据传输?
		网络通信协议
			OSI参考模型			过于理想化而未能广泛推广
			TCP/IP参考模型(TCP/IP协议)	事实上的国际标准

分层
image

2.IP和端口号
IP
	1)唯一标识Internet上的通信实体(计算机)
	
	2)IP地址分类
		IPv4
				4个字节组成,40-255,大概45亿,2011年已用尽,eg:192.168.0.1
		IPv6
				128位,16个字节,写成8个无符号整数,每个数用4个十六进制位表示,数字之间用冒号隔开,eg:ABCD:EF01:2345:6789:ABCD:EF01:2345:6789
			公网地址(万维网使用)
			私有地址(局域网使用)
				192.168开头,192.168.0.0192.168.255.255专门为组织机构内部使用
				
	域名	eg:www.baidu.com
		DNS:域名解析服务器,返回域名对应的ip地址
		先找本机hosts是否有输入的域名地址,没有再通过DNS服务器找
		
		
	java中InetAddress类
		represents an Internet Protocol(IP) address.
		eg:
			InetAddress ip1 = InetAddress.getByName("192.168.0.1");
			InetAddress ip2 = InetAddress.getByName("www.baidu.com");
			
	本地回环地址(hostAddress):127.0.0.1,主机名(hostName):localhost
		InetAddress ip1 = InetAddress.getByName("127.0.0.1");
		InetAddress ip3 = InetAddress.getLocalHost();
		getHostName() / getHostAddress()

端口号
	标识正在计算机上运行的进程
	16位的一个整数,0-65535
	分类
		公认端口
			0~1023,被预先定义的服务通信占用(如HTTP占用80,FTP占用21,Telnet占用23)
		注册端口
			1024~49151,分配给用户进程或应用程序(Tomcat占用8080,MySQL占用3306,Oracle占用1521)
		动态/私有端口
			49152~65535
		
	IP与端口号组合得到一个网络套接字:Socket
			
网络通信协议
	传输层中有两个协议TCP,UDP
		传输控制协议TCP	Transmission Control Protocol
		用户数据报协议UDP	User Datagram Protocol
			
	TCP/IP协议不是两个协议,而是一组协议,TCP和IP是主要的两个
	
	TCP
		建立TCP连接,形成传输数据通道
		传输前,采用“三次握手”方式
		两个应用:客户端、服务端
		可进行大数据量的传输
		传输完毕,释放连接,效率低
		“四次挥手”
		
	UDP
		将数据、源、目的地封装成数据包,不需要建立连接
		每个数据包大小限制在64K以内
		发送无须对方准备好,接收无需确认,不可靠
		可以广播发送
		发送结束时无需释放资源,开销小,速度快
3.java实现TCP网络编程
客户端client
	eg:
		InetAddress ip = InetAddress.getByName("127.0.0.1");
		
		Socket socket = new Socket(ip, 8899);
		OutputStream os = socket.getOutputStream();
		os.write("HelloWorld".getBytes());
		os.close();
		socket.close();
服务端server
	eg:
		ServerSocket ss = new ServerSocket(8899);	//创建服务端的ServerSocket,指明自己的端口号
		Socket socekt = ss.accept();
		InputStream is = socket.getInputStream();
		int len;
		byte[] bs = new byte[20];
		ByteArrayOutputStream() baos = new ByteArrayOutputStream();
		while((len = is.read(bs)) != -1){
			baos.write(bs, 0, len);
		}
		System.out.println(baos.toString());
		baos.close();
		socket.close();
		
客户端发送文件给服务端
	eg:
		client
			InetAddress ip = InetAddress.getByName("127.0.0.1");
		
			Socket socket = new Socket(ip, 8899);
			OutputStream os = socket.getOutputStream();
			//读取文件
			FileInputStream fis = new FileInputStream("filename.txt");
			while...
			socket.shutdownOutput();	//数据传输完成
			
		server
			ServerSocket ss = new ServerSocket(8899);
			Socket socekt = ss.accept();
			InputStream is = socket.getInputStream();
			FileOutputStream fos = new FileOutputStream("filename.txt");
			while...
4.java实现UDP网络编程
DatagramSocket和DatagramPacket
	发送端sender
		eg:
			DatagramSocket socket = new DatagramSocket();
			InetAddress inet = InetAddress.getLocalHost();
			DatagramPacket packet = new DatagramPacket("hello".getBytes(), 0, "hello".length(), inet, 9090);
			socket.send(packet);
			socket.clsoe();
	接收端receiver
		eg:
			DatagramSocket socket = new DatagramSocket(9090);	//指定自身端口号
			byte[] buffer = new byte[20];
			DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
			socket.receive(packet);
			String msg = new String(packet.getData(), 0, packet.getLength());
5.URL
统一资源定位符(uniform resource locator),表示Internet上某一资源的地址
格式,包括五个部分
	<协议>://<主机>:<端口>/<文件>#片段?参数列表
	eg: http://localhost:8080/examples/beauty.jpg?username=hello
eg:	下载文件
	URL url = new URL("http://localhost:8080/examples/beauty.jpg?username=hello");	//java.net.URL
	HttpURLConnection conn = (HttpURLConnection) url.openConnection();
	conn.connect();
	InputStream is = conn.getInputStream();
	...
	conn.disconnect();
posted @   香菇无盐  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示