tcp長連線處理服務端和客戶端處理方式
長連線的處理方式是:
Server端收到Client端發來的資訊之後,開始心跳計時,在設定時間內如果收到Client發來的訊息,則重置計時器,否則計時結束斷開連線。
Client端,處理方式是:用time.NewTicker建立一個定時器,每間隔一秒傳送下當前時間到伺服器。
服務端程式碼如下:
- package main
- import (
- "fmt"
- "os"
- "net"
- "log"
- "github.com/mxi4oyu/MoonSocket/protocol"
- "time"
- )
- //定義CheckError方法,避免寫太多到 if err!=nil
- func CheckError(err error) {
- if err!=nil{
- fmt.Fprintf(os.Stderr,"Fatal error:%s",err.Error())
- os.Exit(1)
- }
- }
- //自定義log
- func Log(v... interface{}) {
- log.Println(v...)
- }
- func main() {
- server_listener,err:=net.Listen("tcp","localhost:8848")
- CheckError(err)
- defer server_listener.Close()
- Log("Waiting for clients connect")
- for{
- new_conn,err:=server_listener.Accept()
- CheckError(err)
- go ServerMsgHandler(new_conn)
- }
- }
- //服務端訊息處理
- func ServerMsgHandler(conn net.Conn) {
- //儲存被截斷的資料
- tmpbuf:=make([] byte,0)
- buf:=make([] byte,1024)
- defer conn.Close()
- //接收解包
- readchan:=make(chan [] byte,16)
- go ReadChan(readchan)
- for{
- n,err:=conn.Read(buf)
- if err!=nil{
- fmt.Println("connection close")
- return
- }
- //解包
- tmpbuf = protocol.Depack(append(tmpbuf,buf[:n]...))
- fmt.Println("client say:",string(tmpbuf))
- Msg:=tmpbuf
- beatch :=make(chan byte)
- //心跳計時,預設30秒
- go HeartBeat(conn,beatch,30)
- //檢測每次Client是否有資料傳來
- go HeartChanHandler(Msg,beatch)
- }
- }
- //處理心跳,根據HeartChanHandler判斷Client是否在設定時間內發來資訊
- func HeartBeat(conn net.Conn,heartChan chan byte,timeout int) {
- select {
- case hc:=<-heartChan:
- Log("<-heartChan:",string(hc))
- conn.SetDeadline(time.Now().Add(time.Duration(timeout)*time.Second))
- break
- case <-time.After(time.Second*30):
- Log("timeout")
- conn.Close()
- }
- }
- //處理心跳channel
- func HeartChanHandler( n [] byte,beatch chan byte) {
- for _,v:=range n{
- beatch<-v
- }
- close(beatch)
- }
- //從channell中讀取資料
- func ReadChan(readchan chan [] byte) {
- for{
- select {
- case data:=<-readchan:
- Log(string(data))
- }
- }
- }
客戶端程式碼如下:
- package main
- import (
- "fmt"
- "os"
- "net"
- "strconv"
- "time"
- "github.com/mxi4oyu/MoonSocket/protocol"
- )
- //定義CheckError方法,避免寫太多到 if err!=nil
- func CheckError(err error) {
- if err!=nil{
- fmt.Fprintf(os.Stderr,"Fatal error:%s",err.Error())
- os.Exit(1)
- }
- }
- func main() {
- if len(os.Args) !=2 {
- fmt.Fprintf(os.Stderr,"Usage:%s IP:Port\n",os.Args[0])
- os.Exit(1)
- }
- //動態傳入服務端IP和埠號
- service:=os.Args[1]
- tcpAddr,err:=net.ResolveTCPAddr("tcp4",service)
- CheckError(err)
- conn,err:=net.DialTCP("tcp",nil,tcpAddr)
- CheckError(err)
- ch:=make(chan int,100)
- ticker := time.NewTicker(time.Second)
- defer ticker.Stop()
- //這裡可以加上業務處理程式碼,當應用有資料傳送時將資料傳送到一個通道里(通道只儲存資料指標),這裡加上從通道獲取資料指標的處理函式。
- for{
- select {
- case <-ticker.C:
- ch<-1
- go ClientMsgHandler(conn,ch)
- case <-time.After(time.Second*10):
- defer conn.Close()
- fmt.Println("timeout")
- }
- }
- }
- //客戶端訊息處理
- func ClientMsgHandler(conn net.Conn,ch chan int) {
- <-ch
- //獲取當前時間
- msg:=time.Now().String()
- SendMsg(conn,msg)
- }
- func GetSession() string{
- gs1:=time.Now().Unix()
- gs2:=strconv.FormatInt(gs1,10)
- return gs2
- }
- func SendMsg(conn net.Conn,msg string) {
- session:=GetSession()
- words := "{\"Session\":"+session +",\"Meta\":\"Monitor\",\"Message\":\""+msg+"\"}"
- conn.Write([] byte(words))
- protocol.Enpack([]byte(words))
- conn.Write(protocol.Enpack([]byte(words)))
-
相關推薦
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通訊的小程式,方便以後要使用的時候能直接複用,省的還要各種谷歌、百度。 功能介紹 寫的很簡單,實現的就是客戶端讀取鍵盤輸入,傳送給服務端,服務端
服務端和客戶端連線的兩種方式,socket和DatagramSocket
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)選中“監聽程式”,點選“+”,填寫監聽名稱,如: