2016-09-07 75 views
1

我有這樣的圍棋TCP套接字golang TCP套接字 - 處理多個消息

package main 

import (
    "fmt" 
    "io" 
    "log" 
    "net" 
    "bytes" 
) 

func main() { 

    l, err := net.Listen("tcp", ":1200") 
    if err != nil { 
    log.Fatal(err) 
    } 
    defer l.Close() 
    for { 

    conn, err := l.Accept() 
    if err != nil { 
     log.Fatal(err) 
    } 

    go func(c net.Conn) { 

     var buf bytes.Buffer 
     io.Copy(&buf, c) 
     fmt.Println("total size:", buf.Len()) 
     s := buf.String() 
     println(s) 

     c.Close() 
    }(conn) 
    } 
} 

接受的消息,將其轉換爲字符串,並顯示它,但如果連接不被客戶關閉,我不能請參閱預期的服務器上顯示的消息

如何從客戶端發送多條消息而無需關閉客戶端連接(由客戶端)?

在這裏,客戶端的NodeJS

var net = require('net'); 

let packet = { 
       Target: { Host: "", Port: "9000" }, 
       Name: { Family: "Newmarch", Personal: "Jan" }, 
       Email: [ 
         { Kind: "home", Address: "[email protected]"}, 
         { Kind: "work", Address: "[email protected]"} 
        ] 
} 


var client = new net.Socket(); 
client.connect(1200, '0.0.0.0', function() { 
    console.log('Connected'); 
    client.write((new Buffer(JSON.stringify(packet), 'UTF-8'))); 
    client.end(); 
    //client.write('\n'); 
}); 

client.on('data', function(data) { 
    console.log('Received: ' + data); 
    client.destroy(); 
}); 

client.on('close', function() { 
    console.log('Connection closed'); 
}); 

感謝valeriano cossu

+0

作爲答案中提到,你必須以某種方式打破你的消息。 TCP本身是一種流媒體協議,而不是基於數據包的協議。 –

回答

1

io包文檔:https://golang.org/pkg/io/#Copy,複印功能拷貝,直到遇到EOF。

您不手動發送EOF,但關閉連接的客戶端會這樣做,所以複製功能可以完成複製。

您可以使用bufio包來閱讀您的分隔符的字符串:

line, err := bufio.NewReader(conn).ReadString('\n') 

在上述情況下,分隔符是換行字符。您可以重複使用閱讀器來重複調用ReadString以檢索更多消息。

+0

感謝Nebril,它是正確的,現在正如Tomaz所解釋的那樣工作。 – internet3

+0

@ internet3很高興知道,隨時接受我的或托馬斯的回答(在答案分數下打勾)。 – Nebril

2

因爲服務器需要知道如何分離消息,所以需要持續的數據流。這樣做的一種方法是使用新的一行字符。

我修改了下面的代碼。

轉到服務器: 包主要

import (
    "bufio" 
    "log" 
    "net" 
) 

func main() { 

    l, err := net.Listen("tcp", ":1200") 
    if err != nil { 
     log.Fatal(err) 
    } 
    defer l.Close() 
    for { 

     conn, err := l.Accept() 
     if err != nil { 
      log.Fatal(err) 
     } 

     go func(c net.Conn) { 
      for { 
       message, err := bufio.NewReader(conn).ReadString('\n') 
       if err != nil { 
        log.Printf("Error: %+v", err.Error()) 
        return 
       } 

       log.Println("Message:", string(message)) 
      } 
     }(conn) 
    } 
} 

客戶的NodeJS:

var net = require('net'); 

let packet = { 
       Target: { Host: "", Port: "9000" }, 
       Name: { Family: "Newmarch", Personal: "Jan" }, 
       Email: [ 
         { Kind: "home", Address: "[email protected]"}, 
         { Kind: "work", Address: "[email protected]"} 
        ] 
} 


var client = new net.Socket(); 
client.connect(1200, '0.0.0.0', function() { 
    console.log('Connected'); 

    // Send 10 messages 
    for(var i = 0; i < 10; i++) { 
    client.write((new Buffer(JSON.stringify(packet), 'UTF-8'))); 
    client.write('\n'); 
    } 

    client.end(); 

}); 

client.on('data', function(data) { 
    console.log('Received: ' + data); 
    client.destroy(); 
}); 

client.on('close', function() { 
    console.log('Connection closed'); 
}); 
+0

謝謝Tomaz,工作! – internet3