`
xzc520
  • 浏览: 14871 次
  • 来自: 杭州
社区版块
存档分类
最新评论

套接字socket的基本应用和API

阅读更多
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是在服务端进行关闭。

分享到:
评论

相关推荐

    论文研究-基于TCP套接字的应用研究.pdf

    分析了微软Windows Socket对Berkley套接字的基本扩展,探讨了利用Socket实现网络通信的基本方法及相关函数,研究了采用Socket实现网络通信的若干关键技术和概念。提出了一种基于Delphi中的Socket解决网络通信的具体...

    基于Socket网络通信协议的应用研究

    随着网络通信技术的不断发展,Socket开发和研究已成为... 本文从多个方面介绍了Socket的应用开发、实现环境以及工作流程,并用JAVA开发工具在Windows NT系统上实现网络通讯为例来对Socket套接字做了更加深入的介绍。

    Socket编程.txt

    Socket编程是一种网络编程方式,它通过使用套接字(Socket)这个抽象的概念,允许应用程序在网络上与其他计算机进行通信。Socket编程提供了跨平台的通信能力,使得不同平台上的应用程序能够相互通信。 在Socket编程...

    网络编程课件 Socket编程

    套接字是一组用于编写网络程序的API 常见的套接字有: --Windows平台 WinSock --Unix/Linux socket 套接字类型: --stream socket 面向流的一种套接字。 --datagram socket 面向数据报的一种套接字。 --raw ...

    systemd-socket:用于node.js应用程序的systemd套接字

    您只需告诉您的应用“使用systemd套接字或我的默认套接字”即可。 例子 var http = require('http'); var systemdSocket = require('systemd-socket'); var server = http.createServer(); // set up handlers for...

    应用 Win 套接字发送电子邮件(Delphi源文件)

    Delphi 源文件,应用 API 全代码实现的发送电子邮件源程序,可以向任何邮箱发送信息。

    Windows网络编程技术_套接字选项和IO控制命令(资料+源码)

    第9章 套接字选项和I/O控制命令 2079.1 套接字选项 2079.1.1 SOL_SOCKET选项级别 2089.1.2 SOL_APPLETALK选项级别 2159.1.3 SOL_IRLMP选项级别 2189.1.4 IPPROTO_IP选项级 2229.1.5 IPPROTO_TCP选项级别 2279.1.6 ...

    Python网络编程 Python套接字编程

    Socket又称”套接字”,应用程序通常通过”套接字”向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。 socket()函数 Python 中,我们用 socket()函数来创建套接字,语法格式如下: ...

    c_socket编程入门

    传输层位于这个结构的最底层,当其上面的应用协议层和请求/响应层不能满足应用程序的特殊需要时,就需要使用这一层进行Socket套接字编程。 而在.Net中,System.Net.Sockets 命名空间为需要严密控制网络访问的...

    Windows下基于socket多线程并发通信的实现

    Socket 是建立在传输层协议(主要是TCP 和UDP)上的一种套接字规范,最初由美国加州Berkley 大学提出,为UNIX 系统开发的网络通信接口,它定义了两台计算机之间通信的规范,socket 屏蔽了底层通信软件和具体操作...

    使用VC++的网络编程总结

    1.套接字编程原理 1.1 Client/server 通信模型 1.2 Windows Sockets 规范 1.3 套接字 1.3.1 套接字定义 1.3.2 分类 1.3.3 套接字的作用 1.3.4 端口与地址 1.3.5 套接口属性 2.基本的Windows Sockets API 编程 2.1 ...

    HttpSocketAdaptor:适用于Android的简单Http到原始套接字适配器

    HttpSocketAdaptor 适用于Android的简单Http到原始套接字适配器HTTP套接字适配器是一个小型实用程序,它允许通过任何android网络浏览器与TCP套接字设备进行通信。 它使用localhost上的HTTP服务器接收来自ajax调用的...

    三步学会Java Socket编程

     所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。  以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包中。...

    在C的TCP客户端和服务器套接字的实现

    应用背景服务器的示例代码使用插座。使用套接字客户端代码示例。设置TCP。关键技术Socket API。C为UNIX / Linux的目标。GCC编译器的建议。

    node_oAuth20:此实现的目的是保护没有用户登录的应用程序的任何随机未授权客户端的服务api(Web服务)和套接字api(Web套接字连接)的安全。

    标题带有客户端凭据实现的示例oAuth2.0服务器描述此实现的目的是为了保护没有用户登录名的应用程序从任何随机的未经授权的客户端保护服务api(网络服务)和套接字api(网络套接字连接)。 这里的用例是我们有两个...

    eventsocket:FreeSWITCH事件套接字的扭曲协议

    eventsocket是FreeSWITCH的事件套接字的扭曲协议。 该协议在单个文件类中同时支持事件套接字的入站和出站方法。 它可以用于各种各样的目的。 它的目标是简单和可扩展,并将FreeSWITCH的所有功能导出到基于Twisted的...

    MFC网络编程之自制浏览器

    网络编程,当然要用到Windows Socket(套接字)技术。Socket相关的操作由一系列API函数来完成,比如socket、bind、listen、connect、accept、send、sendto、recv、recvfrom等。调用这些API函数有一定的先后次序,有些...

    Socketify:桌面浏览器上的原始TCP和UDP套接字API

    在上使用本机消息传递API 和 ,我们正在与本机宿主应用程序( )交换消息,因此它将为我们完成所有套接字操作。 入门 去做 本机消息传递主机 Socketify API Chrome扩展程序 Firefox移植 安装指南 API文档 ...

    OkSocket:适用于Android应用程序的阻塞套接字客户端

    Java应用程序或Andorid的阻塞套接字客户端。 Open source licenses Basic Socket Library Socket Server Plugin Library 中文在线文档 为了照顾中国同学的使用,提供了中文的说明文档: : OkEchoServer开源 由于...

Global site tag (gtag.js) - Google Analytics