使用python完成一个hello/hi的简单的网络聊天程序

  在这篇文章中,我将先简要介绍socket原理,然后给出一个利用Python实现的简单通信样例,最后通过跟踪系统调用来分析Python中socket函数与Linux系统调用的对应关系。

1.socket简介

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。下图为原理图:

2.简单通信样例

server端:

import socket
import time

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((‘127.0.0.1‘, 12580))
s.listen(1)
sock, addr = s.accept()
buf = sock.recv(1024).decode()
while True:
    print("client: " + buf)
    data = input("server: ")
    sock.send(data.encode())
    if data == ‘#q#‘:
        time.sleep(1)
        break
    buf = sock.recv(1024).decode()

client端:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((‘127.0.0.1‘, 12580))
while True:
    try:
        data = input("client: ")
        s.send(data.encode())
        buf = s.recv(1024).decode()
        if buf == ‘#q#‘:
            s.close()
            break
        else:
            print("server: " + buf)
    except:
        print("error")
        s.close()
        exit(-1)

运行结果:

3.对应关系跟踪

使用命令strace python3 server.py来跟踪所使用的系统调用,部分结果为:

stat("/home/xiaopeng/anaconda3/lib/python3.7/socket.py", {st_mode=S_IFREG|0664, st_size=27363, ...}) = 0

……

socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_IP) = 3
setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0

bind(3, {sa_family=AF_INET, sin_port=htons(12580), sin_addr=inet_addr("127.0.0.1")}, 16) = 0

listen(3, 1)                            = 0

accept4(3, {sa_family=AF_INET, sin_port=htons(48408), sin_addr=inet_addr("127.0.0.1")}, [16], SOCK_CLOEXEC) = 4

recvfrom(4, "haha", 1024, 0, NULL, NULL) = 4

write(1, "client: haha\n", 13client: haha)          = 13

我们可以看到python中相关socket函数是如何对应到Linux系统的socket系统调用的,归纳为下表:

python函数 Linux Socket API
socket.socket int socket(int domain, int type, int protocol);
bind int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
connect int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
listen int listen(int sockfd, int backlog);
accept int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
send ssize_t send(int sockfd, const void *buf, size_t len, int flags);
recv ssize_t recv(int sockfd, void *buf, size_t len, int flags);
close int close(int socketfd)

参考资料:https://github.com/mengning/net

原文地址:https://www.cnblogs.com/xpeng2333/p/12024919.html

时间: 2024-10-11 21:25:48

使用python完成一个hello/hi的简单的网络聊天程序的相关文章

基于Python完成一个hello/hi的简单的网络聊天程序

一.Socket 套接字简介 套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开.读写和关闭等操作.套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信.网络套接字是IP地址与端口的组合. 传输层实现端到端的通信,因此,每一个传输层连接有两个端点.那么,传输层连接的端点是什么呢?不是主机,不是主机的IP地址,不是应用进程,也不是传输层的协议端口.传输层连接的端点叫做套接字(socket).根据RFC793的定义:端口号拼接到IP

使用python实现一个hello/hi的简单的网络聊天程序

一.TCP/IP协议通信原理 TCP/IP协议包含的范围非常的广,它是一种四层协议,包含了各种硬件.软件需求的定义.TCP/IP协议确切的说法应该是TCP/UDP/IP协议.UDP协议(User Datagram Protocol 用户数据报协议),是一种保护消息边界的,不保障可靠数据的传输.TCP协议(Transmission Control Protocol 传输控制协议),是一种流传输的协议.他提供可靠的.有序的.双向的.面向连接的传输. 保护消息边界,就是指传输协议把数据当作一条独立的消

以您熟悉的编程语言为例完成一个hello/hi的简单的网络聊天程序

在这片博文我们将使用python完成一个hello/hi的简单的网络聊天程序 先做一下准备工作 1.linux的socket基础api: 使用socket()创建套接字 int socket(int af, int type, int protocol); af为IP地址类型,AF_INE和AF_INET6分别对应ipv4和ipv6地址type是数据传输方式,Sock_stream(面向连接套接字)和sock_dgram(无连接套接字)protocol是传输协议,IPPROTO_TCP和IPPR

一个hello/hi的简单的网络聊天程序和python Socket API与Linux Socket API之间的关系

1.Socket概述 套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开.读写和关闭等操作.套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信.网络套接字是IP地址与端口的组合. 套接字可以看成是两个网络应用程序进行通信时,各自通信连接中的一个端点.通信时,其中的一个网络应用程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过网络接口卡的传输介质将这段信息发送给另一台主机的Socket中,使这段信息能传送到

一个hello/hi的简单的网络聊天程序

我选择使用python来实现hello/hi的简单网络聊天程序,源代码包括两个部分,客户端代码和服务器端代码,源代码部分如下图所示: 服务器端代码 1 import socket 2 3 HOST = '127.0.0.1' 4 PORT = 8888 5 6 server = socket.socket() 7 server.bind((HOST, PORT)) 8 server.listen(1) 9 10 print(f'the server is listening at {HOST}:

Java实现一个hello/hi的简单的网络聊天程序

使用Java的Socket实现客户端和服务器端之间的连接,实现客户端重复发送数据到服务器端的功能.即,用户可以在控制台不断输入内容,并将内容逐一发送给服务端.并在服务端显示. socket定义 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket.建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装

使用java实现一个hello/hi的简单的网络聊天程序

1.socket原理 Socket实质上提供了进程通信的端点.进程通信之前,双方首先必须各自创建一个端点,否则是没有办法建立联系并相互通信的.正如打电话之前,双方必须各自拥有一台电话机一样. 套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认. 1.服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态. 2.客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字.为此,客户端的套接字必须首先描述它要连接的服务器

用c++完成一个hello/hi的简单的网络聊天程序

1.什么是Socket 套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开.读写和关闭等操作.套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信.网络套接字是IP地址与端口的组合. Socket起源于Unix,而Unix/Linux 基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式 来操作.Socket就是该模式的一个实现,socket即是一种特殊的文件,一些

java实现hello/hi的简单的网络聊天程序与ServerSocket调用栈跟踪

java实现hello/hi的简单的网络聊天程序 网络聊天采用TCP协议通过java实现 import java.io.*; import java.net.Socket; public class Client { public static void main(String[] args) throws Exception{ Socket socket = new Socket("192.168.31.68", 6666); BufferedReader reader = new