【J2SE】网络与Socket

本文详细介绍了网络的基本概念,包括网络定义、IP地址与域名的关系、端口的作用以及TCP和UDP两种主要传输协议的区别。并通过实例展示了UDP和TCP的服务端与客户端实现。
Q:什么是网络?
A:网络本质就是两台设备之间进行数据交换,在计算机网络中设备主要指计算机。

Q:什么是IP地址和域名?
A:由于互联网是由许多能够进行数据交换的计算机互相连接产生的集合,所以如果要向某台计算机发送数据,则必须有个地址以能够找到这台计算机,这个地址就是IP。
   由于IP地址是由4个0-255的数字组成的,不方便记忆,所以有了域名(Domain Name)。实际上域名就是IP地址的名字,如果IP地址是身份证号码,那么域名就是姓名。
   实际上网络中是用IP地址来传输,所以在传输之前,需要把域名解析成IP地址,DNS就是专门用来解析域名的服务器。

Q:什么是端口?
A:为了能够在一台设备上运行多个程序,人们设计了端口(Port),一个设备有65536个端口,一个网络程序可对应一个端口,传输进来的信息流经过端口的分发,不同程序需要的信息传进对应的程序。

Q:TCP和UDP的区别?
A:TCP和UDP都是网络间的传输协议,他们的特点是
   udp: a、是面向无连接, 将数据及源的封装成数据包中,不需要建立建立连接
b、每个数据报的大小在限制64k内
c、因无连接,是不可靠协议
d、不需要建立连接,速度快
   tcp:a、建议连接,形成传输数据的通道.
b、在连接中进行大数据量传输,以字节流方式
c、通过三次握手完成连接,是可靠协议
d、必须建立连接,效率会稍低

1.UDP传输协议

UDP协议传输,是将数据直接按指定地址发送,但是并不验证对方是否接收,所以UDP传输是不可靠传输
1.1UDP服务端
UDPServer.java
public class UDPServer {
	public static void main(String[] args) throws Exception {

		System.out.println("UDP服务端启动。。。");
		
		// 在8080端口监听接收
		DatagramSocket ds = new DatagramSocket(8080);
		
		// 定义1024长度的byte数组
		byte[] buf = new byte[1024];
		
		// DatagramPacket(byte[] buf, int length) 
        	// 构造 DatagramPacket,用来接收长度为 length 的数据包。
		DatagramPacket dp = new DatagramPacket(buf, buf.length);
		
		// 监听8080端口等待接收包,此为阻塞方法
		ds.receive(dp);
		
		// 输出哪台设备发过来的和端口号
		System.out.println("来源:" + dp.getAddress().getHostAddress() + ",端口:" + dp.getPort());
		
		// 将接收到的包new读成String
		String str = new String(dp.getData(), 0, dp.getLength());
		
		// 输出接收到的包
		System.out.println("接收到的数据:" + str);


		// 记得关闭连接
		ds.close();
	}
}
1.2UDP客户端
UDPClient.java
public class UDPClient {
	// 直接执行Client端也不会报错,因为UDP协议不会关心对方是否收到或存在,只要发出去就行了
	public static void main(String[] args) throws Exception {
		
		System.out.println("UDP客户端发送消息");

		// 创建UDP连接
		DatagramSocket ds = new DatagramSocket();

		// 要发送的字符串转成byte数组
		byte[] strByte = "UDP客户端发送的数据!".getBytes();
		
		// DatagramPacket(byte[] buf, int length, InetAddress address, int port)
		// 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
		DatagramPacket dp = new DatagramPacket(strByte, strByte.length, InetAddress.getByName("192.168.1.100"), 8080);
		
		// 执行发送方法
		ds.send(dp);
		
		// 记得关闭连接
		ds.close();

	}
}

2.TCP传输协议

2.1三次握手
在TCP/IP协议中,TCP协议采用三次握手建立一个连接。 
第一次握手:建立连接时,客户端发送SYN包(SYN=J)到服务器,并进入SYN_SEND状态,等待服务器确认; 
第二次握手:服务器收到SYN包,必须确认客户的SYN(ACK=J+1),同时自己也发送一个SYN包(SYN=K),即SYN+ACK包,此时服务器V状态; 
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ACK=K+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据。
2.2四次挥手
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
第一次挥手:客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。
第二次挥手:服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
第三次挥手:服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
第四次挥手:客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。
2.3TCP服务端
TCPServer.java
public class TCPServer {
	public static void main(String[] args) throws Exception {
		System.out.println("TCP服务端启动。。。");
		
		// ServerSocket(int port) 
        // 创建绑定到特定端口的服务器套接字。
		ServerSocket serverSocket = new ServerSocket(8080);
		
		// 开始监听端口准备连接,此为阻塞方法
		Socket socket = serverSocket.accept();
		
		// 拿到IO流
		InputStream inputStream = socket.getInputStream();
		
		// 定义1024长度的byte数组
		byte[] buf = new byte[1024];
		
		// 将读取到的信息缓冲在数组buf中,并返回数组长度
		int len = inputStream.read(buf);
		
		// 将数组buf中的数据读取成字符串
		String str = new String(buf, 0, len);
		
		// 输出str
		System.out.println("接收到的数据:" + str);
		
		// 记得关闭连接
		serverSocket.close();
	}
}
2.4TCP客户端
TCPClient.java
public class TCPClient {
	// 直接执行Client端会报错,因为无法与对方建立连接
	public static void main(String[] args) throws Exception{
		System.out.println("TCP客户端发送消息");
		
		// Socket(InetAddress address, int port) 
        // 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
		Socket socket = new Socket("192.168.1.100", 8080);
		
		// 拿到IO流
		OutputStream outputStream = socket.getOutputStream();
		
		// 要发送的字符串转成byte数组
		byte[] strByte = "TCP客户端发送的数据".getBytes();
		
		// 使用IO流将byte数组写入发送
		outputStream.write(strByte);
		
		// 记得关闭连接
		socket.close();
	}
}
下载方式:https://pan.quark.cn/s/a4b39357ea24 布线问题(分支限界算法)是计算机科学和电子工程领域中一个广为人知的议题,它主要探讨如何在印刷电路板上定位两个节点间最短的连接路径。 在这一议题中,电路板被构建为一个包含 n×m 个方格的矩阵,每个方格能够被界定为可通行或不可通行,其核心任务是定位从初始点到最终点的最短路径。 分支限界算法是处理布线问题的一种常用策略。 该算法回溯法有相似之处,但存在差异,分支限界法仅需获取满足约束条件的一个最优路径,并按照广度优先或最小成本优先的原则来探索解空间树。 树 T 被构建为子集树或排列树,在探索过程中,每个节点仅被赋予一次成为扩展节点的机会,且会一次性生成其全部子节点。 针对布线问题的解决,队列式分支限界法可以被采用。 从起始位置 a 出发,将其设定为首个扩展节点,并将该扩展节点相邻且可通行的方格加入至活跃节点队列中,将这些方格标记为 1,即从起始方格 a 到这些方格的距离为 1。 随后,从活跃节点队列中提取队首节点作为下一个扩展节点,并将当前扩展节点相邻且未标记的方格标记为 2,随后将这些方格存入活跃节点队列。 这一过程将持续进行,直至算法探测到目标方格 b 或活跃节点队列为空。 在实现上述算法时,必须定义一个类 Position 来表征电路板上方格的位置,其成员 row 和 col 分别指示方格所在的行和列。 在方格位置上,布线能够沿右、下、左、上四个方向展开。 这四个方向的移动分别被记为 0、1、2、3。 下述表格中,offset[i].row 和 offset[i].col(i=0,1,2,3)分别提供了沿这四个方向前进 1 步相对于当前方格的相对位移。 在 Java 编程语言中,可以使用二维数组...
源码来自:https://pan.quark.cn/s/a4b39357ea24 在VC++开发过程中,对话框(CDialog)作为典型的用户界面组件,承担着用户进行信息交互的重要角色。 在VS2008SP1的开发环境中,常常需要满足为对话框配置个性化背景图片的需求,以此来优化用户的操作体验。 本案例将系统性地阐述在CDialog框架下如何达成这一功能。 首先,需要在资源设计工具中构建一个新的对话框资源。 具体操作是在Visual Studio平台中,进入资源视图(Resource View)界面,定位到对话框(Dialog)分支,通过右键选择“插入对话框”(Insert Dialog)选项。 完成对话框内控件的布局设计后,对对话框资源进行保存。 随后,将着手进行背景图片的载入工作。 通常有两种主要的技术路径:1. **运用位图控件(CStatic)**:在对话框界面中嵌入一个CStatic控件,并将其属性设置为BST_OWNERDRAW,从而具备自主控制绘制过程的权限。 在对话框的类定义中,需要重写OnPaint()函数,负责调用图片资源并借助CDC对象将其渲染到对话框表面。 此外,必须合理处理WM_CTLCOLORSTATIC消息,确保背景图片的展示不会受到其他界面元素的干扰。 ```cppvoid CMyDialog::OnPaint(){ CPaintDC dc(this); // 生成设备上下文对象 CBitmap bitmap; bitmap.LoadBitmap(IDC_BITMAP_BACKGROUND); // 获取背景图片资源 CDC memDC; memDC.CreateCompatibleDC(&dc); CBitmap* pOldBitmap = m...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值