欧美日韩激情_美女国产一区_国产精品久久久久影院日本_69xxx在线

如何解決JavaSocket通信技術(shù)收發(fā)線程互斥的問題

本篇內(nèi)容介紹了“如何解決Java Socket通信技術(shù)收發(fā)線程互斥的問題”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)長期為超過千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為曲阜企業(yè)提供專業(yè)的成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì),曲阜網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

Java Socket通信技術(shù)在很長的時(shí)間里都在使用,在不少的程序員眼中都有很多高的評價(jià)。那么下面我們就看看如何才能掌握這門復(fù)雜的編程語言,希望大家在今后的Java Socket通信技術(shù)使用中有所收獲。

下面就是Java Socket通信技術(shù)在解決收發(fā)線程互斥的代碼介紹。

  1. package com.bill99.svr;   

  2. import java.io.IOException;   

  3. import java.io.InputStream;   

  4. import java.io.OutputStream;   

  5. import java.net.InetSocketAddress;   

  6. import java.net.Socket;   

  7. import java.net.SocketException;   

  8. import java.net.SocketTimeoutException;   

  9. import java.text.SimpleDateFormat;   

  10. import java.util.Date;   

  11. import java.util.Properties;   

  12. import java.util.Timer;   

  13. import java.util.TimerTask;   

  14. import java.util.concurrent.ConcurrentHashMap;   

  15. import java.util.concurrent.TimeUnit;   

  16. import java.util.concurrent.locks.Condition;   

  17. import java.util.concurrent.locks.ReentrantLock;   

  18. import org.apache.log4j.Logger;   

  19. /**   

  20. *<p>title: socket通信包裝類</p>   

  21. *<p>Description: </p>   

  22. *<p>CopyRight: CopyRight (c) 2009</p>   

  23. *<p>Company: 99bill.com</p>   

  24. *<p>Create date: 2009-10-14</P>   

  25. *author sunnylocus<A href="mailto:sunnylocus@163.com">   

  26. </A> * v0.10 2009-10-14 初類   

  27. * v0.11 2009-11-12 對命令收發(fā)邏輯及收發(fā)線程互斥機(jī)制進(jìn)行了優(yōu)化,
    處理命令速度由原來8~16個(gè)/秒提高到25~32個(gè)/秒   

  28. */ public class SocketConnection {   

  29. private volatile Socket socket;   

  30. private int timeout = 1000*10; //超時(shí)時(shí)間,初始值10秒   

  31. private boolean isLaunchHeartcheck = false;//是否已啟動心跳檢測   

  32. private boolean isNetworkConnect = false; //網(wǎng)絡(luò)是否已連接   

  33. private static String host = "";   

  34. private static int port;   

  35. static InputStream inStream = null;   

  36. static OutputStream outStream = null;   

  37. private static Logger log =Logger.getLogger
    (SocketConnection.class);   

  38. private static SocketConnection socketConnection = null;   

  39. private static java.util.Timer heartTimer=null;     

  40. //private final Map<String, Object> recMsgMap= Collections.
    synchronizedMap(new HashMap<String, Object>());   

  41. private final ConcurrentHashMap<String, Object> recMsgMap 
    = new ConcurrentHashMap<String, Object>();   

  42. private static Thread receiveThread = null;   

  43. private final ReentrantLock lock = new ReentrantLock();   

  44. private SocketConnection(){   

  45. Properties conf = new Properties();   

  46. try {   

  47. conf.load(SocketConnection.class.getResourceAsStream
    ("test.conf"));   

  48. this.timeout = Integer.valueOf(conf.getProperty("timeout"));   

  49. init(conf.getProperty("ip"),Integer.valueOf
    (conf.getProperty("port")));   

  50. } catch(IOException e) {   

  51. log.fatal("socket初始化異常!",e);   

  52. throw new RuntimeException("socket初始化異常,請檢查配置參數(shù)");   

  53. }   

  54. }   

  55. /**   

  56. * 單態(tài)模式   

  57. */   

  58. public static SocketConnection getInstance() {   

  59. if(socketConnection==null) {   

  60. synchronized(SocketConnection.class) {   

  61. if(socketConnection==null) {   

  62. socketConnection = new SocketConnection();   

  63. return socketConnection;   

  64. }   

  65. }   

  66. }   

  67. return socketConnection;   

  68. }   

  69. private void init(String host,int port) throws IOException {   

  70. InetSocketAddress addr = new InetSocketAddress(host,port);   

  71. socket = new Socket();   

  72. synchronized (this) {   

  73. log.info("【準(zhǔn)備與"+addr+"建立連接】");   

  74. socket.connect(addr, timeout);   

  75. log.info("【與"+addr+"連接已建立】");   

  76. inStream = socket.getInputStream();   

  77. outStream = socket.getOutputStream();   

  78. socket.setTcpNoDelay(true);//數(shù)據(jù)不作緩沖,立即發(fā)送   

  79. socket.setSoLinger(true, 0);//socket關(guān)閉時(shí),立即釋放資源   

  80. socket.setKeepAlive(true);   

  81. socket.setTrafficClass(0x04|0x10);//高可靠性和最小延遲傳輸   

  82. isNetworkConnect=true;   

  83. receiveThread = new Thread(new ReceiveWorker());   

  84. receiveThread.start();   

  85. SocketConnection.host=host;   

  86. SocketConnection.port=port;   

  87. if(!isLaunchHeartcheck)   

  88. launchHeartcheck();   

  89. }   

  90. }   

  91. /**   

  92. * 心跳包檢測   

  93. */   

  94. private void launchHeartcheck() {   

  95. if(socket == null)   

  96. throw new IllegalStateException("socket is not 
    established!");   

  97. heartTimer = new Timer();   

  98. isLaunchHeartcheck = true;   

  99. heartTimer.schedule(new TimerTask() {   

  100. public void run() {   

  101. String msgStreamNo = StreamNoGenerator.getStreamNo("kq");   

  102. int mstType =9999;//999-心跳包請求   

  103. SimpleDateFormat dateformate = new SimpleDateFormat
    ("yyyyMMddHHmmss");   

  104. String msgDateTime = dateformate.format(new Date());   

  105. int msgLength =38;//消息頭長度   

  106. String commandstr = "00" +msgLength + mstType + msgStreamNo;   

  107. log.info("心跳檢測包 -> IVR "+commandstr);   

  108. int reconnCounter = 1;   

  109. while(true) {   

  110. String responseMsg =null;   

  111. try {   

  112. responseMsg = readReqMsg(commandstr);   

  113. } catch (IOException e) {   

  114. log.error("IO流異常",e);   

  115. reconnCounter ++;   

  116. }   

  117. if(responseMsg!=null) {   

  118. log.info("心跳響應(yīng)包 <- IVR "+responseMsg);   

  119. reconnCounter = 1;   

  120. break;   

  121. } else {   

  122. reconnCounter ++;   

  123. }   

  124. if(reconnCounter >3) {//重連次數(shù)已達(dá)三次,判定網(wǎng)絡(luò)連接中斷,
    重新建立連接。連接未被建立時(shí)不釋放鎖   

  125. reConnectToCTCC(); break;   

  126. }   

  127. }   

  128. }   

  129. },1000 * 60*1,1000*60*2);   

  130. }   

  131. /**   

  132. * 重連與目標(biāo)IP建立重連   

  133. */   

  134. private void reConnectToCTCC() {   

  135. new Thread(new Runnable(){   

  136. public void run(){   

  137. log.info("重新建立與"+host+":"+port+"的連接");   

  138. //清理工作,中斷計(jì)時(shí)器,中斷接收線程,恢復(fù)初始變量   

  139. heartTimer.cancel();   

  140. isLaunchHeartcheck=false;   

  141. isNetworkConnect = false;   

  142. receiveThread.interrupt();   

  143. try {   

  144. socket.close();   

  145. } catch (IOException e1) {log.error("重連時(shí),關(guān)閉socket連
    接發(fā)生IO流異常",e1);}   

  146. //----------------   

  147. synchronized(this){   

  148. for(; ;){   

  149. try {   

  150. Thread.currentThread();   

  151. Thread.sleep(1000 * 1);   

  152. init(host,port);   

  153. this.notifyAll();   

  154. break ;   

  155. } catch (IOException e) {   

  156. log.error("重新建立連接未成功",e);   

  157. } catch (InterruptedException e){   

  158. log.error("重連線程中斷",e);   

  159. }   

  160. }   

  161. }   

  162. }   

  163. }).start();   

  164. }   

  165. /**   

  166. * 發(fā)送命令并接受響應(yīng)   

  167. * @param requestMsg   

  168. * @return   

  169. * @throws SocketTimeoutException   

  170. * @throws IOException   

  171. */   

  172. public String readReqMsg(String requestMsg) throws IOException {   

  173. if(requestMsg ==null) {   

  174. return null;   

  175. }   

  176. if(!isNetworkConnect) {   

  177. synchronized(this){   

  178. try {   

  179. this.wait(1000*5); //等待5秒,如果網(wǎng)絡(luò)還沒有恢復(fù),拋出IO流異常   

  180. if(!isNetworkConnect) {   

  181. throw new IOException("網(wǎng)絡(luò)連接中斷!");   

  182. }   

  183. } catch (InterruptedException e) {   

  184. log.error("發(fā)送線程中斷",e);   

  185. }   

  186. }   

  187. }   

  188. String msgNo = requestMsg.substring(8, 8 + 24);//讀取流水號   

  189. outStream = socket.getOutputStream();   

  190. outStream.write(requestMsg.getBytes());   

  191. outStream.flush();   

  192. Condition msglock = lock.newCondition(); //消息鎖   

  193. //注冊等待接收消息   

  194. recMsgMap.put(msgNo, msglock);   

  195. try {   

  196. lock.lock();   

  197. msglock.await(timeout,TimeUnit.MILLISECONDS);   

  198. } catch (InterruptedException e) {   

  199. log.error("發(fā)送線程中斷",e);   

  200. } finally {   

  201. lock.unlock();   

  202. }   

  203. Object respMsg = recMsgMap.remove(msgNo); //響應(yīng)信息   

  204. if(respMsg!=null &&(respMsg != msglock)) {   

  205. //已經(jīng)接收到消息,注銷等待,成功返回消息   

  206. return (String) respMsg;   

  207. } else {   

  208. log.error(msgNo+" 超時(shí),未收到響應(yīng)消息");   

  209. throw new SocketTimeoutException(msgNo+" 超時(shí),未收到響應(yīng)消息");   

  210. }   

  211. }   

  212. public void finalize() {   

  213. if (socket != null) {   

  214. try {   

  215. socket.close();   

  216. } catch (IOException e) {   

  217. e.printStackTrace();   

  218. }   

  219. }   

  220. }   

  221. //消息接收線程   

  222. private class ReceiveWorker implements Runnable {   

  223. String intStr= null;   

  224. public void run() {   

  225. while(!Thread.interrupted()){   

  226. try {   

  227. byte[] headBytes = new byte[4];   

  228. if(inStream.read(headBytes)==-1){   

  229. log.warn("讀到流未尾,對方已關(guān)閉流!");   

  230. reConnectToCTCC();//讀到流未尾,對方已關(guān)閉流   

  231. return;   

  232. }   

  233. byte[] tmp =new byte[4];   

  234. tmp = headBytes;   

  235. String tempStr = new String(tmp).trim();   

  236. if(tempStr==null || tempStr.equals("")) {   

  237. log.error("received message is null");   

  238. continue;   

  239. }   

  240. intStr = new String(tmp);   

  241. int totalLength =Integer.parseInt(intStr);   

  242. //----------------   

  243. byte[] msgBytes = new byte[totalLength-4];   

  244. inStream.read(msgBytes);   

  245. String resultMsg = new String(headBytes)+ new 
    String(msgBytes);   

  246. //抽出消息ID   

  247. String msgNo = resultMsg.substring(8, 8 + 24);   

  248. Condition msglock =(Condition) recMsgMap.get(msgNo);   

  249. if(msglock ==null) {   

  250. log.warn(msgNo+"序號可能已被注銷!響應(yīng)消息丟棄");   

  251. recMsgMap.remove(msgNo);   

  252. continue;   

  253. }   

  254. recMsgMap.put(msgNo, resultMsg);   

  255. try{   

  256. lock.lock();   

  257. msglock.signalAll();   

  258. }finally {   

  259. lock.unlock();   

  260. }   

  261. }catch(SocketException e){   

  262. log.error("服務(wù)端關(guān)閉socket",e);   

  263. reConnectToCTCC();   

  264. } catch(IOException e) {   

  265. log.error("接收線程讀取響應(yīng)數(shù)據(jù)時(shí)發(fā)生IO流異常",e);   

  266. } catch(NumberFormatException e){   

  267. log.error("收到?jīng)]良心包,String轉(zhuǎn)int異常,異常字符:"+intStr);   

  268. }   

  269. }   

  270. }   

  271. }   

“如何解決Java Socket通信技術(shù)收發(fā)線程互斥的問題”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

網(wǎng)頁標(biāo)題:如何解決JavaSocket通信技術(shù)收發(fā)線程互斥的問題
網(wǎng)站路徑:http://www.kartarina.com/article32/pjdgsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版建站公司動態(tài)網(wǎng)站網(wǎng)站建設(shè)響應(yīng)式網(wǎng)站手機(jī)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
欧美日韩激情_美女国产一区_国产精品久久久久影院日本_69xxx在线
男女男精品视频网| 亚洲欧美色图小说| 在线成人小视频| 91免费版pro下载短视频| 懂色av一区二区三区蜜臀| 国产一区二区三区最好精华液| 婷婷亚洲久悠悠色悠在线播放| 亚洲一区在线观看视频| 亚洲成人av电影| 奇米精品一区二区三区在线观看一 | 精品国产不卡一区二区三区| 久久亚洲精品国产精品紫薇| 久久亚洲一级片| 国产精品视频在线看| 亚洲日本在线天堂| 亚洲一区二区3| 亚洲r级在线视频| 蜜臀av在线播放一区二区三区| 久久99热狠狠色一区二区| 精品影视av免费| 国产盗摄视频一区二区三区| 成人黄色免费短视频| 色婷婷综合久久久| 91精品国产综合久久精品图片| 337p亚洲精品色噜噜噜| 欧美成人在线直播| 中文字幕成人在线观看| 亚洲午夜在线观看视频在线| 图片区小说区国产精品视频| 久久精品72免费观看| 成人综合日日夜夜| 在线观看不卡视频| 精品国产污污免费网站入口| 国产精品国产三级国产普通话蜜臀| 亚洲欧洲精品一区二区三区不卡| 夜夜夜精品看看| 国产真实乱子伦精品视频| 成人动漫一区二区| 欧美精品日日鲁夜夜添| 久久蜜桃一区二区| 国产精品白丝在线| 日韩中文字幕亚洲一区二区va在线| 国产精品99久| 色狠狠一区二区| 日韩欧美国产综合| 一区二区在线观看视频 | 日韩一区二区三区在线| 欧美国产成人在线| 日韩中文字幕一区二区三区| 国产伦精品一区二区三区视频青涩| av激情综合网| 国产亚洲欧美色| 午夜视频在线观看一区二区| 福利一区福利二区| 日韩三级在线观看| 亚洲成人高清在线| 91麻豆精品一区二区三区| 日韩欧美在线影院| 天堂av在线一区| 欧洲精品中文字幕| 亚洲人成亚洲人成在线观看图片 | 91精品国产手机| 亚洲一区二区三区国产| 99精品视频一区| 国产精品毛片久久久久久久| 国产真实乱子伦精品视频| 欧美精品乱人伦久久久久久| 亚洲一区二区三区四区在线观看| 91一区在线观看| 最新不卡av在线| 不卡一卡二卡三乱码免费网站| 26uuu国产日韩综合| 九九**精品视频免费播放| 欧美一三区三区四区免费在线看| 亚洲chinese男男1069| 欧美午夜精品一区二区三区| 亚洲小说欧美激情另类| 欧美无砖专区一中文字| 亚洲黄色片在线观看| 在线观看日韩国产| 亚洲小少妇裸体bbw| 欧美精品国产精品| 日韩福利电影在线| 日韩视频在线永久播放| 国产在线精品免费| 国产无人区一区二区三区| 成人午夜电影小说| 亚洲欧美偷拍另类a∨色屁股| 99久久精品国产观看| 一区二区在线观看视频| 欧美巨大另类极品videosbest| 日韩电影一二三区| 精品不卡在线视频| 成人激情免费电影网址| 日韩理论片网站| 欧美日韩一区二区三区高清| 久久精品久久精品| 国产精品久久久久久久蜜臀| 欧美在线免费观看亚洲| 久久成人麻豆午夜电影| 日本一区二区三区免费乱视频| 制服丝袜亚洲色图| 蜜桃精品视频在线观看| 国产欧美视频一区二区三区| 在线观看日韩国产| 精油按摩中文字幕久久| 亚洲人午夜精品天堂一二香蕉| 3751色影院一区二区三区| 风间由美性色一区二区三区| 亚洲一区二区在线免费观看视频| 精品欧美一区二区久久| 93久久精品日日躁夜夜躁欧美| 日韩二区三区四区| 国产精品久久久久久久久搜平片 | 激情小说亚洲一区| 亚洲精品自拍动漫在线| 日韩一区二区视频| 色婷婷综合久久久久中文一区二区 | 国产精品88888| 亚洲国产精品天堂| 国产性色一区二区| 欧美日本国产视频| 成人精品电影在线观看| 久久国产精品第一页| 亚洲成在线观看| 国产精品美女久久久久久| 91精品国产欧美一区二区18| 91免费看`日韩一区二区| 毛片av中文字幕一区二区| 一区二区视频在线看| 欧美激情一二三区| 日韩欧美成人一区二区| 在线免费观看日本欧美| 波多野结衣一区二区三区| 六月丁香综合在线视频| 亚洲国产va精品久久久不卡综合| 国产精品久久久久影视| 国产午夜精品久久久久久免费视| 欧美一区二区啪啪| 欧美日韩一级大片网址| 在线观看91视频| 91视频免费观看| 91麻豆免费看片| 色综合婷婷久久| 色综合久久中文综合久久牛| av动漫一区二区| 成人黄色片在线观看| 岛国精品在线播放| av资源站一区| 不卡的av在线播放| 99精品视频在线观看免费| 成人97人人超碰人人99| 成人av网站在线观看| 成av人片一区二区| a级精品国产片在线观看| 91丨九色porny丨蝌蚪| 91精品欧美综合在线观看最新| 欧美日韩国产综合久久| 欧美肥大bbwbbw高潮| 91精品久久久久久久久99蜜臂| 欧美日韩精品免费观看视频| 欧美军同video69gay| 欧美一区二区黄色| 久久久久久久久久看片| 欧美国产一区视频在线观看| 中文字幕亚洲成人| 亚洲国产精品久久人人爱蜜臀| 亚洲成人av电影| 国内成人自拍视频| 成人动漫一区二区三区| 色综合久久久久综合99| 欧美日韩另类一区| 精品国产99国产精品| 国产精品乱码妇女bbbb| 亚洲国产综合在线| 久久精品国产亚洲a| 成人性视频网站| 在线观看91视频| 精品久久国产字幕高潮| 亚洲欧洲日产国产综合网| 一区二区高清在线| 精一区二区三区| 91丝袜美腿高跟国产极品老师| 制服视频三区第一页精品| 久久久综合激的五月天| 亚洲欧美日韩国产一区二区三区| 视频一区视频二区中文| 国产福利不卡视频| 欧美日韩国产系列| 国产欧美日韩综合| 日本中文字幕一区二区视频| 国产成人精品一区二| 欧美精品乱码久久久久久按摩| 国产午夜一区二区三区| 亚洲成在人线免费| 91亚洲国产成人精品一区二三| 日韩一级成人av| 一区二区三区日韩欧美精品| 国产伦精品一区二区三区免费| 欧美性猛交xxxx黑人交|