Bagaimana untuk melaksanakan tcp dalam golang

PHPz
Lepaskan: 2023-04-23 13:46:13
asal
1107 orang telah melayarinya

Golang ialah bahasa pengaturcaraan yang cekap dan boleh dipercayai Sokongan serentak terbina dalam dan prestasi cemerlang telah menarik ramai pembangun untuk menyertainya. Protokol TCP ialah salah satu protokol komunikasi yang paling penting dalam rangkaian komputer, dan pelaksanaannya memerlukan banyak kemahiran dan pengalaman. Artikel ini akan memperkenalkan cara menggunakan Golang untuk melaksanakan klien dan pelayan TCP, termasuk cara mewujudkan sambungan, menghantar dan menerima data serta pengendalian ralat.

1. Pengetahuan asas tentang TCP

Protokol TCP (Transmission Control Protocol) ialah protokol penghantaran berasaskan aliran bait yang boleh dipercayai, berorientasikan sambungan. Ia dicirikan oleh penghantaran data yang teratur, tiada kehilangan, tiada pertindihan, tiada ralat, dan menyokong komunikasi dupleks penuh Kedua-dua pihak dalam penghantaran data boleh menghantar dan menerima data pada bila-bila masa. Semasa membangunkan aplikasi, kami biasanya menggunakan protokol TCP untuk menghantar data, seperti menyambung ke pangkalan data, menghantar e-mel, menyemak imbas tapak web, dsb.

Dalam protokol TCP, kedua-dua hujung komunikasi masing-masing dipanggil "klien" dan "pelayan" Pelanggan secara aktif memulakan permintaan sambungan ke pelayan, dan pelayan bertindak balas kepada sambungan selepas menerima permintaan. Sambungan TCP diwujudkan. Selepas sambungan diwujudkan, pelanggan boleh menghantar data ke pelayan melalui sambungan, dan pelayan juga boleh menghantar data kepada klien melalui sambungan. Selepas menyelesaikan pemindahan data, sambungan perlu ditutup secara eksplisit.

2. Pelaksanaan klien TCP

Sangat mudah untuk melaksanakan klien TCP di Golang Langkah-langkah khusus adalah seperti berikut:

  1. Buat sambungan TCP
  2. .

Buat sambungan TCP menggunakan fungsi "Dail" dalam pakej "bersih" Golang.

conn, err := net.Dial("tcp", "127.0.0.1:8080")
if err != nil {
    fmt.Println("Failed to connect to server:", err)
    return
}
defer conn.Close()
Salin selepas log masuk
Salin selepas log masuk

Parameter pertama fungsi "Dail" menentukan jenis protokol untuk disambungkan kepada (tcp atau udp), dan parameter kedua menentukan alamat IP dan nombor port pelayan. Jika sambungan berjaya, objek sambungan jenis "net.Conn" akan dikembalikan, jika tidak ralat akan dikembalikan.

  1. Hantar data

Selepas membuat sambungan, kami boleh menghantar data ke pelayan. Data boleh dihantar menggunakan kaedah "Tulis" objek "Conn". Parameter kaedah ini ialah tatasusunan bait.

data := []byte("Hello, server!")
_, err := conn.Write(data)
if err != nil {
    fmt.Println("Failed to send data to server:", err)
    return
}
Salin selepas log masuk

Nilai pulangan kaedah "Tulis" ialah bilangan bait yang ditulis, yang boleh kita gunakan untuk menentukan sama ada data dihantar dengan jayanya.

  1. Terima data

Selepas menghantar data ke pelayan, kita perlu menunggu maklum balas pelayan. Data boleh diterima menggunakan kaedah "Baca" objek "Conn". Parameter kaedah ini ialah tatasusunan bait, dan nilai pulangan ialah bilangan bait yang diterima.

buffer := make([]byte, 1024)
n, err := conn.Read(buffer)
if err != nil {
    fmt.Println("Failed to receive data from server:", err)
    return
}
fmt.Println("Received from server:", string(buffer[:n]))
Salin selepas log masuk

Data yang diterima disimpan dalam tatasusunan bait dan kami boleh menukarnya kepada rentetan melalui fungsi "rentetan".

  1. Tutup sambungan

Apabila kami melengkapkan pemindahan data, kami perlu menutup sambungan secara eksplisit untuk melepaskan sumber.

conn.Close()
Salin selepas log masuk
Salin selepas log masuk

Perlu diingatkan bahawa pernyataan "tunda" harus digunakan untuk menutup sambungan pada penghujung fungsi untuk memastikan sambungan ditutup secara automatik selepas fungsi tersebut dilaksanakan.

3. Pelaksanaan pelayan TCP

Ia juga sangat mudah untuk melaksanakan pelayan TCP di Golang Langkah-langkah khusus adalah seperti berikut:

  1. Buat pendengar
Gunakan fungsi "Listen" dalam pakej "net" untuk mencipta pendengar pelayan TCP.

listener, err := net.Listen("tcp", "127.0.0.1:8080")
if err != nil {
    fmt.Println("Failed to start server:", err)
    return
}
defer listener.Close()
Salin selepas log masuk
Parameter pertama fungsi "Listen" menentukan jenis protokol untuk didengari (tcp atau udp), dan parameter kedua menentukan alamat IP dan nombor port pelayan. Jika permulaan berjaya, objek mendengar jenis "net.Listener" akan dikembalikan, jika tidak ralat akan dikembalikan.

    Mewujudkan sambungan
Apabila pelanggan meminta sambungan, anda boleh menggunakan kaedah "Terima" objek "Pendengar" untuk mewujudkan sambungan.

conn, err := listener.Accept()
if err != nil {
    fmt.Println("Failed to accept connection:", err)
    break
}
defer conn.Close()
Salin selepas log masuk
Kaedah "Terima" akan menyekat pelaksanaan program sehingga permintaan sambungan diterima. Apabila sambungan berjaya diwujudkan, objek sambungan jenis "net.Conn" akan dikembalikan, jika tidak ralat akan dikembalikan.

    Terima data
Apabila sambungan berjaya diwujudkan, pelayan boleh menerima data yang dihantar oleh pelanggan. Data boleh diterima menggunakan kaedah "Baca" objek "Conn".

buffer := make([]byte, 1024)
n, err := conn.Read(buffer)
if err != nil {
    fmt.Println("Failed to receive data from client:", err)
    break
}
fmt.Println("Received from client:", string(buffer[:n]))
Salin selepas log masuk
Data yang diterima disimpan dalam tatasusunan bait dan kami boleh menukarnya kepada rentetan melalui fungsi "rentetan".

    Hantar data
Selepas pelayan menerima data, ia boleh menggunakan kaedah "Tulis" objek "Conn" untuk menghantar data kepada klien.

data := []byte("Hello, client!")
_, err = conn.Write(data)
if err != nil {
    fmt.Println("Failed to send data to client:", err)
    break
}
Salin selepas log masuk
Nilai pulangan kaedah "Tulis" ialah bilangan bait yang ditulis, yang boleh kita gunakan untuk menentukan sama ada data dihantar dengan jayanya.

    Tutup sambungan
Apabila pertukaran data dengan pelanggan selesai, sambungan perlu ditutup secara eksplisit untuk mengeluarkan sumber.

conn.Close()
Salin selepas log masuk
Salin selepas log masuk
Perlu diingatkan bahawa jika kita menggunakan gelung "untuk", pernyataan "tunda" hendaklah diletakkan di luar gelung "untuk" untuk memastikan sumber dikeluarkan secara seragam selepas semua sambungan ditutup.

4. Pengendalian ralat

Pengendalian ralat amat penting apabila menggunakan protokol TCP untuk komunikasi data. Di Golang, anda boleh menggunakan jenis "ralat" untuk mewakili keadaan ralat yang mungkin dalam nilai pulangan fungsi.

Dalam pelaksanaan klien dan pelayan TCP, kami perlu melakukan pengendalian ralat untuk operasi seperti sambungan, penghantaran dan penerimaan data. Biasanya, kita boleh menggunakan pernyataan "if err != nil" untuk menentukan sama ada fungsi mengembalikan ralat dan mengendalikannya dengan sewajarnya apabila ralat berlaku.

Sebagai contoh, dalam pelaksanaan klien TCP, kita boleh menggunakan kod berikut untuk menentukan sama ada sambungan berjaya diwujudkan:

conn, err := net.Dial("tcp", "127.0.0.1:8080")
if err != nil {
    fmt.Println("Failed to connect to server:", err)
    return
}
defer conn.Close()
Salin selepas log masuk
Salin selepas log masuk

如果连接建立失败,将打印错误信息并退出程序。

在TCP服务器实现中,如果在接收数据时发生了错误,我们应该关闭连接并退出循环。

n, err := conn.Read(buffer)
if err != nil {
    fmt.Println("Failed to receive data from client:", err)
    break
}
Salin selepas log masuk

以上只是TCP客户端和服务器的基本实现方法,开发者可以根据实际需求进行更加复杂的实现,比如多连接、并发、SSL加密等。Golang的高并发和轻量级特性使得它适合于TCP服务器等高并发场景的开发。

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan tcp dalam golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!