TCPサーバ
すべての言語はゴルーチン並行性と効率的なを使用することは非常に簡単、に対処するためのゴルーチンを作成するためのリンクを確立することができます行きます。
処理手順の一般的な流れは、TCPサーバーは、
ソケットを作成してバインド1:まず、サーバソケット()関数は、ネットワークソケット、その後、バインド()関数を作成し、ソケットがバインドされているIPポートを指定し使用します。
リクエスト2.リッスン:次に、IPとポートをバインドするクライアントの要求に耳を傾けるために聞く()関数を使用してサーバー。
3.接続を受信:接続を確立するために成功した3ウェイハンドシェイクを超えると通じ要求があった場合、受け入れる()関数は、リンクを受け取り使用します。
機能がクライアントによって送信されたサーバ要求データ接続から確立上記、及び、書き込み()関数によって処理され、クライアントに応答データを送信してきた()を読み出す読み出し:ハンドルゴルーチンへのリンクを作成4.
TCPクライアント一般的なプロセスフロー
1.確立ソケット:同じソケットを使用して、クライアント()関数は、ネットワークソケットを作成します。
2.接続を確立します:接続は:その後、指定されたサーバーのネットワークプログラムとの接続を確立するためにIPとポート番号を着信接続()関数を呼び出します。
前記送信要求受信応答:接続が確立された後、クライアントは、サーバへの書き込みデータを介して送信する()関数ができ、リードを使用して()関数は、サーバからの応答を受信します。
TCPサーバ
メインパッケージ のインポート( "FMT" "ログ" "NET" ) FUNC chkError(ERRエラー){ ERR = nilのIF {! log.Fatal(ERR); } } FUNCメイン(){ // TCPサーバーの作成 tcpaddrを、 ERR:= net.ResolveTCPAddr( "tcp4"、 "127.0.0.1:8081"); chkError(ERR); //リスニングポート tcplisten、ERR2:= net.ListenTCP( "TCP"、tcpaddr); chkError(ERR2)。 fmt.Println( "スタートサーバ") //とリンクとの契約を確立する。 ゴーFUNC(){ のための{ //クライアントのリンク上であれば、戻ります阻止 ERR、CONN:= tcplisten.AcceptTCP() ERR = nilのIF! { fmt.Println( "ERR同意"、ERR) 継続 } //リンクは、クライアントで確立されている取扱事業 ゴーFUNC(){ {用 BUF:=メイク([]バイト、512) CNT、ERR:= conn.Read(BUF) !=無記号{IF ERR fmt.Println( "ERRのrecv BUF"、ERR)が 続行 } //エコー IF _、ERR = conn.Write(BUF![:CNT]); ERR =ゼロ{ fmt.Println( "BAK ERR BUF書き込み"、ERR) 継続 } } }() } }() //遮断状態 SELECT {} }
TCPクライアント
以下のための主要なパッケージ変更 のインポート( "FMT" "NET" 、"時間" ) FUNCメイン(){ //リンクを作成します。1つのリンク、リモートサーバ、リンクCONNを得る。 CONN、ERR:= net.Dial( "TCP"、「127.0.0.1 :8081 ") = nilの{IF ERR! fmt.Println(" ERRクライアントを起動し、終了「)! リターン } I:= 1 {のために 。//書き込み2書き込みデータリンクコール _、ERR:= conn.Write([ ]バイト(fmt.Sprintf( "%のS:%のD"、 "サーバーこんにちは"、I))) = nilの{IF ERR! fmt.Println( "書き込みコネティカットERR"、ERR) リターン } BUF:メイク=([ ]バイト、512) CNT、ERR = conn.Read(BUF) !IF ERR =ゼロ{ fmt.Println( ")「ERR bufを読んで 復帰 } fmt.Printf( "サーバー・コールバック:%S、CNT =%D \ n"は、BUF、CNT) I ++ time.Sleep(1) }