`

套接字socket的基本应用和API

 
阅读更多
转:http://xzc520.iteye.com/blog/780617
java.net.NetworkInterface 提供了访问主机所有接口信息,etho0 lo0
java.net.InetAddress

其它方法参看 java api  文档,掌握这两个类的使用。

 

TCP套接字

Socket  ServerSocket 

一个TCP 连接是一条抽象的双向信道,两端分别由IP地址和端口号确定。与电话相似.

示例:参看源码

客户端

a)       建立一个TCP连接,通过创建Socket实例并指定主机和端口.

b)      通过IO流传传输数据

c)       关闭连接.

服务端

a)        创建一个ServerSocket实例并指定本地端口。

b)       循环 调用accept()方法 ,并通过IO流传输数据

c)        关闭客户端连接。

 

UDP 套接字

DatagramPacket DatagramSocket

IP协议的基础上增加了端口,对数据传输中可能产生的数据错误进行了检测,并抛弃已经损坏的数据。包裹和信件相似.

示例:参看源码

客户端

a)       创建一个DatagramSocket实例,可以选择本地地址和端口号进行设置。

b)      使用DatagramSocket类的send()receive()方法来发送和接收DatagramPacket实例,进行通信。

c)       通信完成关闭.DatagramSocket.close();

服务端

a)       创建一个DatagramSocket实例,指定本地端口,并可以选择指定本地地址,

b)      使用DatagramSocket类的receive()方法来接收一个DatagramPacket实例。

c)       使用send()receive()方法 来与客户端进行通信。

 

数据的发送和接收

编码

        信息编码对于byte int long char  

对于超过一个字节的数据类型,需要知道字节顺序。

字节发送顺序 整数右边开始,由低位到高位发送,little-endian

左边开始,由高位到低位发送big-endian

 

long lnum = 123456787654321L

十六进制 0x0000704885F926B1

 

确定发送顺序

big-endian   0 0 112 72 133 249 38 177

little-endian  177 38 249 133 72 112 0 0

确定是否有符号

对于有符号整型,值以二进制补码`具体关于编码知识,可以参考更多资料。

 

ByteArrayOutputStream

DataOutputStream

writeByte()

wirteShort()

writeInt()

writeLong()

以上的方法将整数以适当大小的二进制补码的形式写到流中。 ]

 

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      

 

 

字符串和文本

在一组符号与一组整数之间的映射称为编码字符集(coded character set)

常用的字符编码

ASCII 将英语字母,数字,标点符号以及一些特殊字符映射成0-127的整数.

Unicode

ISO-8859-1

Utf-8

UTF-16BE

GBKGB2313

BIG5

String  

getBytes() -default charset

getBytes(“UTF-8”)

 

通过先将字符串转换成独立的字节,再将其写到流中的方式,把String写入OutputStream

还要指定编码方式。

 

 

位操作:布尔值编码

 

组合输入输出流

利用BufferdOutputStream OutputStream进行包装,就可以实现缓冲功能,提高效率

还有很多不同的包装类对流进行操作,详细查阅java.io.*API文档。

 

成帧与解析

成帧是用来解决接收端定位消息首尾位置的问题。编码成文本,多字节二进制或是两者结合的信息,应用程序协议必须指定消息接收者如何确定消息已完整接收。

 

DatagramPacket 有指定长度

Tcp套接字没有边界概念,从套接字读取更多字节会出现

接收者阻塞等待 无法处理接收到的消息 一旦接收者在等待响应,则会死锁。

如果信道中还有其它消息,接收者会将后面消息的一部分甚至全部读到第一条消息中去,发生协议错误。

两个方法让接收者准确地找到消息的结束位置

       基于定界符(delimiter-based): 消息的结束由一个唯一标记(unique marker)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               发送者在传输完数据后显示添加一个特殊字节序列,这个特殊字节序列不出现在传输的数据中。消息本身不能包含定界字符,如果需要可以利用填充(stuffing)技术将出现的定界字符进行修改,接收者扫描定界符时,能识别出修改的数据。利用填充技术发送者和接收者都要扫描消息。

 

 

显式长度 explicit length: 在变长字段或消息前附加一个固定大小的字段,用来指示该字段或消息中包含了多少字节。

 

参看源码中以下实现。

Framer 

DelimFramer

LengthFramer

 

构建和解析协议消息

  自定义协议的时候用到一些技术,举一个投票的实例来说明协议的定义过程.

  一个简单投票协议,包括两种请求

查询(inquery)  

  客户端发送投票人ID,服务端返回 候选人ID和给定候选人票数.

投票(voting)

  同上

 

几个用到的类 ,参数源码   

消息类  指定了消息的类结构

VoteMsg 类,消息的结构类。

VoteMsgCoder 接口,用于对消息传输进行编码解码,分别用VoteMsgBinCoder 和 VoteMsgTextCoder 来实现接口,表示二进制编码或文本编码。

VoteService VoteServiceImpl 业务部分

TCPClient  TCPServer 用于信息的发送和接收,需要对信息进行编码和解码,还需要用

到成帧技术。

UDPClient  UDPSesrver

 

 

多任务处理

    迭代服务器 处理完第一个客户请求之后,才会处理其它客户请求。

       一客户端一线程 服务端中,为每个连接都创建一个新的线程来处理。

写一个处理类实现Runnable接口,用于处理客户端请求。

当有客户端连接的时候启动一个处理客户端的线程,并记录下线程的名字。

 

       线程池 当线程数量过大时,系统会花费大量时间来处理上下转换和线程管理,没时间对客户请求进行处理。限制总线程数并重复使用线程可以解决些问题。创建一个固定大小线程组成的线程池。可以利用ExecutorService 

newCachedThreadPool()

       newFixedThreadPool()

       newSingleThreadPool();

       更多用法请参考java并发包的内容。

阻塞和超时 对于read(),accept(),receive()等方法会造成阻塞。

限制客户端访问时间,利用setSoTimeout()等方法来处理阻塞。

 

多接收者---网络提供了复制数据包的工作,而不是发送者,

       单播 一对一的通信方式

       多播 消息只是发送给一个多播地址,网络只是将数据分发给那些表示想要接收发送到该多播地址的数据的主机.只有UDP套接字允许广播和多播. 多播接收者需要加和一个组。

    多播与单播主要区别是地址形式.IPV4  224.0.0.0-239.255.255.255 IPV6 是以FF 开头.

       广播 (本地)网络中的所有主机 都会接收到一份数据副本,广播UDP数据报文和单播的报文相同,不同的是广播的地址不是常规的IP地址.IPV4 255.255.255.255

 

控制默认行为

 Keep-Alive TCP协议提供了一种keep-alive的机制

 发送和接收缓冲区大小 创建一个Socket或者DatagramSocket实例,操作系统就必须为其分配缓存区以存放接收和要发送的数据。

 超时 i/o操作不能立即完成就会阻塞等待,设置最大阻塞时间,一旦超过就抛出异常。

 地址重用 需要对多个套接字绑定到同一个套接字地址,或对于多播同一个主机上有多个应用程序加入了相同的多播组。这样就需要能够与正在使用的地址进行绑定的能力,要用到地址重用,setReuseAddress(true)

消除缓冲延迟时间 缓冲过程中会造成延迟,可以人为关闭。setTcpNoDelay().

紧急数据 可以优先到达接收端的数据。 setUrgentData(int data)….

关闭后停留 通过setSoLinger()方法 在close()的时候阻塞一段时间让缓冲区数据发送完成或者超时进行处理。

广播许可 java默认情况是可以广播的

通信等级 相当于数据在信息传输中具有的等级,至于标记数量和意义是取决于IP协议的版本。

基于性能的协议选择 setPerformancePreferences(int connectionTime,int latency,int bandwidth)

关闭连接 客户端关闭表示通信已经完成,Http是在服务端进行关闭。

分享到:
评论

相关推荐

    套接字Socket编程用主要API

    ### 套接字Socket编程主要API解析 #### 一、引言 在现代网络通信领域,套接字(Socket)编程是一种重要的技术手段,它允许不同计算机之间进行数据交换。本文将详细介绍网络编程中主要使用的Socket API,这些API是网络...

    套接字socket编程文档

    总结,套接字编程是构建网络应用的基础,理解其工作原理和API使用方法对于开发分布式系统、Web服务等至关重要。通过实践和学习,开发者能够熟练掌握这一关键技术,构建高效稳定的网络通信系统。

    MFC 套接字(Socket)文件传输

    "MFC套接字(Socket)文件传输"是利用MFC库中的Socket类进行文件的发送和接收。在这样的应用中,通常分为服务器端和客户端两部分。服务器端会监听特定的端口,等待客户端连接并请求文件;客户端则需要知道服务器的IP...

    网络通信 套接字 socket 代码

    套接字API提供了一组接口,开发者可以通过这些接口创建、配置和管理套接字,实现不同操作系统之间的网络通信。 TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,它保证了数据的有序、无损...

    套接字通信socket

    在标题中提到的"socket(int, int, int)",这是C语言风格的套接字API调用,用于创建一个新的套接字。这个函数通常有三个参数: 1. 第一个参数是协议族(Protocol Family),如AF_INET表示IPv4,AF_INET6表示IPv6。 2...

    UNIX网络编程 卷1:套接字联网API源代码

    这本书深入探讨了如何使用套接字API来实现跨网络的通信,为开发者提供了详尽的理论知识和实践指导。 在UNIX系统中,套接字(Sockets)是进程间通信(IPC)的一种形式,特别适用于网络通信。套接字API提供了一组接口...

    在MQL中操作socket套接字

    - **closesocket()** 和 **WSACleanup()**:在完成所有操作后,使用这两个函数关闭套接字和清理资源。 #### TCP客户端与服务器 - **TCP客户端**的典型步骤如下: 1. 初始化Winsock库 (`WSAStartup()`). 2. 创建...

    Socket 套接字 通信连接

    Socket套接字是计算机...总结,Socket套接字是网络编程的基础,理解和掌握其工作原理及应用对于开发网络应用至关重要。通过实践SocketTest这样的案例,可以更好地理解Socket通信的全过程,从而在实际项目中灵活运用。

    unix网络编程卷1:套接字联网api(第3版)

    2. **套接字API**:书中深入讲解了套接字API的各种函数,如socket()用于创建套接字,bind()将套接字与特定地址绑定,listen()使服务器进入监听状态,connect()和accept()分别用于客户端连接和服务器接受连接,send()...

    java基于UNIX域套接字(unix domain socket)连接redis

    为了优化网络通信,有时我们会选择使用UNIX域套接字(UNIX Domain Socket,简称UDS)来代替传统的TCP/IP套接字进行进程间通信(IPC)。本篇将详细讲解如何在Java环境下,利用UNIX域套接字连接并操作Redis,以及涉及...

    套接字socket

    在操作系统中,套接字提供了发送和接收数据的API,开发者可以通过这些接口来实现网络通信功能。套接字分为流式套接字(SOCK_STREAM,基于TCP)和数据报套接字(SOCK_DGRAM,基于UDP)两种类型。在本例中,我们关注的...

    windows原始套接字抓包

    以上就是关于Windows原始套接字(RAW Socket)的基本介绍,包括其原理、使用方法和网络数据包抓包分析的应用。理解并熟练运用RAW Socket,可以帮助开发者更深入地理解和控制网络通信,实现自定义的网络应用或监控。

    套接字编程之聊天小工具

    本项目“套接字编程之聊天小工具”旨在为初学者提供一个实践平台,通过VC++编译环境,深入理解并掌握套接字编程的基本原理和应用。 首先,我们来探讨套接字的基本概念。套接字是操作系统提供的接口,允许应用程序...

    网络套接字实现服务器返回客户机发送数据

    例如,Python的socket库,提供了简单的API来创建和操作套接字。对于Java,我们可以利用java.net.Socket和java.net.ServerSocket类来实现客户端和服务器的功能。 文件列表中的"NET"可能是指网络相关的代码或资源,...

    UNIX网络编程卷1:套接字联网API(第3版)源代码

    1. **套接字基础**:涵盖套接字的创建、绑定、监听、连接和接受等基本操作。通过源代码,可以了解socket()、bind()、listen()、connect()和accept()等函数的具体用法。 2. **TCP/IP协议栈**:讲解了TCP和UDP这两种...

    简单套接字API使用

    - **Windows 套接字API**:是Windows系统提供的用于开发网络应用程序的一组API函数,它支持TCP/IP协议族,可以实现网络上不同主机之间的数据传输。 #### 示例应用:Delphi中的TServerSocket和TClientSocket 在...

    API_SOCKET.rar_API sock_API. socket_API_SOCKET_api socket_socket

    1. 创建套接字:使用`socket()`函数创建一个新的套接字,指定协议族(如AF_INET表示IPv4,AF_INET6表示IPv6)和套接字类型。 2. 绑定:使用`bind()`函数将套接字与本地IP地址和端口号关联起来。 3. 监听:对于服务器...

    通信套接字socket编程.docx

    总结,TCP和UDP套接字编程是网络通信的基础,Java提供了丰富的API支持这两种协议。TCP适合需要高可靠性的通信场景,如文件传输、网页浏览等;而UDP适用于实时性要求高的场景,如视频流媒体、在线游戏等。理解并熟练...

    基于winsock原始套接字的IP数据包的捕获与解析

    原始套接字(Raw Socket)是Winsock提供的一种套接字类型,允许开发者直接访问网络接口,捕获和发送原始的网络数据包。原始套接字可以用来捕获和解析网络数据包,实现网络嗅探和协议分析等功能。 IP数据包捕获 在...

    套接字socket编程文档.rar_MultiGet-1.1.4_linux_linux socket_linux 编程_soc

    在IT行业中,套接字(Socket)编程是网络通信的核心技术之一,特别是在Unix/Linux系统中。...通过阅读"套接字socket编程文档"和研究MultiGet-1.1.4项目,开发者能深入学习并应用Socket技术,提升自己的编程能力。

Global site tag (gtag.js) - Google Analytics