1. 程式人生 > >tcp長連線處理服務端和客戶端處理方式

tcp長連線處理服務端和客戶端處理方式

長連線的處理方式是:

Server端收到Client端發來的資訊之後,開始心跳計時,在設定時間內如果收到Client發來的訊息,則重置計時器,否則計時結束斷開連線。

Client端,處理方式是:用time.NewTicker建立一個定時器,每間隔一秒傳送下當前時間到伺服器。

服務端程式碼如下:

  1. package main  
  2.   
  3. import (  
  4.     "fmt"  
  5.     "os"  
  6.     "net"  
  7.     "log"  
  8.     "github.com/mxi4oyu/MoonSocket/protocol"  
  9.     "time"  
  10. )  
  11.   
  12.   
  13. //定義CheckError方法,避免寫太多到 if err!=nil  
  14. func CheckError(err error)  {  
  15.   
  16.     if err!=nil{  
  17.         fmt.Fprintf(os.Stderr,"Fatal error:%s",err.Error())  
  18.   
  19.         os.Exit(1)  
  20.     }  
  21.   
  22. }  
  23.   
  24. //自定義log  
  25. func Log(v... interface{})  {  
  26.   
  27.     log.Println(v...)  
  28. }  
  29.   
  30. func main()  {  
  31.   
  32.     server_listener,err:=net.Listen("tcp","localhost:8848")  
  33.   
  34.     CheckError(err)  
  35.   
  36.     defer server_listener.Close()  
  37.   
  38.     Log("Waiting for clients connect")  
  39.   
  40.   
  41.   
  42.     for{  
  43.         new_conn,err:=server_listener.Accept()  
  44.   
  45.         CheckError(err)  
  46.   
  47.         go ServerMsgHandler(new_conn)  
  48.     }  
  49.   
  50.       
  51. }  
  52.   
  53. //服務端訊息處理  
  54. func ServerMsgHandler(conn net.Conn)  {  
  55.   
  56.     //儲存被截斷的資料  
  57.     tmpbuf:=make([] byte,0)  
  58.     buf:=make([] byte,1024)  
  59.   
  60.     defer conn.Close()  
  61.   
  62.     //接收解包  
  63.     readchan:=make(chan [] byte,16)  
  64.     go ReadChan(readchan)  
  65.   
  66.     for{  
  67.         n,err:=conn.Read(buf)  
  68.   
  69.         if err!=nil{  
  70.   
  71.             fmt.Println("connection close")  
  72.             return  
  73.         }  
  74.   
  75.         //解包  
  76.         tmpbuf = protocol.Depack(append(tmpbuf,buf[:n]...))  
  77.         fmt.Println("client say:",string(tmpbuf))  
  78.   
  79.         Msg:=tmpbuf  
  80.   
  81.         beatch :=make(chan byte)  
  82.         //心跳計時,預設30秒  
  83.         go HeartBeat(conn,beatch,30)  
  84.         //檢測每次Client是否有資料傳來  
  85.         go HeartChanHandler(Msg,beatch)  
  86.   
  87.     }  
  88.   
  89. }  
  90.   
  91. //處理心跳,根據HeartChanHandler判斷Client是否在設定時間內發來資訊  
  92. func HeartBeat(conn net.Conn,heartChan chan byte,timeout int)  {  
  93.     select {  
  94.     case hc:=<-heartChan:  
  95.         Log("<-heartChan:",string(hc))  
  96.         conn.SetDeadline(time.Now().Add(time.Duration(timeout)*time.Second))  
  97.         break  
  98.     case <-time.After(time.Second*30):  
  99.         Log("timeout")  
  100.         conn.Close()  
  101.     }  
  102. }  
  103.   
  104. //處理心跳channel  
  105. func HeartChanHandler( n [] byte,beatch chan byte)  {  
  106.     for _,v:=range n{  
  107.         beatch<-v  
  108.     }  
  109.     close(beatch)  
  110. }  
  111.   
  112. //從channell中讀取資料  
  113. func ReadChan(readchan chan [] byte)  {  
  114.   
  115.     for{  
  116.         select {  
  117.         case data:=<-readchan:  
  118.             Log(string(data))  
  119.         }  
  120.     }  
  121. }  

客戶端程式碼如下:

  1. package main  
  2.   
  3. import (  
  4.     "fmt"  
  5.     "os"  
  6.     "net"  
  7.     "strconv"  
  8.     "time"  
  9.     "github.com/mxi4oyu/MoonSocket/protocol"  
  10. )  
  11.   
  12. //定義CheckError方法,避免寫太多到 if err!=nil  
  13. func CheckError(err error)  {  
  14.   
  15.     if err!=nil{  
  16.         fmt.Fprintf(os.Stderr,"Fatal error:%s",err.Error())  
  17.   
  18.         os.Exit(1)  
  19.     }  
  20.   
  21. }  
  22.   
  23. func main()  {  
  24.   
  25.     if len(os.Args) !=2 {  
  26.   
  27.         fmt.Fprintf(os.Stderr,"Usage:%s IP:Port\n",os.Args[0])  
  28.   
  29.         os.Exit(1)  
  30.     }  
  31.   
  32.     //動態傳入服務端IP和埠號  
  33.     service:=os.Args[1]  
  34.   
  35.     tcpAddr,err:=net.ResolveTCPAddr("tcp4",service)  
  36.   
  37.     CheckError(err)  
  38.   
  39.     conn,err:=net.DialTCP("tcp",nil,tcpAddr)  
  40.   
  41.     CheckError(err)  
  42.     ch:=make(chan int,100)  
  43.   
  44.     ticker := time.NewTicker(time.Second)  
  45.     defer ticker.Stop()  
  46.   
  47. //這裡可以加上業務處理程式碼,當應用有資料傳送時將資料傳送到一個通道里(通道只儲存資料指標),這裡加上從通道獲取資料指標的處理函式。
  48.     for{  
  49.         select {  
  50.         case <-ticker.C:  
  51.             ch<-1  
  52.             go ClientMsgHandler(conn,ch)  
  53.         case <-time.After(time.Second*10):  
  54.             defer conn.Close()  
  55.             fmt.Println("timeout")  
  56.         }  
  57.     }  
  58.   
  59. }  
  60.   
  61. //客戶端訊息處理  
  62. func ClientMsgHandler(conn net.Conn,ch chan int)  {  
  63.   
  64.     <-ch  
  65.     //獲取當前時間  
  66.     msg:=time.Now().String()  
  67.     SendMsg(conn,msg)  
  68. }  
  69.   
  70. func GetSession() string{  
  71.     gs1:=time.Now().Unix()  
  72.     gs2:=strconv.FormatInt(gs1,10)  
  73.     return gs2  
  74. }  
  75.   
  76. func SendMsg(conn net.Conn,msg string)  {  
  77.   
  78. session:=GetSession()  
  79.   
  80.     words := "{\"Session\":"+session +",\"Meta\":\"Monitor\",\"Message\":\""+msg+"\"}"  
  81.     conn.Write([] byte(words))  
  82.     protocol.Enpack([]byte(words))  
  83.     conn.Write(protocol.Enpack([]byte(words)))  
  84. 相關推薦

    python3實現TCP協議的簡單服務客戶

    由於 轉載 while encoding ont ans 令行 cti 數據 利用python3來實現TCP協議,和UDP類似。UDP應用於及時通信,而TCP協議用來傳送文件、命令等操作,因為這些數據不允許丟失,否則會造成文件錯誤或命令混亂。下面代碼就是模擬客戶端通過命令行

    TCP阻塞模型下服務客戶的建立步驟

    linuxTCP阻塞模型下服務器和客戶端的建立步驟:服務器的建立步驟:1.調用socket建立TCP套接字2.調用bind將套接字跟本地地址綁定3.調用listen建立監聽4.建立accept接受來自客戶端的連接,返回新的連接套接字5.在新的套接字上面,調用send/recv實現跟客戶端的通信客戶端的建立步驟

    tcp連線處理服務客戶處理方式

    長連線的處理方式是: Server端收到Client端發來的資訊之後,開始心跳計時,在設定時間內如果收到Client發來的訊息,則重置計時器,否則計時結束斷開連線。 Client端,處理方式是:用time.NewTicker建立一個定時器,每間隔一秒傳送下當前時間到伺服器。 服務端程式碼如下:

    基於Socket的TCP連線服務Java+客戶Android),Service配合AIDL實現

    最近公司的專案要求加入訊息推送功能,由於專案使用者量不是很大,推送需求不是很嚴格,而且是基於內網的推送,所以我捨棄了使用三方的推送服務,自己使用Socket寫了推送功能,剪出一個小Demo來跟大家分享一下,有不足之處希望讀者能夠多多給出建議。 關於Socket的

    Linux c實現一個tcp文件服務客戶

    repr snippets 功能 stderr strcpy fprintf inet_addr 編寫 create 總體需求:編寫tcp文件服務器和客戶端。客戶端可以上傳和下載文件。 ===========================================

    tcp 服務客戶程序設計

    cti ida ons uint8_t 文件 數據 開頭 ews 信息 一、實驗目的 學習和掌握Linux下的TCP服務器基本原理和基本編程方法,體會TCP與UDP編程的不同,UDP編程:http://blog.csdn.net/yueguanghaidao/articl

    編寫一個簡單的TCP服務客戶

    不同的 大連 終端 服務器端 com 讀寫 所有 字數 資料 下面的實驗環境是linux系統。 效果如下: 1.啟動服務端程序,監聽在6666端口上 2.啟動客戶端,與服務端建立TCP連接 3.建立完TCP連接,在客戶端上向服務端發送消息 4.斷開

    QTcpSocket-Qt使用Tcp通訊實現服務客戶

    超過 amp 方式 all trac tro article ada 內部 版權聲明:若無來源註明,Techie亮博客文章均為原創。 轉載請以鏈接形式標明本文標題和地址: 本文標題:QTcpSocket-Qt使用Tcp通訊實現服務端和客戶端 本文地址:http:/

    TCP服務客戶_Socket編程

    cli 操作 cat next() png run 等待 響應 .net TCP服務器 服務器啟動文件 1 import java.io.IOException; 2 import java.net.ServerSocket; 3 import j

    Socket TCP 協議實現服務客戶的簡單通訊-結合線程池的使用

    文章目錄 前言 當前模式的弊端 服務端程式碼 客戶端程式碼 執行結果 客戶端 服務端

    從零開始學Socket:(二)連線服務客戶

    先了解一下執行緒問題,在Main函式裡就是主執行緒他能處理程式碼,而new Thread就是新開一個執行緒,他和主執行緒互不干預,但是主執行緒完了,他也完了。他完了,主執行緒沒事。   在上篇部落格裡,我們已經建立好了伺服器端和客戶端,但是他們倆還沒有聯絡,要把他們聯絡起來,就

    python3-TCP服務客戶(socketserver類)

    env amr rip address ctrl+c utf-8 request ctrl reat #!/usr/bin/env python3 import socket import sys HOST="localhost" PORT=21200 ADDR=(H

    使用TCP協議,分別編寫服務客戶,要求客戶服務上傳檔案。(使用字元流完成)

    package Test; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.IOException; import java.io

    Qt:Qt實現Winsock網路程式設計—TCP服務客戶通訊(多執行緒)

    Qt實現Winsock網路程式設計—TCP服務端和客戶端通訊(多執行緒) 前言 感覺Winsock網路程式設計的api其實和Linux下網路程式設計的api非常像,其實和其他程式語言的網路程式設計都差不太多。博主用Qt實現的,當然不想用黑視窗唄,有介面可以看到,由於GUI程式設計

    C語言實現服務客戶進行TCP通訊例項

     本文給出一個很實用的C語言實現的服務端和客戶端進行TCP通訊的小例子。具體實現上非常簡單,只是平時編寫類似程式,具體步驟經常忘記,還要總是查,暫且將其記下來,方便以後參考。 (1)客戶端程式,編寫一個檔案client.c,內容如下: #include <stdl

    php編寫TCP服務客戶程式

    1、修改php.ini,開啟extension=php_sockets.dll 2、服務端程式SocketServer.php <?php //確保在連線客戶端時不會超時 set_time_limit(0); //設定IP和埠號 $address =

    基於TCP通訊的簡單服務客戶程式

    背景 因為最近在研究網路相關的東西,因此經常要寫程式做實驗來驗證。主要是TCP通訊,因此就寫了個簡單的基於TCP通訊的小程式,方便以後要使用的時候能直接複用,省的還要各種谷歌、百度。 功能介紹 寫的很簡單,實現的就是客戶端讀取鍵盤輸入,傳送給服務端,服務端

    服務客戶連線的兩種方式,socketDatagramSocket

    socket有兩種方式,一種是Serversocket(服務端)和socket(客戶端)的方式(基於tcp/ip的通訊方式)另一種是DatagramSocket(客戶端和服務端)的方式(基於udp的通訊方式)第一種服務端需要繫結埠和ip,客戶端監聽服務端時需要知道服務端的埠和ip(可以不用繫結客戶端的埠和ip

    用qt寫tcp服務客戶介面遇到的問題及解決方法

    問題1 #include <QTcpSocket> #include <QtcpServer> 在包含這兩個標頭檔案時提示找不到檔案 此時需要在此工程的.pro檔案中新增 QT += network 問題2 服務端的ui介

    Win7系統Oracle11g服務客戶連線資料庫配置

    A連線本地資料庫 1)服務端配置 建立一個監聽程式 a)開始—Oracle-OraDb11g_home1—配置和移植工具—Net Manager。 b)選中“監聽程式”,點選“+”,填寫監聽名稱,如: