2017-10-25 4 views
0

Goで単純なTCPベースのチャットアプリケーションを構築するときに問題が発生しました。私の問題は、変数名を変更した後、書式設定が間違っているように見え、メッセージのテキストが送信者やその他の文字の名前を上書きすることです。TCPチャットアプリケーション文字列連結エラー

以下のすべてのコードスニペットは、サーバーから取得したものです。

type Message struct { 
    sender *User 
    message string 
} 

type User struct { 
    connection net.Conn 
    queue chan string//Simply a queue of messages that will be sent to the client, out of the scope of this question 
    name string 
} 

名を設定するコード:(コマンドと仮定すると、「/ニックNAME」形式で提供されます)

command := message.message[1:] 
if(strings.HasPrefix(command, "nick")) { 
    message.sender.name = command[5:] 
    fmt.Println("Set name to: " + message.sender.name) 
} 

値を出力コード(私は文字列を連結場合は、エラーが解消されないことに注意してください)伝統的なs1 + s2を使用して:

var buffer bytes.Buffer 
buffer.WriteString("<") 
buffer.WriteString(message.sender.name) 
buffer.WriteString("> ") 
buffer.WriteString(message.message) 
fmt.Println(buffer.String()) 
sendMessage(buffer.String()) 

出力(右、左、クライアント上のサーバーではありません、私はメッセージ「テストに」両方の時間を送ること):。

Output

メッセージのフォーマットは、<NewName123> Testされている必要があり、上で見たように、しかしシンボルより大きい紛失され、メッセージのテストは、ユーザーの名前を上書きすることが分かります。私はこの問題を引き起こしているものとして困っています。 アプリケーションは次のように動作します。クライアントが接続します。クライアントがメッセージを送信すると、サーバーはメッセージを読み取り、フォーマットを適用します(IEのユーザー名を入力します)。サーバーは、すべてのユーザー(送信者を含む)にメッセージを再配布します。クライアントはメッセージを表示します。

どのようなヘルプも素晴らしいでしょう。

+2

改行(\ n)と改行(\ r)を適切にトリミングしていますか? – Peter

答えて

4

名は行の先頭にキャリッジ(別名。カーソル)を返し、その後、<NewName123>を書き、その後、(以上)> Testを書き込むように、端末に指示し、キャリッジリターン(\r)を、含まれているようにこれが見えます。

strings.TrimSpace(command[5:])これを修正する必要があります。

+0

どうもありがとうございました。 –