4

私は行くのが初めてです、私はgo言語でクライアントサーバーを準備しようとしていて、コードを書こうとしました、しかしそれは何の出力も与えません。エラーは発生していませんが、聞いているだけです。

誰かが私を助けてください、私はサーバーがユーザー名パスワードを使用してクライアントを認証するgoを使用して認証システムを作成したいと思います。

サーバー:

package main

import (
        "fmt"
        "net"
)

func main() {
        service := "0.0.0.0:8080"
        tcpAddr, err := net.ResolveTCPAddr("tcp", service)
        checkError(err)
        listener, err := net.ListenTCP("tcp", tcpAddr)
        checkError(err)
        for {
                conn, err := listener.Accept()
                //fmt.Println("Server listerning")
                _, err = conn.Read([]byte("HEAD"))
                if err != nil {
                        conn.Close()
                }
                if err != nil {
                        continue
                }
        }
}

func checkError(err error) {
        if err != nil {
                fmt.Println("Fatal error ", err.Error())
        }
}

クライアント :

package main

import (
        "bufio"
        "fmt"
        "net"
        "os"
        "strings"
)

func main() {
        if len(os.Args) != 2 {
                fmt.Println("Usage: ", os.Args[0], "host")
                os.Exit(1)
        }
        host := os.Args[1]
        conn, err := net.Dial("tcp", host+":8080")
        checkError(err)
        _, err = conn.Write([]byte("HEAD"))
        reader := bufio.NewReader(os.Stdin)
        for {
                line, err := reader.ReadString('\n')
                ftm.Println(err)
                line = strings.TrimRight(line, " \t\r\n")
                if err != nil {
                        conn.Close()
                        break

                }
        }
}
func checkError(err error) {
        if err != nil {
                fmt.Println("Fatal error ", err.Error())
        }
}
4

2 に答える 2

5

聞くためにアドレスを解決する必要があるかどうかわかりません。

これだけでできるはずです:

listener, err := net.Listen("tcp", ":8080")

そして、受信したバイトのサーバー側で何もしていないようです (の結果を破棄しますRead)。これは、何も受信しないと考える理由を説明しています。

コードは一度に 1 つの接続しか処理できないことに注意してください。開いている各接続を新しいゴルーチンで処理する必要があります。

関連する質問のTCPを介したクライアントサーバー通信の例を次に示します。

于 2012-11-30T11:55:49.867 に答える
2

クライアントで入力を読み取るだけで、何も出力していないように見えるので、期待する出力が正確にはわかりません。@dystroy が指摘したように、サーバーは受信したものを破棄し、通信のエラーのみをチェックします。

また、サーバーただそこに座ってリッスンしている必要があるようです。ループ内でそれを実行しているためです。net パッケージのドキュメントを見ると、サーバーとクライアントを実行する方法の例が示されています。これは私がそれから作ったサンプルで、私にとってはうまくいきました。

サーバー:

ln, err := net.Listen("tcp", ":8080")
// handle error
for {
    conn, err := ln.Accept()
    // handle error
    var cmd []byte
    fmt.Fscan(conn, &cmd)
    fmt.Println("Message:", string(cmd))
}

クライアント:

conn, err := net.Dial("tcp", "127.0.0.1:8080")
// handle error
fmt.Fprintf(conn, "message\n")

追加するために編集: このプログラムの期待される結果は、サーバーを実行して待機することです。次に、別の端末でクライアントを実行すると、すぐに終了しますが、サーバーは「Message: message」を出力しました。クライアントを再度実行すると、サーバーは同じメッセージを再度出力します。このコードを自分のマシンでテストしたところ (エラーに応答するコードを追加しただけです)、宣伝どおりに動作しました。

于 2012-11-30T20:13:18.300 に答える