Lập trình socket: dữ liệu sẽ truyền đi như thế nào?

Cho mình hỏi lập trình socket trong các ngôn ngữ như Java và c# thì dữ liệu sẽ truyền đi kiểu gì ,thông qua gì và máy tính sẽ nhận nó ở chỗ nào không chỉ mình với mình đọc tài liệu nhưng tài liệu không nói về cái này.Làm mình cứ lập trình mà không hiểu về bản chất truyền nhận của nó.

Mình mô tả đơn giản thế này, socket giống như một bộ đệm mà dữ liệu vào ra. Sẽ có dữ liệu ghi vào, rồi bạn đọc ra từ đó. Các bước sử dụng là bạn khai báo rồi mở một socket, cột (bind) socket đó với thiết bị phần cứng nào, ví dụ như mạng, bluetooth, hay đơn giản một thiết bị ảo nào đó. Bạn có thể cài đặt các tuỳ chỉnh của socket đó như đọc theo luồng, đọc đồng bộ… Sau đó là bạn ghi dữ liệu vào socket đó, nó sẽ tự động ghi xuống thiết bị phần cứng và ngược lại. Cuối cùng khi không dùng thì bạn đóng socket

1 Like

Socket là một khái niệm logic (không phải thật), so sánh với bộ đệm thì cũng hơi khiên cưỡng 1 chút.

Mô tả một chút về socket:

  • Socket (nghĩa là cái phích cắm) thường được dùng khi nói về truyền nhận dữ liệu giữa các app # nhau (có thể ở local hoặc remote: ví dụ như MySQL server và WorkBench chẳng hạn, có thể thiết lập 1 UNIX socket (local) hoặc giữa WebServer và Browser (remote). Tuy nhiên, chắc cái mà bạn hỏi chủ yếu liên quan tới lập trình mạng (Network socket - remote), hiện giờ thì đa phần network socket dựa trên giao thức Internet Protocol -> gọi là Internet socket.
  • Socket hoạt động giống như cái phích điện (gọi là end-point). Ngoài sử dụng socket để truyền dữ liệu thì cũng có nhiều phương thức # nữa (socket được đưa ra vì các ngôn ngữ # nhau, OS # nhau muốn nói chuyện phải có 1 qui chuẩn, ví dụ như bạn người Lào, muốn nói với ông Việt Nam thì phải dùng qui chuẩn là sign language chẳng hạn). Trong lập trình cái này gọi là network API (do hệ điều hành cung cấp). Đa phần Internet Socket API hiện nay được dựa trên bản phác thảo Berkeley standard.
  • Muốn truyền dữ liệu giữa 2 app, nhất là server->client và do server thường phục vụ nhiều client cùng 1 lúc nên phải có 1 ID để xác định cần truyền cho client nào, do đó khái niệm socket tuple ra đời, nó gồm.
    SourceIP, port, DestinationIP, port (chú ý: port cũng chỉ là một khái niệm logic nhé)
    Ví dụ: 1 pair socket truyền từ server sang client: 192.168.185.129:80, 10.10.20.14:12345.
    Socket chỉ là 1 khái niệm logic, nên 1 app server có thể được cắm rất nhiều phích cung cấp data cho rất nhiều app client.

Trở lại với câu hỏi của bạn:

  • Dữ liệu sẽ truyền đi kiểu gì? cái này chắc bạn sẽ phải tìm hiểu về mô hình mạng 7 tầng và transportation layer như thế nào? Cách OS implement 7 tầng này ra làm sao (nhận gửi header, hand-shake). Tuy nhiên, bạn có thể hiểu đơn giản như cái phích cắm điện/vòi nước, ở đó remote đẩy dữ liệu ra vòi nước, còn client nhận dữ liệu từ cái tuple mà ở cuối tuple là một cái vòi #.
  • Thông qua gì? thông qua giao thức (protocol) hay còn gọi là cách thức nhận, ví dụ như vòi nước thì bạn phải dùng xô mà nhận.
  • Máy tính nhận chỗ nào? cái này thì liên quan tới vật lý, khi gửi dữ liệu (là các chuỗi binary 0,1)->xung điện truyền->nhận tín hiệu->dịch ngược thành data binary. Các dữ liệu này sẽ tất nhiên là sẽ được nạp, lưu trên RAM trong quá trình app hoạt động.

PS: Java/ C# thường họ đã viết app implement socket API rồi nên bạn chỉ cần dùng thôi. Cách dùng là tạo 2 socket: 1 remote, 1 client, sau đó remote dẩy (thường được gọi là ghi vì cũng giống như vào ra của file, đối với UNIX thuyết thì tất cả đều được gọi là file. Nếu làm việc trên linux, bạn sẽ thấy các file như mysql.socket, … tuy nhiên nó không phải là file thật và cũng chẳng có gì ghi vào đó cả. Data sẽ sống trên RAM) dữ liệu qua socket remote -> chạy qua tuple tới socket client-> client đọc (giống với khái niệm ghi) đống data này.

Thêm 1 ý nữa là: socket pair thì giao tiếp là 2 chiều, nhưng 1 action thì phải có 1 thằng ghi và 1 thằng nhận. Do đó, không bao giờ app server và app client cùng ghi vào socket cả (cái này phải dùng cơ chế queue/bắt tay), cũng giống như một ống nước, 2 ông cùng đẩy nước vào ống thì ống chỉ có mà vỡ.

9 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?