关于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. fastdfs 图片服务器 使用java端作为客户端上传图片

    之前有说道搭建fastdfs作为图片服务器,但是没有说明如何真正在代码里调用,那么今天大致讲一下,如何使用java客户端进行上传 首先你得要有一个客户端,导入到eclipse中即可 git地址如下: ...

  2. angular的uiRouter服务学习(4)

    本篇接着上一篇angular的uiRouter服务学习(3)继续讲解uiRouter的用法 本篇主要讲解uiRouter的url路由 大多数情况下,状态是和url相关联的: 当url改变,激活对应的状 ...

  3. android Socket 编程

    Socket 通信 1.UDP实现  (DatagramSocket) [客户端] //首先创建一个DatagramSocket对象 DatagramSocket socket = new Datag ...

  4. 【教程】minicom使用教程

    简介 Linux下的Minicom的功能与Windows下的超级终端功能相似,可以通过串口控制外部的硬件设备.适于在linux通过超级终端对嵌入式设备行管理.同样也可以使用minicom对外置Mode ...

  5. LeetCode: Binary Tree Inorder Traversal 解题报告

    Binary Tree Inorder Traversal Given a binary tree, return the inorder traversal of its nodes' values ...

  6. Upload文件时出现"Cannot access a closed file"错误

    本地能上传文件,部署到服务器上就报 Cannot access a closed file 错误,以下是解决方法: <System.Web> <httpRuntime executi ...

  7. JAVA-JSP内置对象之request对象参数

    相关资料:<21天学通Java Web开发> request对象1.request对象不但可以用来设置和取得requset范围变量,还可以用来获得客户端请求参数请求的来源.表头.cooki ...

  8. java基础篇---I/O技术(一)

    对于任何程序设计语言而言,输入输出(I/O)系统都是比较复杂的而且还是比较核心的.在java.io.包中提供了相关的API. java中流的概念划分 流的方向: 输入流:数据源到程序(inputStr ...

  9. mac OS X中升级php5.5至php5.6 or php7

    在做php项目中,提示“Warning. PHP 5.6 or newer is required. Please, upgrade your local PHP installation.” 通过p ...

  10. 【.Net】Thread.Start()与ThreadPool.QueueUserWorkItem()的区别

    百度搜到的靠前的几篇文章,都是写了两种API的使用实例,但并没有说清两者的具体差别. 直接上stackoverflow搜才是正确的姿势.(想上谷歌,然而十/九_大|期间VPN各种被墙,就很气) 参考: ...