- 浏览: 1682226 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (335)
- uml (11)
- java (318)
- python (11)
- socket (2)
- ant (1)
- data structures (58)
- algorithms (67)
- concurrency (16)
- multithreading (16)
- mysql (2)
- ubuntu (2)
- c语言 (1)
- lucene (0)
- elasticsearch (0)
- django (1)
- 读书 观点 (2)
- 读书 (4)
- 观点 (4)
- collections (8)
- nio (1)
- io (2)
- 系统集成 (1)
- activemq (2)
- restful (0)
- web service (0)
- HttpClient (1)
- serializable (0)
- annotation (1)
- jdbc (3)
- classloader (0)
- regular expression (1)
- jpa (4)
- jvm (0)
- reflection (1)
- commons-pool2 (2)
- javamail (1)
- velocity (1)
- mathematics (3)
- graph (13)
- LeetCode (159)
- scala (0)
- spring (24)
- maven (5)
- spring batch (1)
- quartz (2)
- IOC (2)
- ORM (3)
- hibernate (2)
- aop (4)
- redis (0)
- zookeeper (0)
- spring mvc (4)
- ELK (1)
- string (1)
- gradle (1)
- mybatis (5)
- docker (0)
- servlet (0)
- log4j2 (1)
- html (0)
- css (0)
最新评论
-
nucleus:
貌似是因为图片的路径是http的缘故:http://dl2.i ...
spring container 实现分析:BeanWrapper -
nucleus:
nucleus 写道BeanWrapper这一块相关的类结构如 ...
spring container 实现分析:BeanWrapper -
nucleus:
BeanWrapper这一块相关的类结构如下图:文中提到的上述 ...
spring container 实现分析:BeanWrapper -
leshy:
inventory.sort(Comparator.compa ...
java8 lambda表达式学习总结 -
Leisurez:
di1984HIT 写道xuexile~hahaha~
activemq的几种基本通信方式总结
最近正好学习了一点用java socket编程的东西。感觉整体的流程虽然不是很繁琐,但是也值得好好总结一下。
Socket
Socket可以说是一种针对网络的抽象,应用通过它可以来针对网络读写数据。就像通过一个文件的file handler就可以都写数据到存储设备上一样。根据TCP协议和UDP协议的不同,在网络编程方面就有面向两个协议的不同socket,一个是面向字节流的一个是面向报文的。
对socket的本身组成倒是比较好理解。既然是应用通过socket通信,肯定就有一个服务器端和一个客户端。所以它必然就包含有一个对应的IP地址。另外,在这个地址上server要提供一系列的服务,于是就需要有一系列对应的窗口来提供服务。所以就有一个对应的端口号(Port)。端口号是一个16位的二进制数字,那么范围就是从(0-65535)。IP地址加端口号基本上就构成了socket。下面这幅图可以描绘出socket和整个TCP/IP之间的关系:
TCP
TCP主要是面向连接的协议,它包含有建立和拆除连接,保证数据流的顺序和正确性等功能。每次对TCP中间的数据操作相当于对一个数据流进行访问。它最典型的特征就是那三次握手的建立连接过程。TCP的连接建立和撤销过程如下图:
Server端
Server端所要做的事情主要是建立一个通信的端点,然后等待客户端发送的请求。典型的处理步骤如下:
1. 构建一个ServerSocket实例,指定本地的端口。这个socket就是用来监听指定端口的连接请求的。
2.重复如下几个步骤:
a. 调用socket的accept()方法来获得下面客户端的连接请求。通过accept()方法返回的socket实例,建立了一个和客户端的新连接。
b.通过这个返回的socket实例获取InputStream和OutputStream,可以通过这两个stream来分别读和写数据。
c.结束的时候调用socket实例的close()方法关闭socket连接。
这个流程的典型示例代码如下:
//1. 构造ServerSocket实例,指定服务端口。 ServerSocket servSock = new ServerSocket(servPort); while(true) { // 2.调用accept方法,建立和客户端的连接 Socket clntSock = servSock.accept(); SocketAddress clientAddress = clntSock.getRemoteSocketAddress(); System.out.println("Handling client at " + clientAddress); // 3. 获取连接的InputStream,OutputStream来进行数据读写 InputStream in = clntSock.getInputStream(); OutputStream out = clntSock.getOutputStream(); while((recvMsgSize = in.read(receiveBuf)) != -1) { out.write(receiveBuf, 0, recvMsgSize); } // 4.操作结束,关闭socket. clntSock.close(); }
Client端
客户端的请求过程稍微有点不一样:
1.构建Socket实例,通过指定的远程服务器地址和端口来建立连接。
2.通过Socket实例包含的InputStream和OutputStream来进行数据的读写。
3.操作结束后调用socket实例的close方法,关闭。
示例代码如下;
// 1.根据指定的server地址和端口,建立socket连接。 Socket socket = new Socket(server, servPort); // 2. 根据socket实例获取InputStream, OutputStream进行数据读写。 InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); out.write(data); //3.操作结束,关闭socket. socket.close();
UDP
UDP和TCP有两个典型的区别,一个就是它不需要建立连接,另外就是它在每次收发的报文都保留了消息的边界。
server端
因为UDP协议不需要建立连接,它的过程如下:
1. 构造DatagramSocket实例,指定本地端口。
2. 通过DatagramSocket实例的receive方法接收DatagramPacket.DatagramPacket中间就包含了通信的内容。
3. 通过DatagramSocket的send和receive方法来收和发DatagramPacket.
典型的交互流程代码如下:
// 1. 构建DatagramSocket实例,指定本地端口。 DatagramSocket socket = new DatagramSocket(servPort); // 2. 构建需要收发的DatagramPacket报文 DatagramPacket packet = new DatagramPacket(new byte[ECHOMAX], ECHOMAX); while(true) { // 3. 收报文 socket.receive(packet); System.out.println("Handling client at " + packet.getAddress().getHostAddress() + " on port " + packet.getPort()); // 4. 发报文 socket.send(packet); packet.setLength(ECHOMAX); }
client端
UDP客户端的步骤也比较简单,主要包括下面3步:
1. 构造DatagramSocket实例。
2.通过DatagramSocket实例的send和receive方法发送DatagramPacket报文。
3.结束后,调用DatagramSocket的close方法关闭。
因为和TCP不同,UDP发送报文的时候可以在同一个本地端口随意发送给不同的服务器,一般不需要在UDP的DatagramSocket的构造函数中指定目的服务器的地址。
另外,UDP客户端还有一个重要的不同就是,TCP客户端发送echo连接消息之后会在调用read方法的时候进入阻塞状态,而UDP这样却不行。因为UDP中间是可以允许报文丢失的。如果报文丢失了,进程一直在阻塞或者挂起的状态,则进程会永远没法往下走了。所以会一般设置一个setSoTimeout方法,指定在多久的时间内没有收到报文就放弃。也可以通过指定一个数字,循环指定的次数来读取报文,读到就返回,否则就放弃。
一个典型的UDP Client代码示例如下:
// 1. 构造UDP DatagramSocket对象 DatagramSocket socket = new DatagramSocket(); // 2。指定timeout时间,防止进入无限等待状态 socket.setSoTimeout(TIMEOUT); // 3. 构造收发的报文对象 DatagramPacket sendPacket = new DatagramPacket(bytesToSend, bytesToSend.length, serverAddress, servPort); DatagramPacket receivePacket = new DatagramPacket(new byte[bytesToSend.length], bytesToSend.length); // 4.指定尝试的次数 int tries = 0; boolean receivedResponse = false; do { socket.send(sendPacket); try { socket.receive(receivePacket); if(!receivePacket.getAddress().equals(serverAddress)) { throw new IOException("Received packet from an unknown source"); } receivedResponse = true; } catch(InterruptedIOException e) { tries += 1; System.out.println("Timed out, " + (MAXTRIES - tries) + ""); } }while((!receivedResponse) && (tries < MAXTRIES)); // 根据是否接收到报文进行反馈 if(receivedResponse) { System.out.println("Received: " + new String(receivePacket.getData())); } else { System.out.println("No response -- giving up."); } // 5. 关闭socket socket.close();
总结
TCP的server和client之间通信就好比两个人打电话,需要互相知道对方的电话号码,然后开始对话。所以在两者的连接过程中间需要指定端口和地址。
UDP的server和client之间的通信就像两个人互相发信。我只需要知道对方的地址,然后就发信过去。对方是否收到我不知道,也不需要专门对口令似的来建立连接。
这些示例其实只是一个最简单的,单线程,也只能一次处理单个请求的情况。在实际应用中一般会应用到多线程和一些处理高并发的策略,比如基于事件驱动的reactor模式等。可以在后续的文章中深入讨论。
参考资料
发表评论
-
spring源代码分析:aop的实现
2018-10-03 23:32 740简介 在之前的文章里我们讨论过一些程序构建Pro ... -
java annotation基础
2018-06-30 16:41 887简介 之前有一篇简短的文章讨论过annotati ... -
spring源代码分析:annotation支持的实现
2018-09-03 23:31 2555简介 在之前的文章里,我们讨论了spring I ... -
spring container 实现分析:BeanFactory and ApplicationContext
2018-06-02 18:29 1473简介 在之前的文章里,我们讨论过作为spring ... -
spring aop: ProxyFactory
2018-04-30 16:45 842简介 在之前的文 ... -
日志与log4j2的配置和应用总结
2018-02-15 15:47 12322简介 通常我们在日常的应用开发中,日志起到一个非 ... -
Java servlet学习总结
2018-01-02 21:14 0简介 应用系统架构的演化(从CS到BS) ... -
spring container 实现分析:BeanWrapper
2018-02-19 18:10 1985简介 在之前的一篇文章里, 我们基于《Exper ... -
spring propertyeditor
2017-10-26 09:17 0pro spring 5 chapter 4, page ... -
spring bean life cycle
2018-02-25 13:30 930简介 在使用spring bean的过程中,有一个 ... -
spring container的设计与实现分析
2017-10-08 21:31 2776简介 在之前的一 ... -
jdbc数据访问的封装和演化
2017-09-16 17:00 2694简介 在使用传统jdbc的方式来访问数据的时候, ... -
Boyer Moore算法分析总结
2017-03-31 18:42 3558简介 在之前的文章里,对于字符串的搜索算法,我曾 ... -
mybatis学习总结:mybatis和spring, spring boot的集成
2017-03-04 18:07 2512简介 在前面的讨论里已经提到了mybatis的各种配置 ... -
mybatis学习总结:annotation与xml结合示例
2017-02-25 21:09 3708简介 在之前的文章里讨论过mybatis纯xml或者 ... -
mybatis学习总结:对象关系映射的xml配置实现
2017-02-19 23:03 4067简介 在之前的文章里已经讨论过mybatis的基本配 ... -
mybatis学习总结:annotation示例改进
2017-01-24 09:06 3445简介 在前一篇文 ... -
mybatis学习总结:基础示例
2017-01-21 23:30 901简介 mybatis是一个比较流行的ORM框架, ... -
gradle学习总结
2016-12-18 21:01 4633简介 Java的自动化构建工具比较多,从最开始的an ... -
String sort的几种方法
2016-10-16 23:07 2191简介 在之前的一 ...
相关推荐
Java TCP/IP Socket编程是网络通信领域中的核心技术,广泛应用于服务器端和客户端之间的数据传输。本资源包含一本关于Java TCP/IP Socket编程的书籍及其配套源代码,对于深入理解Socket编程至关重要。 书籍《Java ...
总结来说,这个实验项目旨在帮助开发者实践TCP和UDP的Socket编程,理解它们在可靠性和效率上的区别,以及在Java中如何利用相关API进行实际的网络通信操作。通过分析和运行这些示例代码,可以深化对网络编程的理解,...
### Java TCP/IP Socket编程 #### 1. 计算机网络、分组报文和协议 计算机网络是指通过通信设备和线路将地理位置分散、功能独立的多个计算机系统互连起来,以功能完善的网络软件(即网络通信协议、信息交换方式及...
以上只是Java TCP/IP Socket编程的一些基本概念和关键点,实际应用中还会涉及到更多高级话题,如SSL/TLS安全套接层、多播Socket、UDP(用户数据报协议)编程等。通过深入学习和实践,你可以掌握构建高效、稳定的网络...
在Java编程环境中,开发网络应用时,可以利用Java的Socket类实现TCP通信,DatagramSocket类实现UDP通信。结合“TCP/UDP网络调试助手”,开发者可以在代码编写和调试阶段,验证程序的正确性和性能,确保网络应用的...
Socket编程是计算机网络通信的核心部分,它为应用程序提供了在不同设备间交换数据的接口。TCP(传输控制协议)和UDP(用户数据报协议)是两种主要的网络传输协议,它们各有特点并适用于不同的应用场景。本项目是一个...
在计算机网络领域,TCP/IP是一组用于互联网数据传输的协议,而Socket编程则是实现这些协议功能...通过上述知识点的介绍,可以了解Java TCP/IP Socket编程的基础和进阶内容,以及如何利用Java语言开发高性能的网络应用。
《Java+TCP/IP+Socket编程++原书第2版》是一部深入探讨Java网络编程的权威著作,主要聚焦于TCP/IP协议栈与Socket编程技术。在Java编程领域,掌握网络通信能力是开发分布式系统、服务器端应用以及实时数据传输等项目...
项目中的"网络作业"可能包含了实现聊天功能的源代码文件,这些文件可能包括服务器端的Socket编程,客户端的连接建立,数据的编码与解码,以及UI组件的事件处理等。在解决压缩程序导致的乱码问题时,附带的PDF文档...
7. **网络编程库**:许多编程语言提供了网络编程库,如Python的socket库,Java的Socket类,可以帮助简化TCP和UDP服务器的实现。 通过分析和实践"TCP/UDP模拟服务端"项目,开发者可以深入理解网络通信的基础,同时...
Java实现的Socket编程是基于TCP/IP协议的,它提供了一个可靠的数据流服务,可以实现客户端和服务器之间的数据交换。Java中的Socket类和ServerSocket类是两种基本的套接字类,Socket类用于建立客户端和服务器之间的...
下面我们将详细探讨TCP和UDP的特点、Java中的Socket编程以及如何进行连接测试。 TCP是一种面向连接的、可靠的传输协议,它确保了数据的完整性和顺序性。在TCP通信中,数据在发送前会建立连接,并且在接收方会按照...
《TCP-IP Sockets in Java, 2nd Edition》作为外文教材,详细介绍了Java Socket编程的各个方面,包括TCP和UDP协议、套接字选项、异步I/O以及高级主题如NIO(非阻塞I/O)和NLPIJ(网络负载平衡和持久性接口)。...
学习和理解这段代码,不仅可以帮助你掌握Socket编程的基本技巧,还能让你深入了解TCP和UDP的工作原理,以及如何在实际场景中应用它们。 总的来说,这个实验提供了丰富的实践机会,涵盖了Socket编程的核心概念,包括...
Java中的TCP和UDP Socket通信是网络编程的基础,用于在不同设备之间建立可靠的数据传输通道。TCP(Transmission Control Protocol)提供的是面向连接、有序且无损的服务,而UDP(User Datagram Protocol)则是无连接...
Java TCPIP Socket编程是Java开发语言在后端服务中实现网络通信的重要技术,它基于Apache等开源库提供了丰富的API来创建高效、可靠的网络连接。本章将深入探讨Socket编程的基本概念和实现方法。 1. 计算机网络、...
Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程语言...
本文将通过一个具体的Java Socket编程实例来深入探讨如何使用Java实现客户端与服务端之间的通信。 #### 二、基础知识概述 在开始具体实例之前,我们需要了解一些基本概念: - **Socket**:Socket是一种用于在网络...