java-socket
来源:互联网 发布:剑三捏脸数据什么意思 编辑:程序博客网 时间:2024/05/19 13:07
java通信方面效率虽然不及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(UnioncomDeliver.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 (-) 简单socket
- Java Socket
- java-socket
- java socket
- Java Socket
- JAVA Socket
- Java Socket
- socket(java)
- Java Socket
- Java socket
- java socket
- java socket
- Socket(java)
- Java socket
- Java Socket
- java socket
- Java Socket
- java socket
- 基于ARM9内核Processor外部NAND FLASH的控制实现
- 尝试Windows Live Writer(测试)
- 注意! JavaScript中的"陷阱"
- 开始深入linux驱动编程
- Oracle PGA自动管理在OLAP系统中的应用
- java-socket
- enrique iglesias-hero
- Mysql中的临时表
- .NET牛人应该知道些什么
- Java反编译
- Hdu 1257 最少拦截系统 程序参考
- 数据库操作
- ASP.NET 中动态创建图形范例
- WinCE中的RAM-Based Registry与HIVE-Based Registry