`
vaniice
  • 浏览: 40092 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

socket 实现机制

 
阅读更多

    Socket机制用到的类有java.net.ServerSocket、java.net.Socket等。服务器端以监听端口号和接受队列长度为参数实例化ServerSocket类,缺省的队列长度是50,以accept()方法接收客户的连接。客户端则直接以服务器的地址和监听端口为参数实例化Socket类,连接服务器,缺省的连接方式是stream socket(区别于datagram socket)。
    服务器端和客户端调用getInputStream()和getOutputStream()方法得到输入/输出流。如果以ObjectInputStream和ObjectOutputStream包装Socket的输入/输出流,要注意一点,ObjectOutputStream类实例化时要向底层流写入一个标识码,ObjectInputStream类相应的读入该标识码,如果实例化的次序不当会引起死锁。建议客户服务器两端都先实例化ObjectOutputStream。
    因为调用ServerSocket类的accept()方法和Socket输入流的read()方法时会引起线程阻塞,所以应该用setSoTimeout()方法设置超时,缺省的设置是0,即超时永远不会发生。超时的判断是累计式的,一次设置后,每次调用引起的阻塞时间都从该值中扣除,直至另一次超时设置或有超时异常抛出。比如,某种服务需要三次调用read(),超时设置为1分钟,那么如果某次服务三次read()调用的总时间超过1分钟就会有异常抛出,如果要在同一个Socket上反复进行这种服务,就要在每次服务之前设置一次超时。

你编写的socket处理代码仅存在于表示层。应用层并不需要知道socket如何工作。
什么是socket?

现在我们知道了socket扮演的角色,那么剩下的问题就是:什么是socket?Bruce Eckel在他的《Java编程思想》一书中是这样描述socket的:

socket是一种用于表达两台机器之间连接“终端”的软件抽象。对于一个给定的连接,在每台机器上都有一个socket,你可以想象一个虚拟的"电缆"工作在两台机器之间,“电缆”插在两台机器的socket上。当然,物理硬件和两台机器之间的“电缆”这些连接装置都是未知的,抽象的所有目的就是为了让我们不必了解更多的细节。

简单的说,一台计算机上的socket同另一台计算机通话创建一个通信信道,程序员可以用这个信道在两台机器之间发送数据。当你发送数据时,TCP/IP协议栈的每一层都给你的数据里添加适当的报头。有个好消息是java语言隐藏了所有这些细节,这也是为什么他们有时被叫做“流socket”。
思考一下socket像电话听筒一样在电话的任意一端--你和我通过一个专门的信道来进行通话和接听。会话将一直进行下去直到我们决定挂断电话(除非我们使用蜂窝电话),除非我们挂断电话,否则我们各自的电话线路都会占线。
如果你需要在两台机器之间进行通讯而不使用高级机制像ORBs(以及CORBA, RMI, IIOP等等),socket比较适合你。Socket的底层机制则相当棘手。幸运的是,java平台给我们一些虽然简单但是相当强大的高层抽象以至于我们创建和使用socket更加容易一些。
socket的类型

一般而言,java socket有下面两种类型:

TCP socket(由Socket类实现,下面的章节我们将对其讨论)
UDP socket(由DatagramSocket类实现)

TCP和UDP扮演同样的角色,但是实现是不同的。两者都接收传输协议数据包并把它们传递到表示层。TCP把信息分解成数据包(datagrams)并在接收端重新组装起来。它还对丢失的数据包进行重新传输的请求。TCP减少了上层的担忧。UDP没有组装和重传请求的功能。它只是传输数据包。更高层的层必须确保信息的完整性以及组合顺序的正确性。

一般而言,UDP使你的应用程序更有效率,但只在你的应用程序并不是立即交流大量数据并且不需要组装大量的数据报而完成一条消息的时候。否则TCP才是最简单和最有效的选择。

分享到:
评论

相关推荐

    c# WinForm 使用Socket实现简单实现服务端与客户端连接,实现消息发送,服务器客户端重连

    c# WinForm 使用Socket实现简单实现服务端与客户端连接,实现消息发送,服务器断开后,重启。客户端重连

    Qt实现Socket断线重连机制

    自己写的源码,请拿去用!

    socket实现qq聊天

    内含3个版本 1.0客户端-客户端:最大字节8 2.0客户端-客户端:最大字节1024, 功能与1.0相似,但机制相差很大 3.0客户端-客户端:最大字节1024, 机制与2.0相似,但区别于“点对点”传输。

    应用SOCKET实现网络通信

    介绍了SOCKET编程的基本概念,详细说明了SOCKET编程的一些注意事项,应用SOCKET实现异步通信和组广播技术,列举了应用SOCKET编程过程中的几点想法,对实际应用有较强的指导作用。

    Java Socket 线程实现多客户的机制

    Java Socket 线程 实现多客户请求 机制 Java Socket 线程 实现多客户请求 机制

    vb.net通过socket实现简易多人聊天室(含心跳检测机制)

    语言vb.net (c#可以参考)+winform开发,利用socket进行多个客户端通信实现简易的聊天室,为了保证客户端与服务端连接正常,增加心跳检测机制、客户端定时断开超时未发送心跳包的客户端机制。 界面比较粗糙,仅供学习...

    C# 实现Scoket心跳机制的方法

    主要介绍了C# 实现Scoket心跳机制的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Delphi环境下用Socket实现Web服务器[借鉴].pdf

    Delphi环境下用Socket实现Web服务器是指在Delphi集成开发环境中利用Socket控件来实现Web服务器的功能。该技术可以使得开发者快速构建自己的Web服务器,从而实现信息的发布和共享。 Delphi 环境下用 Socket 实现 ...

    C#socket同步异步机制

    本文详细的总结了 C#.net同步异步SOCKET通讯和多线程,并以问答的形式解释了socket异步的实现机制

    Linux系统下Socket通信的实现.pdf

    Socket通信是Linux系统中的一种常用的通信机制,可以实现点对点的数据传输和多点之间的数据交换。 Linux系统下的Socket通信机制可以分为两类:一是基于TCP的可靠连接式Socket通信,另一是基于UDP的不可靠连接式...

    C#之实现Scoket心跳机制

    C#高级编程之实现Socket心跳机制,TCP网络长连接。 心跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着。事实上这是为了保持长连接,至于这个包的内容,是没有什么...

    java socket客户端断线重连

    java socket client 断线重连的简单实现 有什么意见可以提哦

    Java Socket编程实现的简单多线程WEB服务器

    Socket 是一种 IPC(Inter-Process Communication,进程间通信)机制,用于在不同的进程之间进行数据交换。 ServerSocket 和 Socket 在 Java 中,有两个关键的类用于实现 Socket 编程:ServerSocket 和 Socket。...

    Android基于Socket实现聊天功能

    一个简单的Android项目 基于Socket聊天 简单的实现了下 界面等是很美观 但是代码简单 方便 一看即懂 适合初学Socket机制的童鞋 大神切莫下载 不想找喷 注意:接收Button点击后可以接收服务器键盘输出的数据 但是...

    C语言利用socket套接字实现客户端和服务器端TCP通信实例

    C语言利用socket套接字实现客户端和服务器端TCP通信实例代码。C语言利用socket套接字实现客户端和服务器端TCP通信实例代码。

    Android socket实现原理详解 服务端和客户端如何搭建

    socket实现的原理机制: 1、通信的两端都有Socket 2、网络通信其实就是Socket间的通信 3、数据在两个Socket间通过IO传输 建立Socket(客户端)和ServerSocket(服务器端) 建立连接后,通过Socket中的IO流进行数据的...

    socket 编程 实现互聊

    对于socket初学者来说 通过这个案例 可以帮助 初学者 形象了解掌握 socket通信机制。

    广工_计算机网络课程设计_端口扫描器的设计与实现_代码和报告.zip

    1.利用Socket通信机制实现一个多线程的端口扫描器。 2.设计要求: 2.1用户界面:用户可以输入IP地址或IP地址段;输入端口号或端口号范围;列表显示主机名、开放的端口及开放端口上相应的服务名称。 2.2端口的...

    利用流式Socket编程实现Windows与Linux的通信.pdf

    利用流式Socket编程实现Windows与Linux的通信.pdf 本文档主要介绍了如何利用流式Socket编程实现Windows与Linux之间的网络通信。流式Socket是一种通过标准的UNIX文件描述符和其他程序通讯的一种方法,提供可靠的、...

    使用C_C++实现Socket聊天程序

    客户端和服务器端之间的通信是通过Socket实现的。 10. Winsock库的使用 在该程序中,使用了Winsock库来实现Socket编程。Winsock库提供了一个平台独立的Socket编程接口,使得开发者可以在不同的操作系统上实现...

Global site tag (gtag.js) - Google Analytics