برنامه نویسی سوکت (Socket Programming)

دسته بندی: مباحث عمومی

برنامه نویسی سوکت

در این صفحه می خوانید:

برنامه نویسی سوکت چیست؟

سوکت امکان ارتباط بین دو فرایند مختلف را در دستگاه های مشابه یا متفاوت فراهم می کند. به عبارت دیگر، روشی برای صحبت کردن با رایانه های دیگر با استفاده از توصیف گرهای استاندارد فایل یونیکس است. در یونیکس، هر عملI/ O با نوشتن یا خواندن یک توصیف گر فایل انجام می شود. یک توصیف گر فایل می تواند یک عدد صحیح با یک فایل باز باشد و می تواند یک اتصال شبکه، یک فایل متنی، یک ترمینال یا چیز دیگری باشد. برای یک برنامه نویس، سوکت مانند یک descriptor فایل سطح پایین رفتار می کند و به نظر می رسد. این به این دلیل است که دستوراتی مانند ()read و ()write با سوکت ها به همان شکلی که آنها با فایل ها و پایپ ها کار می کنند است. برنامه نویسی سوکت راهی برای اتصال دو گره در یک شبکه برای برقراری ارتباط با یکدیگر است. یک سوکت (گره) در یک درگاه خاص در IP گوش می دهد، تازمانی که سوکت دیگر برای ایجاد اتصال به دیگری می رسد. سرور تازمانی که کلاینت به سرور می رسد، سوکت شنونده را تشکیل می دهد.

کاربرد برنامه نویسی سوکت

سوکت یونیکس در فریمورک برنامه کاربردی سرور کلاینت استفاده می شود. یک سرور فرآیندی است که برخی از توابع را بر اساس درخواست یک کلاینت انجام می دهد. اکثر پروتکل های سطح برنامه مانند FTP ،SMTP و POP3 از سوکت ها برای برقراری ارتباط بین کلاینت و سرور و سپس برای تبادل اطلاعات استفاده می کنند. فرآیندهای استفاده از سوکت می توانند در همان سیستم یا سیستم های مختلف در شبکه های مختلف اقامت داشته باشند. سوکت ها برای برنامه های مستقل و شبکه مفید هستند. سوکت ها به شما امکان می دهند تا بین پردازش ها در همان دستگاه یا در یک شبکه، تبادل اطلاعات، کار را به کارآمدترین دستگاه توزیع کنید و به راحتی اجازه دسترسی به داده های متمرکز را می دهند. رابط برنامه های کاربردی سوکت (API) استاندارد شبکه برای TCP/IP است. طیف گسترده ای از سیستم عامل ها از API های سوکت پشتیبانی می کنند. سوکت IBM از چندین انتقال و پروتکل های شبکه پشتیبانی می کند. توابع سیستم سوکت و توابع شبکه سوکت به صورت موضوعی هستند.

معماری برنامه نویسی سوکت

سوکت ها معمولاً برای تعامل کلاینت و سرور استفاده می شوند. پیکربندی سیستم معمولی سرور را روی یک دستگاه قرار می دهد و کلاینت ها در دستگاه های دیگر قرار دارند. کلاینت ها به سرور وصل می شوند، اطلاعات را تبادل می کنند و سپس قطع می شوند. یک سوکت جریان معمولی از وقایع را دارد. در یک مدل سرویس گیرنده به سرور متصل، سوکت در فرآیند سرور منتظر درخواست های کلاینت می باشد. برای انجام این کار، سرور ابتدا آدرسی را ایجاد می کند که می توانند از آنها برای پیدا کردن سرور استفاده کنند. هنگامی که آدرس ایجاد شد، سرور منتظر است تا سرویس دهندگان سرویس را درخواست کنند. تبادل داده کلاینت-سرور هنگامی انجام می شود که کلاینت از طریق سوکت به سرور متصل شود. سرور درخواست کلاینت را انجام داده و پاسخ را به کلاینت ارسال می کند.

شکل زیر جریان معمولی وقایع (و توالی API های صادر شده) برای یک جلسه سوکت اتصال گرا را نشان می دهد. توضیحی درباره هر رویداد از شکل زیر پیروی می کند.

معماری برنامه نویسی سوکت

این یک جریان معمولی برای یک سوکت اتصال گرا است:

  • socket() API یک نقطه پایانی برای ارتباطات ایجاد می کند و توصیف کننده سوکت را نشان می دهد که نقطه انتهایی را نشان می دهد.
  • وقتی یک برنامه دارای توصیف کننده سوکت است، می تواند یک نام منحصر به فرد را به سوکت وصل کند. سرورها باید نامی را برای دسترسی به شبکه پیوند دهند.
  • listen() API نشان دهنده تمایل به پذیرش درخواست های اتصال کلاینت است. هنگامی که یک listen() API  برای یک سوکت صادر می شود، آن سوکت نمی تواند درخواست های اتصال را به طور فعال آغاز کند. listen() API پس از اختصاص سوکت با socket() API صادر می شود و () API bind اتصال به یک نام به سوکت صادر می شود. قبل از انتشار accept()API بایدlisten() API صادر شود.
  • برنامه کلاینت برای ایجاد اتصال به سرور از ()API connect در یک سوکت جریان استفاده می کند.
  • برنامه سرور برای پذیرش درخواست اتصال کلاینت از()API accept استفاده می کند. قبل از اینکه API را بپذیرد، سرور باید API های ()bind و ()API listenرا بطور موفقیت آمیز منتشر کند.
  • هنگامی که اتصال بین سوکت های جریان (بین کلاینت و سرور) برقرار شد، می توانید از هرکدام از API های انتقال داده API سوکت استفاده کنید. کلاینت ها و سرورها API های زیادی برای انتقال داده دارند که از آن می توان انتخاب کرد، مانند()send() ،recv() ،read() ،write و موارد دیگر. هنگامی که یک سرور یا کلاینت می خواهد عملیات را متوقف کند،()API close را برای انتشار منابع سیستم به دست آمده توسط سوکت صادر می کند.

برنامه نویسی سوکت در پایتون

ماژول سوکت پایتون واسط API سوکت های Berkeley را فراهم می کند. توابع و متد های اصلی API سوکت در این ماژول عبارتند از:

  • ()socket
  • ()bind
  • ()listen
  • ()accept
  • ()connect
  • ()connect_ex
  • ()send
  • ()recv
  • ()close

پایتون یک API مناسب و مداوم فراهم می کند که در تماس های سیستمی شبیه C آنها را نقشه برداری می کند. پایتون به عنوان بخشی از کتابخانه استاندارد خود کلاس هایی نیز دارد که استفاده از این توابع سطح پایین سوکت را آسان تر می کند. ماژول سرور سوکت، فریمورکی برای سرورهای شبکه را ببینید. همچنین بسیاری از ماژول ها در دسترس هستند که پروتکل های اینترنتی سطح بالاتری مانند HTTP و SMTP را پیاده سازی می کنند.

#!/usr/bin/env python3

import socket

HOST = '127.0.0.1' # Standard loopback interface address (localhost) PORT = 65432 # Port to listen on (non-privileged ports are > 1023)

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind((HOST, PORT)) s.listen() conn, addr = s.accept() with conn: print('Connected by', addr) while True: data = conn.recv(1024) if not data: break conn.sendall(data)

برنامه نویسی سوکت در سی شارپ

پیش نیازها برای برنامه نویسی سوکت با سی شارپ عبارتند از:

  • باید با NET Framework. آشنا باشد.
  • باید از #C دانش خوبی داشته باشد.
  • دانش اساسی برنامه نویسی سوکت.

ارتباطات درون فرایندی یعنی توانایی دو یا چند دستگاه متصل به لحاظ جسمی برای تبادل داده، نقش بسیار مهمی در توسعه نرم افزار سازمانی ایفا می کند. TCP / IP رایج ترین استاندارد اتخاذ شده برای چنین ارتباطاتی است. تحت TCP / IP ، هر دستگاه توسط یک عدد صحیح 4 بایت که آدرس IP آن نامیده می شود (معمولاً با فرمت 192.168.0.101 فرمت می شود) شناسایی می شود. برای یادآوری آسان، این آدرس IP بیشتر به یک نام میزبان کاربر پسند محدود است. برنامه زیر (showip.cs) از کلاس System.Net.Dns برای نمایش آدرس IP دستگاهی که نام آن در اولین آرگومان خط فرمان منتقل می شود، استفاده می کند. در صورت عدم وجود آرگومان های خط فرمان، نام و آدرس IP دستگاه محلی را نشان می دهد. برنامه Socket Server از طریق یک برنامه مبتنی بر کنسول #C انجام می شود. در اینجا سرور درخواست کلاینت را گوش می دهد و هنگامی که سرور #C درخواستی را از سوکت Client دریافت کند، سرور پاسخی را به Client ارسال می کند.

برنامه نویسی سوکت کلاینت

// A C# program for Client 
using System; 
using System.Net; 
using System.Net.Sockets; 
using System.Text; 

namespace Client {

class Program {

// Main Method static void Main(string[] args) { ExecuteClient(); }

// ExecuteClient() Method static void ExecuteClient() {

try {

// Establish the remote endpoint // for the socket. This example // uses port 11111 on the local // computer. IPHostEntry ipHost = Dns.GetHostEntry(Dns.GetHostName()); IPAddress ipAddr = ipHost.AddressList[0]; IPEndPoint localEndPoint = new IPEndPoint(ipAddr, 11111);

// Creation TCP/IP Socket using // Socket Class Costructor Socket sender = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

try {

// Connect Socket to the remote // endpoint using method Connect() sender.Connect(localEndPoint);

// We print EndPoint information // that we are connected Console.WriteLine("Socket connected to -> {0} ", sender.RemoteEndPoint.ToString());

// Creation of messagge that // we will send to Server byte[] messageSent = Encoding.ASCII.GetBytes("Test Client<EOF>"); int byteSent = sender.Send(messageSent);

// Data buffer byte[] messageReceived = new byte[1024];

// We receive the messagge using // the method Receive(). This // method returns number of bytes // received, that we'll use to // convert them to string int byteRecv = sender.Receive(messageReceived); Console.WriteLine("Message from Server -> {0}", Encoding.ASCII.GetString(messageReceived, 0, byteRecv));

// Close Socket using // the method Close() sender.Shutdown(SocketShutdown.Both); sender.Close(); }

// Manage of Socket's Exceptions catch (ArgumentNullException ane) {

Console.WriteLine("ArgumentNullException : {0}", ane.ToString()); }

catch (SocketException se) {

Console.WriteLine("SocketException : {0}", se.ToString()); }

catch (Exception e) { Console.WriteLine("Unexpected exception : {0}", e.ToString()); } }

catch (Exception e) {

Console.WriteLine(e.ToString()); } } } }

برنامه نویسی سوکت سرور

// A C# Program for Server 
using System; 
using System.Net; 
using System.Net.Sockets; 
using System.Text; 

namespace Server {

class Program {

// Main Method static void Main(string[] args) { ExecuteServer(); }

public static void ExecuteServer() { // Establish the local endpoint // for the socket. Dns.GetHostName // returns the name of the host // running the application. IPHostEntry ipHost = Dns.GetHostEntry(Dns.GetHostName()); IPAddress ipAddr = ipHost.AddressList[0]; IPEndPoint localEndPoint = new IPEndPoint(ipAddr, 11111);

// Creation TCP/IP Socket using // Socket Class Costructor Socket listener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

try {

// Using Bind() method we associate a // network address to the Server Socket // All client that will connect to this // Server Socket must know this network // Address listener.Bind(localEndPoint);

// Using Listen() method we create // the Client list that will want // to connect to Server listener.Listen(10);

while (true) {

Console.WriteLine("Waiting connection ... ");

// Suspend while waiting for // incoming connection Using // Accept() method the server // will accept connection of client Socket clientSocket = listener.Accept();

// Data buffer byte[] bytes = new Byte[1024]; string data = null;

while (true) {

int numByte = clientSocket.Receive(bytes);

data += Encoding.ASCII.GetString(bytes, 0, numByte);

if (data.IndexOf("<EOF>") > -1) break; }

Console.WriteLine("Text received -> {0} ", data); byte[] message = Encoding.ASCII.GetBytes("Test Server");

// Send a message to Client // using Send() method clientSocket.Send(message);

// Close client Socket using the // Close() method. After closing, // we can use the closed Socket // for a new Client Connection clientSocket.Shutdown(SocketShutdown.Both); clientSocket.Close(); } }

catch (Exception e) { Console.WriteLine(e.ToString()); } } } }

برنامه نویسی سوکت در سی پلاس پلاس

سی پلاس پلاس یک زبان برنامه نویسی شی گرا است که برای اولین بار توسط Bjarne Stroustrup ساخته شده است. در ابتدا ایجاد شده است تا یک زبان فرمت C، که یک زبان سطح متوسط است، و این ریشه ها امروزه نیز وجود دارند. ++C می تواند به سبک شی گرا یا به سبک C توسعه داده شود و آن را به یک زبان واقعاً ترکیبی تبدیل کند. همچنین می توانید با استفاده از فریمورک های Qt یا Cinder برنامه های دسکتاپ مستقل از پلتفرم را در ++C ایجاد کنید. ++C به دلیل سرعت و کارایی که در جدول دارد، ممکن است بهترین انتخاب در این زمینه باشد. برخی ممکن است با این جمله به دلیل پیچیدگی ضمنی این زبان موافق نباشند، از جمله محدود بودن در مدیریت حافظه دستی، نحو قالب، ناسازگاری کتابخانه، کامپایلر و غیره. اما من فکر می کنم متفاوت باشد. ++C به شما امکان وارد شدن در عمق را می دهد و بینش هایی را که در واقع در سطح پایین جریان دارد.

در اینجا ما در حال تبادل یک پیام سلام بین سرور و کلاینت برای نشان دادن مدل کلاینت/سرور هستیم.

مثال برنامه نویسی سوکت سرور

// Server side C/C++ program to demonstrate Socket programming 
#include <unistd.h> 
#include <stdio.h> 
#include <sys/socket.h> 
#include <stdlib.h> 
#include <netinet/in.h> 
#include <string.h> 
#define PORT 8080 
int main(int argc, char const *argv[]) 
{ 
	int server_fd, new_socket, valread; 
	struct sockaddr_in address; 
	int opt = 1; 
	int addrlen = sizeof(address); 
	char buffer[1024] = {0}; 
	char *hello = "Hello from server"; 

// Creating socket file descriptor if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); }

// Forcefully attaching socket to the port 8080 if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { perror("setsockopt"); exit(EXIT_FAILURE); } address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons( PORT );

// Forcefully attaching socket to the port 8080 if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) { perror("bind failed"); exit(EXIT_FAILURE); } if (listen(server_fd, 3) < 0) { perror("listen"); exit(EXIT_FAILURE); } if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) { perror("accept"); exit(EXIT_FAILURE); } valread = read( new_socket , buffer, 1024); printf("%s\n",buffer ); send(new_socket , hello , strlen(hello) , 0 ); printf("Hello message sent\n"); return 0; }

مثال برنامه نویسی سوکت کلاینت

// Client side C/C++ program to demonstrate Socket programming 
#include <stdio.h> 
#include <sys/socket.h> 
#include <arpa/inet.h> 
#include <unistd.h> 
#include <string.h> 
#define PORT 8080 

int main(int argc, char const *argv[]) { int sock = 0, valread; struct sockaddr_in serv_addr; char *hello = "Hello from client"; char buffer[1024] = {0}; if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("\n Socket creation error \n"); return -1; }

serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT);

// Convert IPv4 and IPv6 addresses from text to binary form if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0) { printf("\nInvalid address/ Address not supported \n"); return -1; }

if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { printf("\nConnection Failed \n"); return -1; } send(sock , hello , strlen(hello) , 0 ); printf("Hello message sent\n"); valread = read( sock , buffer, 1024); printf("%s\n",buffer ); return 0; }

برنامه نویسی سوکت در جاوااسکریپت

حالا بیایید مکالمه مربوط به اتصالات شبکه، پروتکل ها و سوکت ها را با صحبت کردن در مورد ابزارهای جاوااسکریپت و WebSockets که همه چیز را گرد هم می آورد، به پایان برسانیم، WebSockets به ما این امکان را می دهد که بازی های چند نفره بسیار جذاب را به زبان وب برنامه ریزی کنیم.

پروتکل WebSocket

مرورگرهای مدرن و سایر محیط های اجرا JavaScript پروتکل WebSocket را در JavaScript پیاده سازی کرده اند. به اشتباه فکر نکنید که فقط به دلیل اینکه می توانیم اشیاء WebSocket را در JavaScript ایجاد کنیم، WebSockets بخشی از JavaScript است. استانداردی که پروتکل WebSocket را تعریف می کند زبان آگونیستی است و می تواند به هر زبان برنامه نویسی پیاده سازی شود. بنابراین، قبل از شروع به کار کردن بازی های JavaScript خود که از WebSockets استفاده می کنند، اطمینان حاصل کنید که محیطی که بازی شما را اجرا خواهد کرد از پیاده سازی استاندارد ECMA استفاده می کند و همچنین WebSockets را پیاده سازی می کند. به عبارت دیگر، همه مرورگرها نمی خواهند هنگام درخواست اتصال به WebSocket چه کاری انجام دهند.

با این حال، بیشترین نسخه جدید، از این نوشتار، از پرطرفدارترین مرورگرهای امروز (یعنی Google Chrome ،Safari ،Mozilla Firefox ،Opera و Internet Explorer) آخرین نسخه فعلی RFC 6455 را اجرا می کنند. نسخه های قبلی WebSockets (مانند نسخه پروتکل - 76 ، 7 یا 10) به آرامی از بین می روند و توسط برخی از مرورگرهای قبلاً ذکر شده حذف می شوند. به خاطر داشته باشید که باید کلاینت های JavaScript که از WebSockets برای مصرف داده استفاده می کنند و همچنین سرور WebSocket را که از WebSockets استفاده می کند اما نقش سرور را ایفا می کند، را برنامه نویسی کنید. اختلاف در بین این دو وقتی آشکار می شود که به برخی از نمونه ها را عملی انجام می شود.

ایجاد یک WebSocket سمت کلاینت

قطعه کد زیر یک شی جدید از نوع WebSocket ایجاد می کند که کلاینت را به برخی از سرورهای بک اند متصل می کند. سازنده دو پارامتر را در نظر می گیرد. اولین مورد نیاز است و URL را نشان می دهد که سرور WebSocket در حال اجرا است و انتظار اتصالات را دارد. URL دوم، که در اینجا استفاده نشده، یک لیست اختیاری از پروتکل های فرعی است که ممکن است سرور پیاده سازی کند.

var socket = new WebSocket('ws://www.game-domain.com');

آیا این نوشته را دوست داشتید؟