python实现一个简单的网络聊天程序

一、Linux Socket

1.Linux Socke基本上就是BSD Socket(伯克利套接字)

伯克利套接字的应用编程接口(API)是采用C语言的进程间通信的库,经常用在计算机网络间的通信。BSD Socket的应用编程接口已经是网络套接字的抽象标准。大多数其他程序语言使用一种相似的编程接口。由于伯克利套接字是第一个socket,大多数程序员很熟悉它们,所以大量系统把伯克利套接字作为其主要的网络API。

主要的头文件如下,不同的系统可能具体不同。

<sys/socket.h> BSD socket 核心函数和数据结构。

<netinet/in.h> AF_INET 和AF_INET6 地址家族和他们对应的协议家族PF_INET 和PF_INET6。在互联网编程中广泛使用,包括IP地址以及TCP和UDP端口号。

<sys/un.h> PF_UNIX/PF_LOCAL 地址家族。用于运行在一台计算机上的程序间的本地通信,不用在网络中。

<arpa/inet.h> 和IP地址相关的一些函数。

<netdb.h> 把协议名和主机名转化成数字的一些函数。

2.API函数

这些是伯克利套接字提供的库函数:

(1)socket() 创造某种类型的套接字,分配一些系统资源,用返回的整数识别。

(2)bind() 一般是用在服务器这边,和一个套接字地址结构相连,比如说是一个特定的本地端口号和一个IP地址。

(3)listen()用在服务器一边,导致一个绑定的TCP套接字进入监听状态。

(4)connect() 用在客户机这边,给套接字分配一个空闲的端口号。比如说一个TCP套接字,它会试图建立一个新的TCP连接。

(5)accept() 用在服务器这边。从客户机那接受请求试图创造一个新的TCP连接,并把一个套接字和这个连接相联系起来。

(6)send() and recv(), or write() and read(),or sendto() and recvfrom()用来接收和发送数据。

(7)close() 关闭连接,系统释放资源。

(8)gethostbyname() and gethostbyaddr()用来解析主机名和地址。

(9)select() 、poll() 处理多个连续的读、写饿错误状态。

(11)getsockopt() 得到对应socket的选项值。

(12)setsockopt() 设置对应socket的选项值。

二、Python实现网络通信

  网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。python中socket模块为操作系统的socket实现提供了一个python接口。

1.socket的相关函数:

(1)socket():用于创建与指定的服务提供者绑定socket。

  函数原型为:socket=socket.socket(familly,type)

  参数说明:

  familly:指定协议的地址家族,可为AF_INET或AF_UNIX。AF_INET家族包括Internet地址,AF_UNIX家族用于同一台机器上的进程间通信。

  type:指定套接字的类型。

(2)bind():bind()函数可以将本地地址与一个socket绑定在一起.

  函数原型为:socket.bind( address )

  参数address是一个双元素元组,格式是(host,port)。host代表主机,port代表端口号。

(3)listen():listen()函数可以将socket设置为监听接入连接的状态。

  函数原型为:listen(backlog)

  参数backlog指定等待连接队列的最大长度。

(4)connect():connect()函数用于连接到address处的socket。

  函数原型为:socket.connect(address)

  参数address是一个双元素元组,格式是(host,port)。host代表主机,port代表端口号

(5)accept():在服务器端调用listen()函数监听接入连接后,可以调用accept()函数来等待接受连接请求。

  函数原型为:(connection,address)=socket.accept()

  用accept()方法后,socket会进入waiting状态。客户请求连接时,accept()方法会建立连接并返回服务器。accept()方法返回一个含有两个元素的元组(connection,address)。第一个元素connection是新的socket对象,服务器必须通过它与客户通信;第二个元素address是客户的Internet地址。

(6)recv():调用recv()函数可以从已连接的socket中接收数据。

  函数原型为:buf = sock.recv(size)

  参数sock是接收数据的socket对象,参数size指定接收数据的缓冲区的大小。recv()的函数的返回接收的数据。

(7)send():调用send()函数可以在已连接的socket上发送数据。

  函数原型为:sock.recv(buf)

  参数sock是在已连接的socket上发送数据。参数buf是也要已连接的Socket上发送数据。

(8)close():close ()函数用于关闭一个socket,释放其所占用的所有资源。

  函数原型为:sock.closesocket();

  参数s表示要关闭的socket。

可以在Linux系统下查看socket模块:

  通过比较可以看出,再socket模块中并没有上述的bind(),listen(),accept()等函数。

  这是因为它们都是继承自_socket模块。而_socket是在链接库里的,也就是说它不是用python实现的,而是socket操作的C实现,这个是非常底层的操作。socket.py是用py代码把C实现的模块的封装起来之后的模块,供人使用,在不同系统_socket的位置不一样。

再查看_socket模块:

这下可以看到我们在编程中需要用到的那些函数了。

2.TCP/编程实现:

  socket编程需要两端,一般来说,需要一个服务端(Server),一个客户端(Client)。如图:

TCP服务端编程:

服务端连接步骤:

(1)创建socket对象

(2)使用bind方法,绑定IP地址,Address和端口Port

(3)使用listen开始监听,在上面以绑定的地址上

(4)使用accept开始等待连接进来,获取用于传送数据的socket对象和addr。注意使用accept会发生阻塞,惯用放在新的线程里面

(5)接收数据recv

代码:

import socket

sk = socket.socket() # 默认是AF_INET、SOCK_STREAM
address = (‘127.0.0.1‘, 9000)
sk.bind(address) # 将主机号与端口绑定到套接字
sk.listen(3) # 设置并启动TCP监听器
print(‘waitting......‘)

while True:
    conn, addr = sk.accept() # 被动接受TCP连接,一直等待连接到达
    print(‘连接到达‘,addr)
    while True:
        data = conn.recv(1024) # 接收TCP消息,并制定最大长度
        if not data:
            print(‘连接已断开!‘)
            conn.close()
            break
        print(str(data, ‘utf8‘))
        inp = input(‘>>‘)
        conn.send(bytes(inp, ‘utf8‘))  #向客户端回送信息

TCP客户端编程:

客户端连接步骤:

(1)创建Socket对象

(2)连接到远端服务端的IP和port端口, connect方法

(3)传输数据:send发送数据;recv接收数据, 会阻塞

(4)关闭连接,释放资源

代码:

import  socket
sk = socket.socket() # 默认是AF_INET、SOCK_STREAM
address = (‘127.0.0.1‘, 9000)
sk.connect(address) #连接服务端
while True:
    inp = input(‘>>‘)
    if inp == ‘exit‘:
        break
    sk.send(bytes(inp, ‘utf8‘)) #向服务端发送信息
    data = sk.recv(1024)
    print(str(data, ‘utf8‘))
else:
    sk.close()

运行结果:

服务端:

客户端:

原文地址:https://www.cnblogs.com/yll333/p/11964582.html

时间: 2024-08-02 10:03:52

python实现一个简单的网络聊天程序的相关文章

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

一.TCP通信概述 TCP协议是面向连接的通信协议,在传输数据之前,发送端和接收端必须建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输. 在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过三次握手. 三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠. ·第一次握手,客户端向服务器端发出连接请求,等待服务器确认. ·第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求.

一个简单的网络聊天程序实现

socket简介 Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口, 这就是Socket编程接口:HTTP是轿车,提供了封装或者显示数据

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

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

以您熟悉的编程语言为例完成一个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

用L脚本语言开发一个简单的局域网聊天程序

#scp #这是一个简单的局域网聊天程序的例子 定义:字符串,string1 定义:字符串,string2 #addr1是对方的地址 #addr2是自己的地址 #如果addr1和addr2相同,就是自己和自己聊天 定义:地址,addr1,127.0.0.1,27015 定义:地址,addr2,127.0.0.1,27015 定义:整数,字节数,0 #在自己的UDP端口上监听 定义:网络连接,conn2,UDP 监听:conn2,addr2 #连接对方的UDP端口 定义:网络连接,conn1,UD

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

利用java的Socket实现一个简单hello/hi聊天程序

利用java的Socket实现一个简单hello/hi聊天程序 首先,我们来用java实现一个简单的hello/hi聊天程序.在这个程序里,我学习到了怎么用socket套接套接字来进行编程.简单理解了一些关于socket套接字和底层调用的关系.关于java的封装思想,我学会了一些东西,java里真的是万物皆对象.还学到了一点多线程的知识. TCP 在这里,不得不先介绍以下TCP.TCP是传输层面向连接的协议.提供了端到端的进程之间的通信方式.TCP在通信之前要先建立连接.这里我们称这个建立连接的

一个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}: