热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

网络通信_Java网络通信Socket初探

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java网络通信-Socket初探相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java网络通信-Socket初探相关的知识,希望对你有一定的参考价值。























在互联网时代,我们开发和使用的应用可能都成为网络延伸的一部分,这就要求我们对网络编程知识有些基本的了解。最初作为网络编程语言面世的Java,对网络编程提供了高度的支持。而在网络编程中Socket的使用最为广泛,比如我们熟知的即时通讯软件都使用了Socket相关技术。笔者在参与三剑客接口测试平台(http://sanjianke.corp.qihoo.net/)的开发中因为平台有对外提供服务的需要,解决用户内网与三剑客通信的问题而深挖了该技术,所以今天就给大家简单介绍socket在Java里面的使用和一些注意事项。















Java网络通信-Socket初探










什么是socket? 首先我们知道在网络四层模型中最上面两层分别是应用层和传输层,而我们可以把socket看作是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用。如下图所示:







Java网络通信-Socket初探










建立Socket的三要素: 协议,IP和端口。Java 对使用TCP还是UDP连接做了封装,分别使用Serversocket和DatagramSocket即可。建立一个socket连接的代码调用非常简单,如下分别为服务端和客户端的示例:







Java网络通信-Socket初探





上面的server端代码在执行第一行时就会尝试绑定并监听指定的端口号,如果该端口号已被其它应用使用就会返回错误。执行第二行的accept方法会一直阻塞,直到监听到有新的客户端连接,返回相应的socket句柄。无论是server还是client,在拿到socket句柄之后就可以进行一些读写操作,与操作文件读写类似,如:







Java网络通信-Socket初探










如何监听socket连接的状态? 使用socket对象提供的isConnected()方法获得的值总是true,即使实际上连接已经断开了,所以这个方法不能达到我们的目的。但是我们可以通过发心跳包的方式来监听连接是否正常。Java里面sokect对象可以使用sendUrgentData(int data)方法来发送一个字节的数据(int参数的低八位)。需要注意的是在接收心跳数据的一方(可以是server或者client)需要做如下设置:







Java网络通信-Socket初探





同时需要在接收端对发送过来的心跳数据做处理,一般是直接舍弃或忽略。













如何实现与多客户端之间的通信? 这个其实是用多线程技术能实现,大体的步骤如下:







Java网络通信-Socket初探










使用socket进行UDP通信。 我们知道与稳定可靠的TCP连接不同,UDP是无连接的、不可靠的、无序的,但是速度快。在用socket进行UDP编程时,需要用到两个主要的类: DatagramSocket 和 DatagramPacket, 后者用来创建数据包,大小限制在64K以内。具体可参考以下简单示例:







Java网络通信-Socket初探




Java网络通信-Socket初探










如各位读者所见,在Java中使用Socket通信并不复杂,简单几行代码就能完成连接的建立。但实际应用时我们还有一些值得注意的点,比如输入输出流的关闭,多线程数量和优先级的控制等等。





















Qtest之道



































推荐阅读
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • 本文深入探讨了网络编程中的基本概念,如指针、引用和可重入函数,并详细介绍了OSI七层模型和TCP/IP四层模型的功能与协议。同时,文章还对比了HTTP与HTTPS的区别,分析了HTTP请求报文的结构,讨论了TCP与UDP的主要差异,以及滑动窗口协议的工作原理。 ... [详细]
  • 本文详细记录了作者从7月份的提前批到9、10月份正式批的秋招经历,包括各公司的面试流程、技术问题及HR面的常见问题。通过这次秋招,作者深刻体会到了技术积累和面试准备的重要性。 ... [详细]
  • 本文详细探讨了如何通过分析单个或多个线程在瓶颈情况下的表现,来了解处理器资源的消耗。无论是单进程还是多进程环境,监控关键指标如线程数量、占用时间及调度优先级等,有助于揭示潜在的性能问题。 ... [详细]
  • Symfony是一个功能强大的PHP框架,以其依赖注入(DI)特性著称。许多流行的PHP框架如Drupal和Laravel的核心组件都基于Symfony构建。本文将详细介绍Symfony的安装方法及其基本使用。 ... [详细]
  • ElasticSearch 集群监控与优化
    本文详细介绍了如何有效地监控 ElasticSearch 集群,涵盖了关键性能指标、集群健康状况、统计信息以及内存和垃圾回收的监控方法。 ... [详细]
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • 本文详细介绍了如何在云服务器上配置Nginx、Tomcat、JDK和MySQL。涵盖从下载、安装到配置的完整步骤,帮助读者快速搭建Java Web开发环境。 ... [详细]
  • 优化SQL Server批量数据插入存储过程的实现
    本文介绍了一种改进的SQL Server存储过程,用于生成批量插入语句。该方法不仅提高了性能,还支持单行和多行模式,适用于SQL Server 2005及以上版本。 ... [详细]
  • 一面问题:MySQLRedisKafka线程算法mysql知道哪些存储引擎,它们的区别mysql索引在什么情况下会失效mysql在项目中的优化场景&# ... [详细]
  • 本文详细探讨了虚拟化的基本概念,包括服务器虚拟化、网络虚拟化及其在云计算环境中的应用。特别强调了SDN技术在网络虚拟化和云计算中的关键作用,以及网络虚拟化技术如何提升资源利用效率和管理灵活性。 ... [详细]
  • 本文详细介绍了一种通过MySQL弱口令漏洞在Windows操作系统上获取SYSTEM权限的方法。该方法涉及使用自定义UDF DLL文件来执行任意命令,从而实现对远程服务器的完全控制。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • Python + Pytest 接口自动化测试中 Token 关联登录的实现方法
    本文将深入探讨 Python 和 Pytest 在接口自动化测试中如何实现 Token 关联登录,内容详尽、逻辑清晰,旨在帮助读者掌握这一关键技能。 ... [详细]
  • 本文详细介绍了 phpMyAdmin 的安装与配置方法,适用于多个版本的 phpMyAdmin。通过本教程,您将掌握从下载到部署的完整流程,并了解如何根据不同的环境进行必要的配置调整。 ... [详细]
author-avatar
微博网友_02887414
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有