J'ai un serveur fortement basé sur ce tutoriel. Après y avoir appliqué des modifications supplémentaires, cela a très bien fonctionné. Mais maintenant que j'ai essayé d'y ajouter du code socket.io
,它现在遇到了一些问题。在测试我添加的 socket.io
, cela semble affecter le mécanisme par lequel le code côté client (points de terminaison) appelle le code côté serveur (requêtes de base de données, traitement). Lorsque le journal de l'appel du point de terminaison apparaît sur le terminal, l'appel atteint le côté client du serveur, mais il ne semble pas appeler le côté serveur.
Voici le code du serveur socket :
package helpers import ( "fmt" "net/http" socketio "github.com/googollee/go-socket.io" "github.com/googollee/go-socket.io/engineio" "github.com/googollee/go-socket.io/engineio/transport" "github.com/googollee/go-socket.io/engineio/transport/polling" "github.com/googollee/go-socket.io/engineio/transport/websocket" ) var alloworiginfunc = func(r *http.request) bool { return true } func startsocket() { server := socketio.newserver(&engineio.options{ transports: []transport.transport{ &polling.transport{ checkorigin: alloworiginfunc, }, &websocket.transport{ checkorigin: alloworiginfunc, }, }, }) server.onconnect("/", func(s socketio.conn) error { s.setcontext("") fmt.println("connected:", s.id()) return nil }) server.onevent("/", "notice", func(s socketio.conn, msg string) { fmt.println("notice:", msg) s.emit("reply", "have "+msg) }) server.onerror("/", func(s socketio.conn, e error) { fmt.println("socket error:", e) }) server.ondisconnect("/", func(s socketio.conn, reason string) { fmt.println("closed", reason) }) go server.serve() defer server.close() http.handle("/socket.io/", server) http.handle("/", http.fileserver(http.dir("./asset"))) fmt.println("socket server serving at localhost:8000...") fmt.print(http.listenandserve(":8000", nil)) }
// côté serveur main.go
package main import ( "flag" "fmt" "log" "net" pb "github.com/<me>/<project_name>/api/proto/out" "github.com/<me>/<project_name>/cmd/server/handlers" "github.com/<me>/<project_name>/cmd/server/helpers" "google.golang.org/grpc" "google.golang.org/grpc/credentials" ) func init() { helpers.databaseconnection() } var ( tls = flag.bool("tls", true, "connection uses tls if true, else plain tcp") certfile = flag.string("cert_file", "", "the tls cert file") keyfile = flag.string("key_file", "", "the tls key file") port = flag.int("port", 50051, "the server port") ) func main() { flag.parse() // helpers.startsocket() lis, err := net.listen("tcp", fmt.sprintf("localhost:%d", *port)) if err != nil { log.fatalf("failed to listen: %v", err) } var opts []grpc.serveroption if *tls { if *certfile == "" { *certfile = "service.pem" } if *keyfile == "" { *keyfile = "service.key" } creds, err := credentials.newservertlsfromfile(*certfile, *keyfile) if err != nil { log.fatalf("failed to generate credentials: %v", err) } opts = []grpc.serveroption{grpc.creds(creds)} } mserv := grpc.newserver(opts...) fmt.println("grpc server running ...") pb.registersomethingserviceserver(mserv, &handlers.somethingserver{}) log.printf("server listening at %v", lis.addr()) if err := mserv.serve(lis); err != nil { log.fatalf("failed to serve : %v", err) } }
//client main.go
package main import ( "bytes" "encoding/json" "flag" "fmt" "log" "sort" "strings" "github.com/<me>/<project_name>/cmd/client/handlers" "github.com/gin-gonic/gin" "google.golang.org/grpc" "google.golang.org/grpc/credentials" ) var ( addr = flag.string("addr", "localhost:50051", "the address to connect to") ) func main() { flag.parse() creds, err := credentials.newclienttlsfromfile("service.pem", "") if err != nil { log.fatalf("could not process the credentials: %v", err) } conn, err := grpc.dial(*addr, grpc.withtransportcredentials(creds)) if err != nil { log.fatalf("did not connect: %v", err) } defer conn.close() var gingine = gin.default() startclient(conn, gingine) } func startclient(conn *grpc.clientconn, gingine *gin.engine) { handlers.somethingapihandler(conn, gingine) gingine.run(":5000") }
Pour le code client et serveur complet, vous pouvez consulter le tutoriel que j'ai lié ci-dessus. Si je n'appelle pas startsocket()
, tout fonctionne bien.
Lors de l'appel du point de terminaison de l'API, j'obtiens cette erreur, qui est générée par le code appelant le code côté serveur :
"rpc error: code = unavailable desc = connection error: desc = "transport: error while dialing: dial tcp [::1]:50051: connectex: no connection could be made because the target machine actively refused it.""
Le code est le suivant :
ginGine.POST("/account/login", func(ctx *gin.Context) { var account models.Account err := ctx.ShouldBind(&account) if err != nil { ctx.JSON(http.StatusBadRequest, gin.H{ "error1": err.Error(), }) return } res, err := srvClient.service.ValidateAccount(ctx, &pb.ValidateAccountRequest{ Account: &pb.Account{ Id: account.ID, FirstName: account.FirstName, LastName: account.LastName, UserName: account.UserName, Password: account.Password, }, }) if err != nil { ctx.JSON(http.StatusBadRequest, gin.H{ "error2": err.Error(), }) return } ctx.JSON(http.StatusOK, gin.H{ "status": res.Status, "access_token": res.AccessToken, }) })
erreur2 est ce que renvoie l'appel de l'API
Cette ligne de code bloque, la fonction StartSocket()
ne reviendra jamais :
fmt.Print(http.ListenAndServe(":8000", nil))
Pour les tests, vous pouvez ajouter un journal après celui-ci et le message du journal ne sera pas imprimé.
Vous devez l'exécuter dans une goroutine distincte non bloquante StartSocket()
.
P.S. Par exemple, cette ligne est log.Fatal(http.ListenAndServe(":8000", nil))
. Votre code a avalé une erreur.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!