ความแตกต่างระหว่างการเขียนโปรแกรมซ็อกเก็ตและการเขียนโปรแกรม Http


คำตอบ:


109

HTTP เป็นโปรโตคอลของแอปพลิเคชัน โดยพื้นฐานแล้วหมายความว่าไม่สามารถใช้ HTTP เพื่อขนส่งข้อมูลไปยัง / จากจุดสิ้นสุดระยะไกลได้ แต่จะอาศัยโปรโตคอลพื้นฐานซึ่งในกรณีของ HTTP คือ TCP

ใส่คำอธิบายภาพที่นี่

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเลเยอร์ OSI ได้หากคุณสนใจ

ในทางกลับกันซ็อกเก็ตเป็น API ที่ระบบปฏิบัติการส่วนใหญ่มีให้เพื่อให้สามารถพูดคุยกับเครือข่ายได้ ซ็อกเก็ต API รองรับโปรโตคอลที่แตกต่างกันตั้งแต่เลเยอร์การขนส่งขึ้นไป

นั่นหมายความว่าหากคุณต้องการใช้ TCP คุณจะใช้ซ็อกเก็ต แต่คุณยังสามารถใช้ซ็อกเก็ตเพื่อสื่อสารโดยใช้ HTTP ได้ แต่คุณต้องถอดรหัส / เข้ารหัสข้อความตามข้อกำหนดของ HTTP ( RFC2616 ) เนื่องจากนั่นอาจเป็นงานที่ยิ่งใหญ่สำหรับนักพัฒนาส่วนใหญ่เราจึงมีลูกค้าที่พร้อมใช้งานในเฟรมเวิร์กสำหรับนักพัฒนาของเรา (เช่น. NET) เช่นWebClientหรือHttpWebRequestคลาส


2
ดังนั้นทั้งสองจึงใช้ TCP เพียงแค่นั้น HTTP ตอบสนองในรูปแบบที่กำหนดไว้ล่วงหน้าและซ็อกเก็ตจะให้ข้อมูลที่ส่งคืนจากปลายอีกด้านหนึ่งของซ็อกเก็ตใช่ไหม?
आनंद

4
อ๋อ TCP ตรวจสอบให้แน่ใจว่าทุกอย่างมาถึง (เลเยอร์การขนส่ง) และ HTTP จะบอกว่าเว็บแอปพลิเคชันควรทำอะไร
jgauffin

25

ด้วย HTTP คุณใช้โปรโตคอล HTTP ระดับสูง (ซึ่งทำงานบนซ็อกเก็ต) ไม่มีเซสชันซึ่งหมายความว่าคุณส่งคำขอข้อความเช่นGET google.comและรับข้อความหรือข้อมูลไบนารีในทางกลับกันหลังจากการเชื่อมต่อนั้นถูกปิด (ในการเชื่อมต่อแบบถาวรของ HTTP 1.1 จะพร้อมใช้งาน)

ตัวอย่าง MSDN:

public static void Main (string[] args)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create (args[0]);
    HttpWebResponse response = (HttpWebResponse)request.GetResponse ();

    Console.WriteLine ("Content length is {0}", response.ContentLength);
    Console.WriteLine ("Content type is {0}", response.ContentType);

    // Get the stream associated with the response.
    Stream receiveStream = response.GetResponseStream ();

    // Pipes the stream to a higher level stream reader with the required encoding format. 
    StreamReader readStream = new StreamReader (receiveStream, Encoding.UTF8);

    Console.WriteLine ("Response stream received.");
    Console.WriteLine (readStream.ReadToEnd ());
    response.Close ();
    readStream.Close ();
} 

ด้วยซ็อกเก็ตคุณจะอยู่ในระดับที่ต่ำกว่าและควบคุมการเชื่อมต่อและส่ง / รับไบต์ดิบ

ตัวอย่าง:

var remoteEndpoint=new IPEndPoint(IPAddress.Loopback, 2345);
var socket = new Socket(remoteEndpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(remoteEndpoint);
socket.Send(new byte[] {1, 2, 3, 4});

ไม่ได้ปิดการเชื่อมต่อจาก HTTP 1.1
Marquis of Lorne

@EJP: ขึ้นอยู่กับวิธีการConnectionตั้งค่าส่วนหัว;)
jgauffin

@jgauffin เป๊ะ. มันไม่ได้ปิดโดยเจตนา
Marquis of Lorne

จริง แต่นั่นคือรายละเอียด OP จะค้นพบตัวเองพร้อมกับข้อมูลอื่น ๆ 95% ในหัวข้อนี้
Anri

13

การเชื่อมต่อ HTTP

  • การเชื่อมต่อ HTTP เป็นโปรโตคอลที่ทำงานบนซ็อกเก็ต
  • การเชื่อมต่อ HTTP เป็นนามธรรมระดับสูงของการเชื่อมต่อเครือข่าย
  • ด้วยการเชื่อมต่อ HTTP การใช้งานจะดูแลรายละเอียดระดับสูงเหล่านี้ทั้งหมดและเพียงแค่ส่งคำขอ HTTP (ข้อมูลส่วนหัวบางส่วน) และรับการตอบสนอง HTTP จากเซิร์ฟเวอร์

การเชื่อมต่อซ็อกเก็ต

  • Socket ใช้ในการขนส่งข้อมูลระหว่างระบบ เพียงแค่เชื่อมต่อสองระบบเข้าด้วยกันที่อยู่ IP คือที่อยู่ของเครื่องผ่านเครือข่ายที่ใช้ IP
  • ด้วยการเชื่อมต่อซ็อกเก็ตคุณสามารถออกแบบโปรโตคอลของคุณเองสำหรับการเชื่อมต่อเครือข่ายระหว่างสองระบบ
  • ด้วยการเชื่อมต่อ Socket คุณต้องดูแลรายละเอียดระดับล่างทั้งหมดของการเชื่อมต่อ TCP / IP

1

การเขียนโปรแกรม HTTP หรือคำร้องขอ HTTP ใช้สำหรับการเชื่อมต่อแบบหลวม ๆ และ การสื่อสารด้วยเทคโนโลยีภาษาที่เป็นกลางของแพลตฟอร์มซึ่งเมื่อใช้การเขียนโปรแกรมซ็อกเก็ตที่ระบบมีโปรโตคอลข้อกำหนดภาษา


1
คุณหมายถึงอะไรตามภาษา? โปรแกรม Java สามารถสื่อสารกับโปรแกรมหลามผ่านซ็อกเก็ตตัวอย่างเช่น
อดัมฮิวจ์

ฉันคิดว่าสิ่งที่เขาหมายถึงก็คือโดยปกติแล้วหากคุณต้องการเชื่อมต่อกับระบบคู่ (หรือแตกต่างกันโดยสิ้นเชิง) HTTP มีประโยชน์: ส่วนหน้าที่สร้างขึ้นด้วยเทคโนโลยีบางอย่างที่มีการสร้างที่ได้รับการสนับสนุนด้วยเทคโนโลยีอื่นเข้าถึงทรัพยากรบนเว็บผ่าน URL ในขณะที่โดยปกติแล้วหากคุณใช้โปรโตคอลการเชื่อมต่อระดับล่างเช่น TCP / UDP คุณอาจกำลังเตรียมการสื่อสารกับระบบที่มีเทคโนโลยีที่คล้ายคลึงกัน (เช่นแอปพลิเคชัน Java ที่แตกต่างกัน) นี่ใช่มั้ย? ฉันพยายามทำความเข้าใจด้วยตัวเอง
Nicola Amadio

0

เพื่อให้จุดสิ้นสุดสองจุดสามารถพูดคุยกันได้ทั้งคู่ควรปฏิบัติตามกฎชุดหนึ่ง ในคอมพิวเตอร์ชุดของกฎเหล่านี้เรียกว่าโปรโตคอล

ตัวอย่างเช่นสำหรับปลายทางเช่นเบราว์เซอร์และอีกอย่างเช่นเว็บเซิร์ฟเวอร์ทั้งคู่ควรปฏิบัติตามชุดของกฎหรือโปรโตคอลที่เรียกว่า http เพื่อให้สามารถสื่อสารและแลกเปลี่ยนข้อมูลได้ ดังนั้นในเว็บทั่วโลกและการสื่อสารประเภทนี้มีเพียงผู้ที่พูดคุยตามโปรโตคอล http นี้เท่านั้นที่สามารถพูดคุยกันได้สำเร็จ

ซ็อกเก็ตเป็นเพียงจุดสิ้นสุด อาจเป็นไปตามโปรโตคอล http เพื่อสื่อสารใน www ในฐานะไคลเอนต์ที่ร้องขอเพจหรืออาจทำหน้าที่เป็นเซิร์ฟเวอร์ที่รับฟังการเชื่อมต่อ หรืออาจเป็นไปตามกฎหรือโปรโตคอลอื่นเช่น ssh, ftp และสื่อสารด้วยวิธีอื่น

ตอนนี้ในการเขียนโปรแกรมซ็อกเก็ตคุณสามารถสร้างซ็อกเก็ตเชื่อมโยงกับที่อยู่ IP และหมายเลขพอร์ตเพื่อทำหน้าที่เป็นหมายเลขพอร์ตและบอกให้ทำตาม http, ssh, ftp หรืออะไรก็ได้ที่คุณต้องการตามการสื่อสารที่คุณต้องการใช้ ซ็อกเก็ตสำหรับ.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.