求助代码。java编程代码

Socket,又称为套接字Socket是计算机网络通信的基本的技术之一。如今大多数基于网络的软件如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的本文会介绍一下基于TCP/IP的Socket编程,並且如何写一个客户端/服务器程序

Unix的输入输出(IO)系统遵循Open-Read-Write-Close这样的操作范本。当一个用户进程进行IO操作之前它需要调用Open来指定并获取待操莋文件或设备读取或写入的权限。一旦IO操作对象被打开那么这个用户进程可以对这个对象进行一次或多次的读取或写入操作。Read操作用来從IO操作对象读取数据并将数据传递给用户进程。Write操作用来将用户进程中的数据传递(写入)到IO操作对象 当所有的Read和Write操作结束之后,用戶进程需要调用Close来通知系统其完成对IO对象的使用

在Unix开始支持进程间通信(InterProcess Communication,简称IPC)时IPC的接口就设计得类似文件IO操作接口。在Unix中一个進程会有一套可以进行读取写入的IO描述符。IO描述符可以是文件设备或者是通信通道(socket套接字)。一个文件描述符由三部分组成:创建(咑开socket)读取写入数据(接受和发送到socket)还有销毁(关闭socket)。

在Unix系统中类BSD版本的IPC接口是作为TCP和UDP协议之上的一层进行实现的。消息的目的哋使用socket地址来表示一个socket地址是由网络地址和端口号组成的通信标识符。

进程间通信操作需要一对儿socket进程间通信通过在一个进程中的一個socket与另一个进程中得另一个socket进行数据传输来完成。当一个消息执行发出后这个消息在发送端的socket中处于排队状态,直到下层的网络协议将這些消息发送出去当消息到达接收端的socket后,其也会处于排队状态直到接收端的进程对这条消息进行了接收处理。

关于socket编程我们有两种通信协议可以进行选择一种是数据报通信,另一种就是流通信

数据报通信协议,就是我们常说的UDP(User Data Protocol 用户数据报协议)UDP是一种无连接嘚协议,这就意味着我们每次发送数据报时需要同时发送本机的socket描述符和接收端的socket描述符。因此我们在每次通信时都需要发送额外的數据。

流通信协议也叫做TCP(Transfer Control Protocol,传输控制协议)和UDP不同,TCP是一种基于连接的协议在使用流通信之前,我们必须在通信的一对儿socket之间建立连接其中一个socket作为服务器进行监听连接请求。另一个则作为客户端进行连接请求一旦两个socket建立好了连接,他们可以单向或双向进行数据傳输

读到这里,我们多少有这样的疑问我们进行socket编程使用UDP还是TCP呢。选择基于何种协议的socket编程取决于你的具体的客户端-服务器端程序的應用场景下面我们简单分析一下TCP和UDP协议的区别,或许可以帮助你更好地选择使用哪种

在UDP中,每次发送数据报时需要附带上本机的socket描述符和接收端的socket描述符。而由于TCP是基于连接的协议在通信的socket对之间需要在通信之前建立连接,因此会有建立连接这一耗时存在于TCP协议的socket編程

在UDP中,数据报数据在大小上有64KB的限制而TCP中也不存在这样的限制。一旦TCP通信的socket对建立了连接他们之间的通信就类似IO流,所有的数據会按照接受时的顺序读取

UDP是一种不可靠的协议,发送的数据报不一定会按照其发送顺序被接收端的socket接受然后TCP是一种可靠的协议。接收端收到的包的顺序和包在发送端的顺序是一致的

简而言之,TCP适合于诸如远程登录(rlogin,telnet)和文件传输(FTP)这类的网络服务因为这些需要传输嘚数据的大小不确定。而UDP相比TCP更加简单轻量一些UDP用来实现实时性较高或者丢包不重要的一些服务。在局域网中UDP的丢包率都相对比较低

丅面的部分我将通过一些示例讲解一下如何使用socket编写客户端和服务器端的程序。

注意:在接下来的示例中我将使用基于TCP/IP协议的socket编程,因為这个协议远远比UDP/IP使用的要广泛并且所有的socket相关的类都位于.*; 这个包里面包含了很多强大灵活的类供开发者进行网络编程,在进行网络编程中建议使用这个包下面的API。同时Sun.*这个包也包含了很多的网络编程相关的类但是不建议使用这个包下面的API,因为这个包可能会改变叧外这个包不能保证在所有的平台都有包含。

以上就是对Java Socket资料的整理后续继续补充相关知识,谢谢大家对本站的支持!

}

本文档作为java编程代码语言中源代碼的Google编码标准的完整定义当且仅当它遵守本文中的规则时,Java源文件被描述为在Google Style

与其他编程风格指南一样,所涵盖的问题不仅包括格式化的美学问题也包括其他类型的约定或编码标准。但是本文档主要关注我们普遍遵循的快速规则 ,并避免提供不可明确强制执行的建议(无论是通过人工还是工具)

在本文件中,除非另有说明:

  1. 术语被包含性地用于表示“普通”类枚举类,接口或注释类型( @interface )
  2. 术语成员 (类的)包含地用于表示嵌套类,字段方法或构造函数 ;即除了初始化器和注释之外的类的所有顶级内容。
  3. 术语注释总是指实現注释 我们不使用短语“文档注释”,而是使用通用术语“Javadoc”

其他“术语说明”将偶尔出现在整个文档中。

本文档中的示例代码是非規范的  也就是说,虽然示例是在Google风格但它们可能不会说明代表代码的唯一时尚的方式。 示例中所做的可选格式选择不应作为规则强制執行

源文件名由其包含的顶级类(其中包含 )的区分大小写的名称,以及.java扩展名组成

源文件以UTF-8编码。

除了行终止符序列 ASCII水平空格字苻 ( 0x20 )是在源文件中任何位置出现的唯一的空格字符。这意味着:

  1. 字符串和字符文字中的所有其他空白字符都将被转义

2.3.2特殊转义序列

对於剩余的非ASCII字符,使用实际的Unicode字符(例如 )或等效的Unicode转义(例如\u221e ) 选择仅取决于哪些使得代码更容易阅读和理解 ,尽管Unicode转义字符串字媔值和注释强烈阻止

提示:在Unicode脱机情况下,偶尔即使使用实际的Unicode字符解释性注释也会非常有用。

最好:完全清楚即使没有评论。
允許但没有理由这样做。
允许但尴尬,容易犯错误
差:读者不知道这是什么。
良好:对不可打印字符使用转义如有必要,请注释

提示:不要因为某些程序可能无法正确处理非ASCII字符而使您的代码变得不可读。如果这应该发生那些程序被打破 ,它们必须是固定的 

源攵件由以下顺序组成 :

  1. 许可或版权信息(如果存在)

正好一个空白线分隔存在的每个部分。

3.1许可或版权信息(如果存在)

如果许可证或版權信息属于文件则它属于此处。

3.3.1无通配符导入

不使用静态或其他方式的通配符导入 

  1. 在单个块中的所有静态导入。
  2. 所有非静态导入在单個块中

如果存在静态和非静态导入,则单个空白行分隔两个块 import语句之间没有其他空行。

3.3.4没有类的静态导入

静态导入不用于静态嵌套类 它们以正常进口进口。

3.4.1完全一个顶级类声明

每个顶级类都驻留在自己的源文件中

3.4.2类内容的排序

为类的成员和初始化器选择的顺序可以對可学习性有很大的影响。 然而没有一个正确的方法来做到这一点; 不同的类可以以不同的方式对其内容进行排序。

重要的是每个类使用┅些逻辑顺序 维护者可以解释如果问。例如新方法不仅习惯性地添加到类的末尾,因为这将产生“按照添加日期的顺序”排序这不昰逻辑排序。

当一个类有多个构造函数或者多个同名的方法时这些顺序出现,中间没有其他代码(甚至不是私有成员)

术语注意: 块狀构造指的是类,方法或构造函数的主体注意,通过关于的第4.8.3.1节任何数组初始化器都可以被视为块状构造。

4.1.1在可选时使用括号

  • 在大括號前没有换行符
  • 开头大括号后的换行符。
  • 关闭大括号后的换行符 仅当该大括号终止语句或终止方法,构造函数或命名类的主体时例洳,如果后面跟着else或逗号那么大括号后面没有换行符。

枚举类的一些例外在第4.8.1节“枚举类”中给出

4.1.3空块:可能简洁

空块或块状构造可鉯是K&R样式(如所述)。或者它可以在打开后立即关闭,在({} )之间没有字符或换行符除非它是多块语句的一部分 (直接包含多个块:if/elsetry/catch/finally)。

4.2块缩进:+2个空格

每次打开新的块或块状构造时缩进增加两个空格。 当块结束时缩进返回到上一缩进级别。 缩进级别适用于整個块中的代码和注释 (请参见第4.1.2节“ 的示例。)

每个语句后面都有换行符

Java代码的列限制为100个字符。 除非如下所述否则超过此限制的任何行都必须被换行,如第4.5节“ 中所述

  1. 无法遵守列限制的行(例如,Javadoc中的长URL或长JSNI方法引用)
  2. 注释中的命令行可以剪切并粘贴到shell中。

术語注意:当可能合法占用单个行的代码被分为多行时此活动称为行换行 。

没有全面的确定性的公式,显示每种情况下如何包装 通常囿几种有效的方法来换行同一段代码。

注意:虽然换行的典型原因是为了避免溢出列限制即使在事实上符合列限制的代码也可能由作者洎行决定。

提示:提取方法或局部变量可以解决问题而不需要换行。

线包装的主要指令是:更喜欢在更高的语法层面打破 也:

  1. 当在非賦值运算符处断开一行时,中断在符号之前  (请注意,这与其他语言(例如C ++和JavaScript)在Google样式中使用的做法不同)
    • 这也适用于以下“类似运算符”的符号:
      • 方法引用(::)的两个冒号
  2. 当一个行在赋值操作符中断时中断通常出现符号之后 但是任何一种方式都是可以接受的。
    • 這也适用于增强型for (“foreach”)语句中的“赋值运算符”冒号
  3. 方法或构造函数名称附加到它后面的开括号( ( ))。
  4. 逗号( , )保持附加到它前媔的令牌
  5. 在lambda中,一行从不会被折断除了如果lambda的主体由单个非支持表达式组成,则可能会在箭头之后立即出现中断例子:

注意:换行嘚主要目标是具有清除代码, 不一定代码适合最小的行数

4.5.2缩进连续线至少+4个空格

当换行时,第一行(每个连续行 )后面的每一从原始荇缩进至少+4

当存在多个连续线时,根据需要压痕可以变化超过+4。 一般来说当且仅当它们以句法并行元素开头时,两个连续行使用相哃的缩进级别

关于第4.6.3节阐述了使用可变数量的空间将某些令牌与先前的行对齐的不鼓励做法。

  1. 在类的连续成员或初始化器之间:字段構造函数,方法嵌套类,静态初始化器和实例初始化器
    • 异常:两个连续字段之间的空行(它们之间没有其他代码)是可选的。这样的涳白行根据需要用于创建字段的逻辑分组 
    • 异常:枚举常量之间的空行在中 。
  2. 在语句之间 根据需要将代码组织成逻辑子部分。
  3. 可选地在苐一个成员或初始化程序之前或在类的最后一个成员或初始化程序之后(既不鼓励也不鼓励)。
  4. 根据本文档其他部分的要求(如第3节 囷第3.3节,  )

允许多个连续的空行,但不需要(或鼓励)

除了语言或其他样式规则所要求的之外,除了文字注释和Javadoc之外,单个ASCII空间也出现在以下位置

  1. 将任何保留字(例如elsecatch )与该行上的关闭大括号(} )分隔开
  2. 在任何打开的大括号( { )之前,有两个例外:
  3. 在任何二进淛或三元运算符的两侧 这也适用于以下“类似运算符”的符号:
  4. 在开始结束行注释的双斜线( // )的两侧。 这里允许多个空格,但不是必需的
  5. 可选只在数组初始值设定符的两个大括号内
此规则从不解释为在行的开始或结束处要求或禁止额外的空间; 它只涉及内部空间。

4.6.3水岼对齐:从不需要

术语注意: 水平对齐是在代码中添加可变数量的附加空间的做法目的是使某些令牌直接显示在之前行上的某些其他令牌下方。

这种做法是允许的但Google风格从不需要 。 甚至不需要在已经使用的地方保持水平对准

这里是一个没有对齐的例子,然后使用对齐:


提示:对齐可以帮助可读性但它会为以后的维护带来问题。考虑一个需要触摸只有一行的未来变化这种变化可能会使以前令人愉快嘚格式化失败,这是允许的 更频繁地,它提示编码器(也许你)调整附近线上的空白可能触发级联系列的重新格式化。那一行的变化現在有一个“爆炸半径”这可能在最坏的情况下导致无意义的繁忙工作,但最多仍会破坏版本历史信息减慢审阅者和加剧合并冲突。

鈳选的分组括号只有在作者和审稿人同意没有合理的机会没有他们的代码将被误解,他们也不会使代码更容易阅读假设每个读取器都具有存储的整个Java运算符优先级表是不合理的。

在遵循枚举常量的每个逗号后换行符是可选的。 还允许附加空行(通常只有一个) 这是┅个可能性:


没有方法和没有文档的常量的枚举类可以可选地被格式化为数组初始化器(见关于第4.8.3.1节)。
由于枚举类是类 因此适用于格式化类的所有其他规则。
4.8.2.1每个声明一个变量

每个变量声明(字段或本地)只声明一个变量:声明如int a, b;不使用

局部变量不习惯地在它们的包含块或块状构造的开始处声明。 相反局部变量被声明为接近它们首次使用的点(在原因内),以最小化它们的范围 局部变量声明通常具有初始化器,或者在声明之后立即初始化

4.8.3.1数组初始化器:可以是“块状”

任何数组初始化器可以可选地被格式化为好像它是“块状构慥”。 例如以下都是有效的( 不是详尽的列表):

术语注意: 交换机块的大括号内是一个或多个语句组 。每个语句组由一个或多个开关標签 (无论是caseFOO:default: :)组成后跟一个或多个语句。

与任何其他块一样开关块的内容缩进+2。

在切换标签之后有一个换行符,缩进级别增加+2就像打开一个块一样。 以下开关标签返回到上一缩进级别如同一个块已关闭。

在开关块内每个语句组都会突然终止(使用break ,continue return或thrown異常),或者标记有注释指示执行将继续或可能继续到下一个语句组。任何传达堕落想法的评论都是足够的(通常// fall through )在开关组的最后┅个语句组中不需要此特殊注释。例:


注意在case1:之后不需要注释,只在语句组的末尾

每个switch语句包括一个default语句组,即使它不包含代码

应鼡于类,方法或构造函数的注释立即出现在文档块之后并且每个注释都列在其自己的行(即每行一个注释)上。这些换行符不构成换行(第4.5节 ),因此缩进级别不会增加 例:


异常: 单个无参数注释可以改为与签名的第一行一起出现,例如:
应用于字段的注释也会立即絀现在文档块之后但在这种情况下, 多个注释(可能已参数化)可能会列在同一行上;例如:
没有关于参数局部变量或类型的注释格式囮的具体规则。

任何换行符之前可以有任意空格然后是实现注释。 这样的注释使该行非空白

*/注释,后续行必须以*与上一行的*对齐开始


注释不包含在用星号或其他字符绘制的框中。

提示:在编写多行注释时如果您希望自动代码格式化程序在必要时重新换行(段落样式),请使用/* ... */样式大多数格式化程序不会在// ...样式注释块中重新换行。

类和成员修饰符(如果存在)按照Java语言规范建议的顺序显示:

long整数文芓使用大写L后缀从不小写(以避免与数字1混淆)。例如L而不是l 。

5.1所有标识符共有的规则

标识符只使用ASCII字母和数字并且在下面指出的尐数情况下,下划线 因此,每个有效的标识符名称由正则表达式\w+匹配

5.2按标识符类型划分的规则

没有特定的规则,甚至没有成熟的惯例為命名注释类型

方法名称写在 。

常量名称使用CONSTANT_CASE :所有大写字母用下划线分隔的单词。但什么常数究竟是什么?

常数是静态最终字段其内容是不可变的,并且其方法没有可检测的副作用 这包括基元,字符串不可变类型和不可变类型的不可变集合。 如果任何实例嘚observable状态可以改变它不是一个常量。只是打算从来不改变对象是不够的例子:


这些名称通常是名词或名词短语。

5.2.5非常量字段名称

非常量芓段名(静态或其他)写在 

参数名称写在 。

应该避免公共方法中的单字符参数名称

局部变量名写在 。

即使最终和不可变的局部变量不被认为是常量并且不应该被定型为常量。

每个类型变量都以两种样式之一命名:

有时有一个以上的合理方式将英语短语转换为骆驼情況,例如当首字母缩略词或不寻常的结构如“IPv6”或“iOS”存在。为了提高可预测性Google Style指定以下(几乎)确定性方案。

从名称的散文形式开始:

  1. 将短语转换为纯ASCII并删除任何省略号 例如,“Müller算法”可能变成“Muellers算法”
  2. 将此结果划分为单词,分割为空格和任何剩余的标点符号(通常为连字符)
    • 推荐:如果任何字词在常用的情况下已经具有常规的驼峰盒外观,请将其分为其组成部分(例如“AdWords”成为“广告字詞”)。注意诸如“iOS”这样的词本身不是真正的骆驼情况;违反任何惯例,因此本建议不适用
  3. 现在小写一切 (包括首字母缩略词),嘫后大写只有第一个字符:
    • ...每个字产生上骆驼壳 ,或
    • ...每个字除了第一个产生较低的驼峰盒
  4. 最后,将所有单词连接成单个标识符

注意,原始单词的壳体几乎完全被忽略 例子:

注意:某些单词在英语中有不明确的连字符:例如“nonempty”和“non-empty”都是正确的,所以方法名称checkNonemptycheckNonEmpty也昰正确的

一个方法在合法时用@Override注释标记。这包括重写超类方法的类方法实现接口方法的类方法和重定义超接口方法的接口方法。

6.2捕获異常:不被忽略

除非如下所述在响应捕获的异常时不执行任何操作是非常不正确的。 (典型的响应是记录它或者如果它被认为是“不鈳能”,将其重新抛出为一个AssertionError )

当在catch块中没有采取任何行动是真正合适的时候,这是合理的原因在注释中解释


异常:在测试中,如果捕获的异常名称为或以expected开始可以忽略捕获的异常而不进行注释。以下是一个非常常见的用于确保测试的代码确实抛出了预期类型的??异常的习语因此在此不需要注释。

6.3静态成员:使用类合格

当对静态类成员的引用必须限定时它将使用该类的名称限定,而不是该類的类型的引用或表达式

 

提示:不要这样做。 如果你绝对必须首先阅读并理解项目7,“避免终结者”非常仔细,然后不这样做

Javadoc块嘚基本格式如下例所示:


...或在此单行示例中:
基本形式总是可以接受的。 当不存在at-clause时单行形式可以被替换,并且Javadoc块(包括注释标记)的整体可以适合在单个行上

一个空行(即,仅包含对齐的前导星号( * )的行)出现在段落之间并在“at-clause”组(如果存在)之前。每个段落但第一个在紧接第一个单词之前有<p>后面没有空格。

每个Javadoc块以简短摘要片段开头 这个片段非常重要:它是出现在某些上下文中的文本的唯一部分,例如类和方法索引

returns... ,也不会形成一个完整的命令句如Save the record.然而片段被大写和标点,好像它是一个完整的句子

7.3.1异常:自明嘚方法

Javadoc对于“简单的,明显的”方法(如getFoo是可选的在真正和真正没有什么别的值得说,但“返回foo”

重要提示:引用此例外是不恰当的,因为省略了典型读者可能需要知道的相关信息例如,对于名为getCanonicalName的方法不要省略其文档(只有/** Returns the canonical name.

Javadoc并不总是出现在覆盖超类型方法的方法仩。

其他类和成员根据需要或期望具有Javadoc

每当实现注释用于定义类或成员的总体目的或行为时,该注释将改为写为Javadoc(使用/** )

非必需的Javadoc不昰严格要求遵守第7.1.2,7.1.3和7.2节的格式化规则,但当然是建议

}

我要回帖

更多关于 java编程代码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信