`
邓启来
  • 浏览: 8232 次
  • 性别: Icon_minigender_1
  • 来自: 六安
文章分类
社区版块
存档分类
最新评论

通信常见问题小结

阅读更多
Java通信程序需要注意的问题:
1. 创建服务器:
指定的端口号port已被占用,或端口号超过一个int型的范围,都会抛出一个异常;

2. 方法阻塞问题:
(1) 服务器对象在调用accept()方法处会阻塞,直到等到有客户机连接进入
(2) 套接字对象在用输入流读取字节时,会阻塞在read()方法处,直到读到客户机输入的字节;

3. 为什么需要用多线程Thread:
不论是服务器的连接对象或者是客户机的连接对象,在通信过程中,他们都要死循环的用自己的输入流来读取对方发来的字节,而且要不断的向对方发送数据,由于在顺序结构中是不可能同时进行这两个行为的调用,因此需要启动一个线程。

4. throws与try……catch
在通信程序中,会遇到很多很多的异常情况,对于会抛出异常的方法来说,究竟是该将异常抛给上级即throws还是应该使用try……catch来对异常进行处理,这里面有很多的讲究,但并无一个确定的套路,完全掌握于程序员自己的手中。例如:当客户机主动关闭程序时,服务器端在读取客户机发送来的字节的方法中一定会抛出异常,这时如果throws则会由上级语句进行try……catch,关闭套接字连接;如果是try……catch,则需要在catch语句中返回一个客户机主动断开的消息,
(1)采用 try……catch的处理机制:
public void run(){
String meg = readMessage();
while(!MessageTool.getType(meg).equals("end")){
processMeg(meg);
//读取消息
meg = readMessage();
}
//客户端发送"<m><type>end</type></m>"则结束
try{
setEndMessage();
System.out.println("客户端主动断开!!!");
client.close();
}catch(IOException ef){
// ef.printStackTrace();
}
//向所有用户发送下线消息
sendDownLineMessage(this.user.getName());
ClientManage.removeClient(this);
}



/**
* 读取客户端发来的消息
* @return
*/
public String readMessage(){

try{
int read = ins.read();
String s="";
StringBuffer sbf = new StringBuffer();
//客户端没有断开就一直读取
while(!s.endsWith("</m>")){
sbf.append((char)read);
s = sbf.toString();
if(!s.endsWith("</m>"))
read = ins.read();
}
System.out.println("读到的输入是:"+s);
char[] ch = s.toCharArray();
byte []b = new byte[ch.length];
for(int i=0;i<ch.length;i++){
b[i] = (byte)ch[i];
}
s = new String(b);
return s;

}catch(IOException ef){
// ef.printStackTrace();
//当有特殊情况客户端断开,因为在协议中以定义结束时发送type=end;
return "<m><type>end</type></m>";
}
}

(2)采用throws的处理机制:

public void run(){
String meg = readMessage();
try{
while(!MessageTool.getType(meg).equals("end")){
processMeg(meg);
//读取消息
meg = readMessage();
}
}catch(IOException ef){
//跳出循环
break;
}

//关闭客户端
System.out.println("客户端主动断开!!!");
client.close();
//向所有用户发送下线消息
sendDownLineMessage(this.user.getName());
ClientManage.removeClient(this);
}


/**
* 读取客户端发来的消息
* @return
*/
public String readMessage()throws IOException {

int read = ins.read();
String s="";
StringBuffer sbf = new StringBuffer();
//客户端没有断开就一直读取
while(!s.endsWith("</m>")){
sbf.append((char)read);
s = sbf.toString();
if(!s.endsWith("</m>"))
read = ins.read();
}
System.out.println("读到的输入是:"+s);
char[] ch = s.toCharArray();
byte []b = new byte[ch.length];
for(int i=0;i<ch.length;i++){
b[i] = (byte)ch[i];
}
s = new String(b);
return s;
}

5.  客户机或者服务器在循环读取流中的字节时,会遇到try……catch与while循环的共同使用的情况,这时应该将while放在try语句块之内来处理,因为对于一个客户机来说,就是一个流,只需要一次try……catch就可以处理流中的错误了。

6.  流的小细节:
在输出流输出数据结束时,要注意用outputstream.flush();在输入流读取数据时,由于read()是将一个一个字节读取到数组中而readFully()则是一次性读取所有的字节,不容易造成数据的丢失,因此,在读取大文件时用readFully()效果较好;在流结束时,要用close()方法关闭流。因此,在QQ传送文件时,常常采用readFully()来读取客户机或服务器发送来的文件数据。

7.  中文字符串乱码:参见另一篇博文。
分享到:
评论

相关推荐

    现代通信系统原理网络教材_

    本章知识点小结 第二章 信道与噪声 2.1 信道的基本概念 2.2 恒参信道及其对所传信 号的影响 2.3 随参信道及其对所传信 号的影响 2.4 信道的加性噪声 2.5 通信中的常见噪声 2.6 信道...

    服务器配置课程学习小结.docx

    服务器配置课程学习小结全文共12页,当前为第1页。服务器配置课程学习小结全文共12页,当前为第1页。服务器配置课程学习小结 服务器配置课程学习小结全文共12页,当前为第1页。 服务器配置课程学习小结全文共12页,...

    浅析数据通信网络维护与网络安全问题-网络安全论文-计算机论文.docx

    要对当前网络安全问题进行分析,及时寻找出问题出现的原因,并根据实际分析的结浅析数据通信网络维护与网络安全问题-网络安全论文-计算机论文全文共10页,当前为第3页。浅析数据通信网络维护与网络安全问题-网络安全...

    数据通信原理与技术

    本章小结……………………………. 思考与练习…………………………. 第2童数据通信技术基础……………. 2.1传输信道概述………………. 2.1.1 信道的类型………………. 2.1.2 信道容量…………………...

    单片机与PC机串行通信综合课程设计.doc

    7 3.4 数码显示、驱动电路及说明 9 4 PC端软件设计 10 4.1 用户界面设计 10 4.2 程序设计 10 5 原理总图 13 6 元器件清单 14 7 调试 15 7.1 调试过程 15 7.2 调试结果 15 8 小结和设计体会 17 9 单片机程序 18 参考...

    SQL注入攻击与防御(安全技术经典译丛)

     1.5 本章小结  1.6 快速解决方案  1.7 常见问题解答 第2章 SQL注入测试  2.1 概述  2.2 寻找SQL注入  2.2.1 借助推理进行测试  2.2.2 数据库错误  2.2.3 应用响应  2.2.4 SQL盲注  2.3 确认SQL...

    Windows应用程序捆绑核心编程光盘代码

    第1章 再谈计算机内存访问 1 1.1 引言 1 1.2 内存管理概述 1 1.2.1 虚拟内存 1 1.2.2 CPU工作模式 2 1.2.3 逻辑、线性和物理地址 3 1.2.4 存储器分页管理机制 3 1.2.5 线性地址到物理地址的...15.7 本章小结 358

    前后端常见的几种鉴权方式(小结)

    最近在重构公司以前产品的前端代码,摈弃了以前的session-cookie鉴权方式,采用token鉴权,忙里偷闲觉得有必要对几种常见的鉴权方式整理一下。 目前我们常用的鉴权有四种: HTTP Basic Authentication session-...

    《Android应用开发揭秘》源码

    作者简介  杨丰盛,Android应用开发先驱,对Android有深入研究,实战经验极其丰富。精通Java、C、C++等语言,专注于移动通信软件开发,在机顶盒软件开发和MTK平台软件开发方面有非常深厚的积累。... 17.4小结

    《Android应用开发揭秘》附带光盘代码.

    《Android应用开发揭秘》全部实例源代码,配合《Android应用开发揭秘》使用 前言  第一部分 准备篇  第1章 Android开发简介  1.1 Android基本概念  1.1.1 Android简介  1.1.2 Android的系统构架 ... 17.4小结

    通信网络技术

    通信网是一种由通信端点、节(结)点和传输链路相互有机地连接起来,以实现在两个或更多的规定通信端点之间提供连接或非连接传输的通信体系。通信网按功能与用途不同,一般可分为物理网、业务网和支撑管理网等三种...

    android开发揭秘PDF

    1.3 小结 第2章 Android开发环境搭建 2.1 Android开发准备工作 2.2 开发包及其工具的安装和 配置 2.2.1 安装JDK和配置Java开发 环境 2.2.2 Eclipse的安装与汉化 2.2.3 SDK和ADT的安装和 配置 2.3 创建第一个Android...

    TCPIP高效编程:改善网络程序的44个技巧 PDF中文版带书签-目录

    本书组织方式比较特别,正文部分包括4 章,将网络编程中存在的常见问题组织成44 个技巧,探讨问题的过程中构建并运行了多个程序,并且指出了代码的源地址,便于读者查看。全书以技巧的形式解答了日常工作中遇到的...

    SQL注入攻击与防御

    1.5 本章小结 18 1.6 快速解决方案 18 1.7 常见问题解答 19 第2章 SQL注入测试 21 2.1 概述 22 2.2 寻找SQL注入 22 2.2.1 借助推理进行测试 22 2.2.2 数据库错误 29 2.2.3 应用响应 38 2.2.4 SQL盲注 42 2.3 确认...

    TCP/IP技术大全(中文PDF非扫描版)

    1.3 小结 7 第2章 TCP/IP和Internet 8 2.1 一段历史 8 2.1.1 ARPANET 8 2.1.2 TCP/IP 9 2.1.3 国家科学基金会(NSF) 9 2.1.4 当今的Internet 12 2.2 RFC和标准化过程 12 2.2.1 获得RFC 13 2.2.2 RFC索引 13 2.2.3 ...

    TCP-IP技术大全

    1.3 小结 7 第2章 TCP/IP和Internet 8 2.1 一段历史 8 2.1.1 ARPANET 8 2.1.2 TCP/IP 9 2.1.3 国家科学基金会(NSF) 9 2.1.4 当今的Internet 12 2.2 RFC和标准化过程 12 2.2.1 获得RFC 13 2.2.2 RFC索引 13 2.2.3 ...

    嵌入式系统-硬件与软件架构(正版)

     小结   习题   附注   第2章 了解标准   2.1 程序设计语言概述和程序设计语言标准实例   2.1.1 垃圾收集   2.1.2 处理Java字节码   2.2 标准与连网   2.2.1 相连的设备间的距离   2.2.2 物理...

    Android应用开发揭秘pdf高清版

    内容提要 --------------------------------------------------------------------------------  国内第一本基于Android 2.0的经典著作,5大专业社区联袂推荐,权威性毋庸置疑!《Android应用开发揭秘》...17.4小结

Global site tag (gtag.js) - Google Analytics