首页 > 编程语言 > 详细

Python学习日记(三十) Socket模块使用

时间:2019-09-15 09:31:39      阅读:83      评论:0      收藏:0      [点我收藏+]

Socket(套接字)

套接字是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。

发展:套接字最初是由加利福尼亚大学Berkely分校为Unix系统开发的网络通信接口。后来随着TCP/IP网络的发展,套接字成为最为通用的应用程序接口,也是在Internet上进行应用开发最为通用的API.

应用:

技术分享图片

实现:

基于TCP协议实现Sever端和Client端的信息互通

Sever端:

import socket
sk = socket.socket()            #创建服务器的套接字
sk.bind((127.0.0.1,8080))     #把地址绑定到套接字

sk.listen()                     #监听链接
conn,addr = sk.accept()         #接收到客户端的连接和地址
ret = conn.recv(1024)           #接收客户端信息
print(ret)                      #打印客户端的信息

conn.send(bhi)                #向客户端发送信息
conn.close()                    #关闭客户端的连接
sk.close()                      #关闭服务器套接字

Client端:

import socket
sk = socket.socket()             #创建客户端的套接字
sk.connect((127.0.0.1,8080))   #尝试连接服务器

sk.send(bhello)                #向服务器发送消息
ret = sk.recv(1024)              #接收服务器发送的消息
print(ret)                       #打印服务器发送的消息

sk.close()                       #关闭客户端的套接字

Sever端和Client端两边都要对应接收和发送信息,不能只接不收或只收不接且执行时要先执行Sever端再去执行Client端,执行结果:

技术分享图片

技术分享图片

当重启服务器时遇到地址已被使用的问题

技术分享图片

解决方案:

技术分享图片

如何让客户端和服务器能够多次进行对话?

Sever端:

import socket
from socket import SOL_SOCKET,SO_REUSEADDR
sk = socket.socket()              #创建服务器的套接字
sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
sk.bind((127.0.0.1,8080))       #把地址绑定到套接字
sk.listen()                       #监听链接
conn,addr = sk.accept()           #接收到客户端的连接和地址

print(addr)                       #打印客户端的地址
ret = conn.recv(1024)             #接收客户端信息
print(ret)                        #打印客户端的信息
conn.send(bhi)                  #向客户端发送信息
print(addr)                       #打印客户端的地址
ret = conn.recv(1024)             #接收客户端信息
print(ret)                        #打印客户端的信息
conn.send(bhi)                  #向客户端发送信息

conn.close()                      #关闭客户端的连接
sk.close()                        #关闭服务器套接字

Client端:

import socket
sk = socket.socket()                #创建客户端的套接字
sk.connect((127.0.0.1,8080))      #尝试连接服务器

sk.send(bhello)                   #向服务器发送消息
ret = sk.recv(1024)                 #接收服务器发送的消息
print(ret)                          #打印服务器发送的消息
sk.send(bhello)                   #向服务器发送消息
ret = sk.recv(1024)                 #接收服务器发送的消息
print(ret)                          #打印服务器发送的消息

sk.close()                          #关闭客户端的套接字

执行结果:

技术分享图片

技术分享图片

因此我们只要在Sever端获取到Client端后让它去循环接收和发送消息、让Client端在连接上Sever端后去循环发送和接收消息就能完成一个一直发送接收消息的过程,但这个过程是一个死循环,我们需要加上一些条件让它更加完善

Sever端:

import socket
import time
from json import dumps
from socket import SOL_SOCKET,SO_REUSEADDR
sk = socket.socket()                                                                    #创建服务器的套接字
sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
sk.bind((127.0.0.1,8080))                                                             #把地址绑定到套接字
sk.listen()                                                                             #监听链接
conn,addr = sk.accept()                                                                 #接收到客户端的连接和地址

while 1:
    ret = conn.recv(1024).decode(utf-8)                                               #接收客户端信息
    if ret.strip() == bye or ret.strip() == bye.capitalize():                       #跳出循环的条件
        conn.send(bbye)                                                               #发送bytes类型的Bye
        print(Client has disconnected!)
        break
    print(time.asctime(time.localtime(time.time())) +   +  dumps(addr) + : + ret)   #格式化打印客户端发来的消息
    sendInfo = input(time.asctime(time.localtime(time.time())) +  <<<)
    conn.send(sendInfo.encode(utf-8))                                                 #向客户端发送信息

conn.close()                                                                            #关闭客户端的连接
sk.close()                                                                              #关闭服务器套接字

Client端:

import socket
import time
sk = socket.socket()                                                                #创建客户端的套接字
sk.connect((127.0.0.1,8080))                                                      #尝试连接服务器

while 1:
    sendInfo = input(time.asctime(time.localtime(time.time())) +  <<<)
    sk.send(sendInfo.encode(utf-8))                                               #向服务器发送消息
    ret = sk.recv(1024).decode(utf-8)                                             #接收服务器发送的消息
    if ret.strip() == bye or ret.strip() == bye.capitalize():                   #跳出循环的条件
        sk.send(bbye)                                                             #发送bytes类型的Bye
        print(Sever has disconnected!)
        break
    print(time.asctime(time.localtime(time.time())) +  ["127.0.0.1", 8080]: + ret)#格式化打印服务器发来的消息

sk.close()                                                                          #关闭客户端的套接字

执行结果:

技术分享图片

技术分享图片

基于UDP协议实现Sever端和Client端的信息互通

实现简单传递信息

Sever端:

import socket
sk = socket.socket(type=socket.SOCK_DGRAM)      #创建服务器套接字
sk.bind((127.0.0.1,8080))                     #绑定服务器套接字

msg,addr = sk.recvfrom(1024)                    #接收到客户端的信息和地址
print(msg.decode(utf-8))                      #将客户端传递来的信息解码并打印出来
sk.sendto(bHello client!,addr)                #将bytes类型的信息发送到客户端的地址

sk.close()                                      #关闭服务器套接字

Client端:

import socket
sk = socket.socket(type=socket.SOCK_DGRAM)      #创建客户端套接字
ip_port = (127.0.0.1,8080)

sk.sendto(bHello sever!,ip_port)              #客户端发送信息
ret,addr = sk.recvfrom(1024)                    #接收到服务器的地址和信息
print(ret.decode(utf-8))                      #打印收到的信息

sk.close()                                      #关闭客户端套接字

执行结果:

技术分享图片

技术分享图片

 

 ......

Python学习日记(三十) Socket模块使用

原文:https://www.cnblogs.com/Fantac/p/11521009.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!