socket详解

news/2024/11/23 9:37:15/

目录

socket:

套接字的工作原理:

套接字类型: 套接字可以分为两种类型:流套接字(Socket Stream)和数据报套接字(Socket Datagram)。

创建套接字:

绑定套接字到地址和端口:

监听连接请求:

接受连接:

发送和接收数据:

Python示例:

Java示例:

c++示例:


socket:

在计算机编程中,"socket"(套接字)是一种用于网络通信的编程接口。它允许不同计算机上的进程(或程序)通过网络进行通信和交换数据。

套接字提供了一种标准化的方法,使不同的计算机之间可以建立连接并在连接上进行数据传输。它可以在不同的网络层次上操作,如传输层(例如TCP和UDP)或网络层(例如IP)。

通过套接字编程接口,开发人员可以创建客户端和服务器应用程序,实现网络通信。套接字提供了一组函数(通常是系统调用),这些函数可以用于创建、绑定、连接、监听和发送/接收数据等操作。

在套接字编程中,服务器套接字等待客户端的连接请求,而客户端套接字尝试连接到服务器。一旦连接建立,客户端和服务器可以通过套接字进行双向通信。

套接字可以用于各种网络通信场景,如网页浏览器与服务器之间的通信、聊天应用程序、文件传输和远程登录等。

套接字的工作原理:

套接字是通过在网络上建立连接,允许不同计算机上的进程进行通信和数据交换。它通过一系列的操作实现这一功能,包括创建套接字、绑定地址和端口、监听连接请求、接受连接、发送和接收数据等。

套接字类型: 套接字可以分为两种类型:流套接字(Socket Stream)和数据报套接字(Socket Datagram)。

  • 流套接字:也称为面向连接的套接字(Connection-oriented Socket),使用传输控制协议(TCP)作为其传输协议。流套接字提供了一种可靠的、基于连接的数据传输方式,确保数据按顺序到达,并提供差错检测和重传机制。

  • 数据报套接字:也称为无连接套接字(Connectionless Socket),使用用户数据报协议(UDP)作为其传输协议。数据报套接字提供了一种无连接、不可靠的数据传输方式。它适用于需要较低延迟和较少的开销的应用程序,但不提供数据的可靠性保证。

创建套接字:

创建套接字是使用套接字编程的第一步。创建套接字的过程包括选择协议(如TCP或UDP)和指定套接字类型(流套接字或数据报套接字)。创建套接字后,你可以使用该套接字进行进一步的操作。

绑定套接字到地址和端口:

在使用套接字之前,通常需要将其绑定到一个特定的地址和端口上。这是为了使其他进程能够通过指定的地址和端口找到该套接字。绑定套接字是通过指定IP地址和端口号来完成的。

监听连接请求:

当创建了一个套接字,并将其绑定到地址和端口上后,你可以开始监听连接请求。这意味着套接字会开始等待来自其他进程的连接请求。一旦有连接请求到达,你可以决定是否接受连接。

接受连接:

当套接字处于监听状态时,你可以接受连接请求。接受连接后,将创建一个新的套接字来处理该连接,并与客户端建立连接。

发送和接收数据:

一旦连接建立,你可以使用套接字发送和接收数据。通过套接字,你可以发送数据到远程计算机,或从远程计算机接收数据。发送和接收数据可以使用套接字提供的相应函数或方法来完成。

这些是套接字编程中的一些基本操作和概念。了解这些原理和操作可以帮助你编写网络应用程序并进行网络通信。具体的实现方法和

语法可能会因编程语言而异,下面是一些常见编程语言中套接字编程的示例:

Python示例:

import socket# 创建TCP套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 绑定套接字到地址和端口
server_address = ('localhost', 8000)
sock.bind(server_address)# 监听连接请求
sock.listen(1)while True:# 等待客户端连接print('等待连接...')connection, client_address = sock.accept()try:print('连接来自:', client_address)# 接收数据data = connection.recv(1024)print('接收到的数据:', data.decode())# 发送数据message = 'Hello, client!'connection.sendall(message.encode())finally:# 关闭连接connection.close()

Java示例:

import java.io.*;
import java.net.*;public class Server {public static void main(String[] args) throws IOException {// 创建ServerSocket对象ServerSocket serverSocket = new ServerSocket(8000);while (true) {System.out.println("等待连接...");// 等待客户端连接Socket clientSocket = serverSocket.accept();System.out.println("连接来自: " + clientSocket.getInetAddress());try {// 获取输入流和输出流BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);// 接收数据String inputLine = in.readLine();System.out.println("接收到的数据: " + inputLine);// 发送数据out.println("Hello, client!");} finally {// 关闭连接clientSocket.close();}}}
}

c++示例:

#include <iostream>
#include <string>
#include <cstring>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <unistd.h>const int PORT = 8000;
const int BUFFER_SIZE = 1024;int main() {// 创建服务器套接字int serverSocket = socket(AF_INET, SOCK_STREAM, 0);if (serverSocket == -1) {std::cerr << "Failed to create socket." << std::endl;return -1;}// 设置服务器地址sockaddr_in serverAddress{};serverAddress.sin_family = AF_INET;serverAddress.sin_addr.s_addr = INADDR_ANY;serverAddress.sin_port = htons(PORT);// 绑定套接字到地址和端口if (bind(serverSocket, reinterpret_cast<sockaddr*>(&serverAddress), sizeof(serverAddress)) == -1) {std::cerr << "Failed to bind socket to address and port." << std::endl;close(serverSocket);return -1;}// 监听连接请求if (listen(serverSocket, 1) == -1) {std::cerr << "Failed to listen for connections." << std::endl;close(serverSocket);return -1;}std::cout << "Server is listening for connections..." << std::endl;// 等待客户端连接sockaddr_in clientAddress{};socklen_t clientAddressLength = sizeof(clientAddress);int clientSocket = accept(serverSocket, reinterpret_cast<sockaddr*>(&clientAddress), &clientAddressLength);if (clientSocket == -1) {std::cerr << "Failed to accept client connection." << std::endl;close(serverSocket);return -1;}std::cout << "Client connected: " << inet_ntoa(clientAddress.sin_addr) << std::endl;// 接收数据char buffer[BUFFER_SIZE];memset(buffer, 0, sizeof(buffer));int bytesRead = recv(clientSocket, buffer, sizeof(buffer) - 1, 0);if (bytesRead == -1) {std::cerr << "Failed to receive data from client." << std::endl;close(clientSocket);close(serverSocket);return -1;}std::cout << "Received data: " << buffer << std::endl;// 发送数据std::string message = "Hello, client!";int bytesSent = send(clientSocket, message.c_str(), message.length(), 0);if (bytesSent == -1) {std::cerr << "Failed to send data to client." << std::endl;close(clientSocket);close(serverSocket);return -1;}std::cout << "Sent data to client." << std::endl;// 关闭连接close(clientSocket);close(serverSocket);return 0;
}

总之,套接字是一种用于实现网络通信的编程接口,它允许计算机上的进程通过网络连接进行数据传输和通信。


http://www.ppmy.cn/news/588450.html

相关文章

阿里企业邮箱服务器地址(IMAP、POP、SMTP)

阿里企业邮箱IMAP、POP、SMTP参数配置服务器地址和端口号信息&#xff0c;阿里云百科分享阿里邮箱各个服务器地址及端口信息&#xff1a; 目录 新版企业邮箱服务器地址 旧版服务器地址 中国香港地区服务器地址 新版企业邮箱服务器地址 客户端推荐以下参数配置&#xff1a;…

VUE L 组件化编程 ⑩②

目录 文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持✨ V u e j s Vuejs Vuejs V u e Vue Vue组件化编程 模块组件模块化组件化 模块 组件 模块化 组件化 组件定义与使用—(非单文件) 基本使用 几个注意点 …

软件测试期末速成(背题家出列!)

文章目录 一、前言二、选择题&#xff08;15 X 2&#xff09;1、概述2、相关概念3、黑盒测试4、白盒测试5、单元测试6、集成测试7、系统测试8、自动化测试9、实用软件测试技术 三、判断题&#xff08;10 X 1’&#xff09;四、简答题&#xff08;4 X 5&#xff09;1、软件测试生…

数组与指针--常见的内存错误及其对策(1)

目录 一、内存分配未成功就使用 二、内存分配成功了&#xff0c;但是尚未初始化就用 三、内存分配成功了&#xff0c;也初始化了&#xff0c;但是发生了越界使用 四、忘记了释放内存&#xff0c;造成了内存泄漏 五、释放内存后仍然继续使用 指针是C语言最强的特性之一&…

Ubuntu 安装 Github Desk

sudo wget https://github.com/shiftkey/desktop/releases/download/release-2.9.3-linux3/GitHubDesktop-linux-2.9.3-linux3.deb# double click to install

彻底删除spacedesk

右键 我的电脑 - 管理 - 服务和应用程序 - 服务 - 找到 “spacedeskService”并删除

安装Docker Desk

文档&#xff1a;安装Docker Desk.note 链接&#xff1a;http://note.youdao.com/noteshare?id345537ec70c571c53639c9c7b112e8b8&sub11735ADE82A54729A65CB576A0E8CFAB 此文包含安装docker desk的具体内容和解决方法

spacedesk副屏幕延迟优化

看到网上很多说用安卓数据线连接电脑&#xff0c;然后共享use&#xff0c;这个方法其实和笔记本的一样 如果使用的笔记本电脑或者电脑有无线发射器的&#xff0c; 1.打开电脑的共享热点&#xff0c;然后软件里会多出一个ip地址。 2.接着副屏幕设备连接到电脑的热点。 3.副屏…