为了账号安全,请及时绑定邮箱和手机立即绑定

Java网络编程----基础

标签:
Java

1、网络模型

OSI参考模型:应用层 表示层 会话层 传输层 网络层 数据链路层 物理层

TCP/IP参考模型:应用层 传输层 网际层            主机至网络层

OSI七层简述:

物理层:主要定义物理设备标准,如网线接口类型、光纤接口类型、各种传输介质的传输速率等等

。主要作用是传输比特流(将1、0转换为电流强弱)

数据链路层:主要是将从物理层接收到的数据进行MAC地址的封装和解封装。这一层工作的

设备是交换机

网络层:主要将从下层接收到的数据进行ip地址的封装和解封装。这一层的主要设备是路由器。

路由器进行数据包传播方向的定义

传输层:定义了一些传输数据的协议和端口号(TCP/UDP)

会话层:通过传输层建立数据传输的通路

表示层:对接受数据进行解释、加密和解密、压缩和解压缩

应用层:主要对应计算机的应用软件,即终端应用

2、网络通讯要素

IP地址

(1)网络中的设备的标识

(2)不易记忆,可用主机名

(3)本地回环地址:127.0.0.1 主机名:localhost

端口号

(1)用于标识进程的逻辑地址,不同进程的标识

(2)有效端口:0~65535,其中0~1024是系统使用或保留端口

传输协议

(1)通讯规则

(2)常见协议:TCP  UDP

3、TCP与UDP协议的区别

TCP:传输控制协议      打电话、下载数据、

(1)建立连接,形成传输数据通道

(2)在连接中进行大量数据传输

(3)通过三次握手完成连接,是可靠协议(a:哥们你在吗?b:我在。a:好,我知道你在了。)

(4)必须建立连接,效率会稍低


UDP:              对讲机 QQ聊天 在线视频聊天 以速度快为主,不可靠,对方可能不在线

(1)将数据及源和目的封装成数据包,不需要建立连接

(2)每个数据包的大小限制在64k内

(3)因无连接,是不可靠协议

(4)不需要建立连接,速度快

4、什么是socket

Socket(套接字)

(1)Socket就是为网络服务提供的一种机制

(2)通信的两端都有Socket

(3)网络通信其实就是Socket间的通信

(4)数据在两个Socket间通过IO传输

下面使用java进行简单的socket通信,通信协议分为TCP和UDP

java中使用udp进行数据发送,用到的api主要是java.net包下的,代码示例如下:

发送端代码:

import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.Inet6Address;public class UDPSendDemo {	/*	 * 创建UDP传输的发送端。 思路: (1)建立UDP的socket服务 	 * (2)将要发送的数据封装到数据包中	 * (3)通过UDP的socket服务将数据包发送出去 	 * (4)关闭socket服务	 */	public static void main(String[] args) throws IOException {		System.out.println("发送端启动......");		//启动socket服务		DatagramSocket socket = new DatagramSocket();		//需要发送的数据		String str = "你是**?";		byte[] bt = str.getBytes();		//需要发送的数据包,里面封装了数据内容、数据大小、目的地ip地址、目的地应用程序的端口号		DatagramPacket dp = new DatagramPacket(bt, bt.length,Inet6Address.getByName("fe80::c93c:a4cb:e167:cb7e%14"), 10000);		System.out.println(dp.getAddress().getHostAddress());		//发送数据包		socket.send(dp);		//关闭socket服务		socket.close();	}}


接收端代码:

import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;public class UDPReceiveDemo {	/*	 * 建立UDP接收端的思路: 	 * (1)建立UDP socket服务 	 * (2)创建数据包,用于存储接收到的数据,方便用数包对象的方法解析这些数据	 * (3)使用socket服务的receive方法将接收到的数据存储到数据包中	 * (4)通过数据包的方法解析数据包中的数据 (5)关闭资源	 */	public static void main(String[] args) throws IOException {		System.out.println("接收端启动......");		//创建socket服务并设置端口号		DatagramSocket socket = new DatagramSocket(10000);		//创建一个数据包勇于接收数据		byte[] buf = new byte[1024];		DatagramPacket dp = new DatagramPacket(buf, buf.length);		//接收		socket.receive(dp);		//解析出数据包中的内容并打印出来		String text = new String(dp.getData(), 0, dp.getLength());		int port = dp.getPort();		String ip = dp.getAddress().getHostAddress();		System.out.println(ip + ":" + port + "说:" + text);		//关闭socket服务		socket.close();	}}

java中使用udp进行数据发送,用到的api主要是java.net包下的,代码示例如下:

服务端代码:

import java.io.InputStream;import java.net.ServerSocket;import java.net.Socket;public class TCPServerDemo {	/*	 * TCP传输创建服务端: 	 * 1、创建TCP服务端socket服务。使用ServerSocket对象 	 * 2、服务端必须对外提供一个端口,否则客户端无法连接	 * 3、获取链接过来的客户端对象 	 * 4、通过客户端对象获取socket流读取客户端发来的数据,并打印出来 	 * 5、关闭资源(关闭客户端,关闭服务端)	 */	public static void main(String[] args) throws Exception {		//创建服务端socket对象		ServerSocket serverSocket = new ServerSocket(10000);		//得到连进来的客户端的对象		Socket socket = serverSocket.accept();		//获取该客户端对象的输入流,读取客户端发来的数据		InputStream in = socket.getInputStream();		byte[] buf = new byte[1024];		int len = in.read(buf);		String text = new String(buf, 0, len);		System.out.println(socket.getInetAddress().getHostAddress() + "说:" + text);		//关闭资源,注意此处要先关闭客户端		socket.close();		serverSocket.close();	}}

客户端代码:

import java.io.IOException;import java.io.OutputStream;import java.net.Inet6Address;import java.net.InetAddress;import java.net.Socket;import java.net.UnknownHostException;public class TCPClientDemo {	/*	 * TCP传输创建客户端:	 * 1、创建TCP客户端socket服务。使用的是socket对象。建议该对象一创建就明确 目的地。即要连接的主机	 * 2、如果连接建立成功,说明数据传输通道已经建立。该通道就是socket流,是底层建立好的	 * 。既然是流说明这里既有输入又有输出。想要输入或者输出流对象,可以找socket来获取。可以通过	 * getOutputStream()和getInputStream()来获取两个字节流 	 * 3、使用输出流将数据写出	 */	public static void main(String[] args) throws UnknownHostException, IOException {		//创建socket对象,封装目的地ip和端口		Socket socket = new Socket(Inet6Address.getByName("fe80::c93c:a4cb:e167:cb7e%14"), 10000);		//获取该socket对象的输出流,进行数据写入,注意只能是字节流		OutputStream out = socket.getOutputStream();		out.write("你是**?".getBytes());		//关闭资源		socket.close();	}}


点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消