关于java socket的一些总结:

Java Socket通信有很多的时候需要我们不断的学习。方面效率虽然不及C与C++但它以灵活语言优势,为大家广为使用。 本文就对在使用java做通信方面程序时候应改注意问题做以说明。


1.长连接、短链接只是针对客户端而言,服务器无所谓长、短;

2.无论同步或者异步通信,发送之后务必要又响应回复,确认收到,负责进行一定范围内重发,例如重发三次;

3.长连接服务器与客户端之间务必需要心跳探测,由客户端主动发起;

4.短连接服务器通用代码:

package com.biesan.sms.gate.unioncom.communication;  
    import com.biesan.commons.Constants;  
    import com.biesan.commons.util.CodeUtil;  
    import com.biesan.sms.gate.unioncom.data.*;  
    import com.biesan.sms.gate.unioncom.util.GateInfo;  
    import java.net.*;  
    import java.io.*;  
    import java.util.*;  
    import org.apache.log4j.*;  
    import spApi.*;  
    public class UnioncomDeliver extends Thread {  
    // stop flag  
    private boolean unInterrupt = true;  
    private boolean unErr = true;  
    //private boolean closeSocketFlag = false;  
    // server socket  
    private ServerSocket serverSo = null;  
    // current socket  
    private Socket so = null 
    private OutputStream output = null;  
    private InputStream input = null;  
    // gate command  
    private SGIP_Command tmpCmd = null;  
    private SGIP_Command cmd = null;  
    private Bind bind = null;  
    private BindResp bindResp = null;  
    //private Unbind unBind = null;  
    private UnbindResp unBindResp = null;  
    private boolean unAcceptErrorFlag = true;  
    Logger unioncomLog = Logger.getLogger(Unioncom
    Deliver.class.getName());  
    public UnioncomDeliver() {  
    }  
    public void run() {  
    unioncomLog.info("Start...");  
    while (unInterrupt) {  
    this.initServer();  
    this.startServices();  
    while (this.unAcceptErrorFlag) {  
    try {  
    //接受连接请求  
    unioncomLog.info("before accept connection!....... 
    FreeMemroy :" + Runtime.getRuntime().freeMemory());  
    this.acceptConnection();  
    unioncomLog.info("after accept connection!....... 
    FreeMemroy :" + Runtime.getRuntime().freeMemory());  
    while (unErr) {  
    cmd = new Command();  
    unioncomLog.info("before read command from stream
    ........... FreeMemroy: " + Runtime.getRuntime().
    freeMemory());  
    tmpCmd = cmd.read(input);  
    unioncomLog.info("after read command from stream " + 
    getCommandString(cmd.getCommandID()) + " FreeMemroy: " + 
    Runtime.getRuntime().freeMemory());  
    if (tmpCmd == null) {  
    unErr = false;  
    break;  
    }  
    switch (cmd.getCommandID()) {  
    // biad ready communication  
    case SGIP_Command.ID_SGIP_BIND: {  
    this.dealBind();  
    break;  
    }// exit bind  
    case SGIP_Command.ID_SGIP_UNBIND: {  
    this.dealUnBind();  
    unioncomLog.info("after unbind connection!....... 
    FreeMemroy :" + Runtime.getRuntime().freeMemory());  
    break;  
    }// deliver  
    ....  
    default : //错误的命令字  
    break;  
    }// switch  
    }// while(unErr)  
    } catch (Exception e) {  
    unioncomLog.error("Unioncom Recv Service Error"  
    + e.getMessage());   
    } finally {  
    if (this.so != null) {  
    this.closeSocket();  
    }  
    this.unErr = true;  
    }  
    }// while (this.unAcceptErrorFlag)  
    try {  
    this.closeServerSocket();  
    sleep(200);// sleep  
    } catch (InterruptedException ie) {  
    }  
    }// while(unInterrupt)  
    }  
    private String getCommandString(int cmd){  
    switch (cmd) {  
    // biad ready communication  
    case SGIP_Command.ID_SGIP_BIND: {  
    return " BIND COMMAND ";   
    }// exit bind  
    case SGIP_Command.ID_SGIP_UNBIND: {  
    return " UNBIND COMMAND ";   
    }// deliver  
    case ...  
    default:  
    return " UNKNOWN COMMAND";   
    }  
    }  
    private void dealBind() {  
    try {  
    bind = new Bind(tmpCmd);  
    if (bind.readbody() != 0) {  
    unioncomLog.warn("Read Bind error");  
    this.unErr = false;  
    }  
    bindResp = new BindResp(tmpCmd.getMsgHead());  
    bindResp.SetResult(0);  
    bindResp.write(output);  
    unioncomLog.debug("Bind success!");  
    } catch (Exception e) {  
    unioncomLog.error("Dela Union Recv Bind Error!" + 
    e.getMessage());  
    this.unErr = false;  
    }  
    }  
    private void dealUnBind() {  
    try {  
    //unBind = (Unbind) tmpCmd;  
    unBindResp = new UnbindResp(tmpCmd.getMsgHead());  
    unBindResp.write(output);  
    unioncomLog.debug("UnBind success!");  
    } catch (Exception e) {  
    unioncomLog.warn("Unbind error!" + e.getMessage());  
    }  
    this.unErr = false;  
    }  
    private void startServices() {  
    boolean unStartServices = true;  
    while (unStartServices) {  
    try {  
    serverSo = new ServerSocket(ugInfo.getLocalServerPort(), 5,  
    InetAddress.getByName(ugInfo.getLocalIpAdd()));  
    //serverSo.setSoTimeout(60000);  
    unStartServices = false;   
    unioncomLog.info("Create union recv socket Ok!");  
    } catch (IOException e) {  
    unioncomLog.warn("Create union recv socket error!"  
    + e.getMessage());  
    unStartServices = true;  
    UnioncomSubmit.thrSlp(3000);  
    }  
    }  
    }  
    private void acceptConnection() {  
    // Accept 失败  
    try {   
    so = serverSo.accept();  
    so.setSoTimeout(10000);  
    } catch (Exception e) {  
    unioncomLog.warn("Accept Error!" + e.getMessage());  
    this.closeServerSocket();  
    this.unAcceptErrorFlag = false;  
    this.unErr=false;  
    }  
    // Accept成功  
    try {  
    input = so.getInputStream();  
    output = so.getOutputStream();  
    } catch (IOException e) {  
    unioncomLog.warn("Get I/O stream Error!" + e.getMessage());  
    this.closeService();  
    this.unAcceptErrorFlag = false;  
    this.unErr=false;  
    }  
    }  
    private void closeSocket() {  
    try {  
    so.close();  
    unioncomLog.info("Socket Close Success!!!");  
    } catch (Exception e) {  
    unioncomLog.error("Socket Close Failure!!!" + e.getMessage());  
    }  
    }  
    private void closeServerSocket() {  
    try {  
    serverSo.close();  
    unioncomLog.info("ServerSocket Close Success!!!");  
    } catch (Exception e) {  
    unioncomLog  
    .error("ServerSocket Close Failure!!!" + e.getMessage());  
    }  
    }  
    private void closeService() {  
    this.closeSocket();  
    this.closeServerSocket();  
    }  
    private void initServer() {  
    this.bind = null;  
    this.bindResp = null;  
    //this.unBind = null;  
    this.unBindResp = null;  
    this.tmpCmd = null;  
    this.cmd = null;  
    this.serverSo = null;  
    this.so = null;  
    this.output = null;  
    this.input = null;  
    this.unErr = true;  
    //this.closeSocketFlag = false;  
    unioncomLog.info("Memory***==="  
    + java.lang.Runtime.getRuntime().freeMemory());  
    }  
    public synchronized void requireStop() {  
    this.unInterrupt = false;  
    unioncomLog.info("Requre interrupt!!!");  
    }  
    public String convertMsgContentCoding
    (int msgCoding, byte[] msgContent) {  
    String deliverContent = null;  
    try {  
    if (msgContent != null) {  
    if (msgCoding == 8) { // 处理ucs32编码  
    deliverContent = new String(msgContent,  
    "UnicodeBigUnmarked");  
    } else if (msgCoding == 0) { // 处理ASCII编码  
    deliverContent = new String(msgContent, "ASCII");  
    } else if (msgCoding == 4) { // 处理binary编码  
    deliverContent = new String(msgContent);  
    } else if (msgCoding == 15) { // 处理GBK编码  
    deliverContent = new String(msgContent, "GBK");  
    // 处理DELIVER数据包的短信息ID  
    } else {  
    unioncomLog.error("编码格式错误!");  
    return "";  
    }  
    } else  
    return "";  
    return deliverContent;  
    } catch (UnsupportedEncodingException ex) {  
    unioncomLog.error("deal content error!" +
     ex.getMessage());  
    return "";  
    }  
    }  
    }

以上就是对Java Socket通信的详细介绍。

如果您愿意花几块钱请我喝杯茶的话,可以用手机扫描下方的二维码,通过 支付宝 捐赠。我会努力写出更好的文章。 
(捐赠不显示捐赠者的个人信息,如需要,请注明您的联系方式) 
Thank you for your kindly donation!!


 

自然语言交流系统 phxnet团队 创新实训 个人博客 (十三)的更多相关文章

  1. 自然语言交流系统 phxnet团队 创新实训 个人博客 (五)

    有关我们这个项目:智能自然语言交流系统,所借鉴的技术有: 第一:我们使用了科大讯飞的在线语音转换,涉及的有文本传给云端服务器的文字转换成语音和本地的语音上传给服务器转换成文字. 涉及的相关的代码有: ...

  2. 自然语言交流系统 phxnet团队 创新实训 项目博客 (四)

    刚开始做时,一点头绪都没有,整天的上网找资料,各种谷歌百度,各种博客论坛,搜索的关键词也无非是智能自然语言交流.智能机器人.中文问答系统等等等等.而我们的思路也是些零散的,例如我们知道会用到分词,会用 ...

  3. 自然语言交流系统 phxnet团队 创新实训 项目博客 (二)

    基本要求 打开软件,即可进入2D文本交流界面, 软件此时已经连接到服务器,点击文本输入框输入你想说的话,点击发送按钮即可进行交流,点击CHAT和STUDY分别切换到聊天模式或是学习模式,聊天模式是机器 ...

  4. 自然语言交流系统 phxnet团队 创新实训 个人博客 (十一)

    名思义是 给游戏场景 添加一个 天空背景 让游戏更加精美,更具有魅力 添加天空盒 有两种方式  1 : 在当前相机上添加skybox   2 : 在当前场景上添加skybox 上面的两种方式的结果是一 ...

  5. 自然语言交流系统 phxnet团队 创新实训 个人博客 (九)

    情感倾向可认为是主体对某一客体主观存在的内心喜恶,内在评价的一种倾向.它由两个方面来衡量:一个情感倾向方向,一个是情感倾向度. 情感倾向方向也称为情感极性.在微博中,可以理解为用户对某客体表达自身观点 ...

  6. 自然语言交流系统 phxnet团队 创新实训 项目博客 (十四)

    项目技术借鉴报告: 一.服务器端(Server) 1.分词 分词使用的是庖丁分词.使用盘古分词词库和词素作为辅助.其中包括下载Jar包并且使用. 2.人工神经网络 以网上已有的初级网络为蓝图,结合机器 ...

  7. 自然语言交流系统 phxnet团队 创新实训 项目博客 (十三)

    对我们项目中的关键技术实现进行总结: 一.3DMax关键技术实现 1.一下的关于3DMax中对于人物的设计和操作均需要在对3DMax基础知识熟练掌握的情况下进行的. 2. 骨骼架设:首先对导入到3DM ...

  8. 自然语言交流系统 phxnet团队 创新实训 项目博客 (十二)

    关于情感词典的学习总结: 情感倾向可认为是主体对某一客体主观存在的内心喜恶,内在评价的一种倾向.它由两个方面来衡量:一个情感倾向方向,一个是情感倾向度. 情感倾向方向也称为情感极性.在微博中,可以理解 ...

  9. 自然语言交流系统 phxnet团队 创新实训 项目博客 (五)

    3DMax方面所涉及的专业知识:                       (1)一下的关于3DMax中对于人物的设计和操作均需要在对3DMax基础知识熟练掌握的情况下进行的. (2)骨骼架设:首先 ...

  10. 自然语言交流系统 phxnet团队 创新实训 个人博客 (四)

    关于项目中个使用到的自然语言语音转文字&文字转语言的个人总结: VOICE_NAME, "xiaoyan");speechSynthesizer.setParameter( ...

随机推荐

  1. iOS 画平滑曲线的方法及取音频数据的方法

    源码:http://files.cnblogs.com/ios8/iOS%E5%BF%83%E7%94%B5%E5%9B%BEDemo.zip 取音频数据和画波形图的方法 ViewController ...

  2. zabbix 实现 iptables 监控

    安装iptstate # yum install iptstate 配置zabbix key iptables.conf # cat /etc/zabbix/zabbix_agentd.d/iptab ...

  3. 菜鸟教程之工具使用(四)——借助JRebel使Tomcat支持热部署

    JRebel是一个J2EE热部署的工具.使用它可以减少浪费8-18%的开发时间在项目的构建和部署上.虽然Java也提供了HotSpot的JVM,但是如果你修改的类中有方法名称变动的话,HotSpot就 ...

  4. Android 编程下的日志工具类

    package com.sunzn.app.util; import android.util.Log; public class Logger { public static int DEBUG_L ...

  5. 记一次金士顿DT100 G3 32G修复

    修复方法参考原文:http://bbs.mydigit.cn/read.php?tid=2291146 故障描述:某天在使用时突然要求格式化,但里面有重要数据,于是想通过DG恢复出来,没想到经过这样的 ...

  6. sql 基础练习 计算7天各个时间点的总和 group by order mysql一次查询多个表

    SQL 基础练习 -- 创建数据库 CREATE DATABASE school CHARACTER SET UTF8; -- 使用数据库 USE school; -- id: 学生的id -- na ...

  7. maven 远程仓库的配置

      setting.xml    <profile> <id>development</id> <repositories> <repositor ...

  8. 用eclipse调试scala工程代码

    1,在scala工程下面执行命令:sbt -jvm-debug 9999 2,然后执行命令:run,程序就跑起来了 3,然后用eclipse工具导入scala工程. 4,最后配置调试信息,端口号跟上面 ...

  9. JAVA-JSP内置对象之session对象

    相关资料:<21天学通Java Web开发> session对象 1.session对象用来表示用户的会话状况,一般用于保存用户的各种信息.2.直到生命周期超时或者被认为释放掉为止. 方法 ...

  10. WPF学习笔记(1)——image控件图片不显示的问题

    说明(2017-6-7 16:08:35): 1. 本来想用winform的,用winform就没这么多破事了. 2. 不过项目要用WPF,拉出一个mediaelement控件,视频正常显示. 3. ...