2017-10-09 14 views
-3

私はお互いにUDPとTCPを使いたいです。私はTCP部分のUDP部分の作業についてコメントし、UDP部分のTCP部分の作業についてはコメントします。我々はUDPとTCPの両方を使用することができます)機能で、TCPの一部またはudp一部を渡すことで と行くtcpserverの(のようにそれを呼び出す:私はEDIT UDP部にUDPとTCPは互いに隣り合っています

func main() { 

// 
// ─── TCP ──────────────────────────────────────────────────────────────────── 
// 

// Listen for incoming connections. 
l, err := net.Listen("tcp", "localhost"+":"+"3000") 
if err != nil { 
    fmt.Println("Error listening:", err.Error()) 
    os.Exit(1) 
} 

// Close the listener when the application closes. 
defer l.Close() 
fmt.Println("Listening on " + "localhost" + ":" + "3000") 
for { 
    // Listen for an incoming connection. 
    conn, err := l.Accept() 
    if err != nil { 
     fmt.Println("Error accepting: ", err.Error()) 
     os.Exit(1) 
    } 
    // Handle connections in a new goroutine. 
    go gotcp.HandleRequest(conn) 
    //go handler(conn) 
} 

// 
// ─── UDP ──────────────────────────────────────────────────────────────────── 
// 

// then we should check which struct is empty and fill them 

/* Lets prepare a address at any address at port 10001*/ 
ServerAddr, err := net.ResolveUDPAddr("udp", ":3000") 
goudp.CheckError(err) 

/* Now listen at selected port */ 
ServerConn, err := net.ListenUDP("udp", ServerAddr) 
goudp.CheckError(err) 
defer ServerConn.Close() 

buf := make([]byte, 1024) 

for { 
    n, addr, err := ServerConn.ReadFromUDP(buf) 
    //fmt.Println("Received ", string(buf[0:n]), " from ", addr) 
    if err != nil { 
     fmt.Println("Error: ", err) 
    } 

    // *** broadcasting 
    //start := time.Now() 
    if v, ok := goudp.RRoom()[djr]; ok { 
     //fmt.Println("get room name ", v) 
     go goudp.BroadCast(string(buf[0:n]), djr, ServerConn, v) 
     //delete(R, "x") 
     //go sendResponse(ServerConn, v.UserAddr1) 
    } 
    //elapsed := time.Since(start) 
    //log.Printf("Binomial took %s", elapsed) 
} 

} 

を使用し、その後TCPといくつかのメッセージを送信する必要がある お互いに

+1

ヨuはTCP接続を受け入れる1つの無限ループに従事しています。あなたはそれが魔法のように出て、入ってくるUDPを処理する2番目の無限ループに入ると予想しています。それは動作しません。なぜあなたはそれがすべきだと思いますか? – EJP

+0

通常、2つのプロトコルを1つのポートにバインドすることは、ネットワーキングでは実現不可能です。 – jeevatkm

+0

'私はお互いにUDPとTCPを使いたいです。 TCPはUDPと通信しません。 –

答えて

1

putuが指摘したように、正しく動作させるためには並行処理が必要です。

NodeJSは、コールバックをデフォルトで使用します。つまり、関数にパラメータとして関数を渡すと、メインループが次の命令に解放されます。このため、nodejsアプリケーションはこのobject.method(function() {})パターンではなく、これと似たようなものを得るためには、TCPとUDPの部分をそれぞれ無限ループの別個の関数で包む必要があります。証拠に

概念は、このような何かを:

... 
go func(){ 
    // paste your tcp code here 
} 
... 
go func(){ 
    // paste your udp code here 
} 

「行く」命令は、コードのこの部分は、あなたが設定されます現実世界のプロジェクトでは当然のことながら、並行モードで実行する必要があり、コンパイラに言うことその正常に機能し、ちょうどあなたのメイン関数から呼び出しのコードのこれらの部分:外出先での並行処理について

... 
go serveTCP(); 
go serve UDP(); 
... 

もっとここ=>https://tour.golang.org/concurrency/1

関連する問題