Python_socket通信服务端客户端编程简介_动脑学院课件截取

1.Tcp/Ip 协议:互联网通讯协议,互联网可依据此协议规范进行通讯

TCP协议:(打电话)面向连接,安全可靠

UDP协议:(发短信)

ip协议(门牌号:ip地址) TCP/UDP(收件人:端口号)

2.通讯流程:

3.socket模块:python通过socket模块实现互联网通讯,是一个接口,封装了TCP/ip通讯的模块

4.一次通讯socket代码

服务端代码的实现:同步:

import socket

host = '127.0.0.1'

port = 9009

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((host, port))

s.listen(8)

conn, addr = s.accept()

print('连接的客户端主机地址为: % s' % str(addr))

text = conn.recv(1024)

print('接受客户端发来的消息为 % s' % text.decode('utf-8'))

content = input('请输入您要返回给客户端的信息:')

conn.sendall(content.encode('utf-8'))

conn.close()

s.close()

客户端代码:   参数一:基于ipv4协议的tcpudp;参数二:流套接字,数据报文套接字

import socket

host = '127.0.0.1'

port = 9009

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((host, port))

text = input('请输入发送给服务器的内容:')

s.send(text.encode('utf-8'))

content = s.recv(1024)

print(content.decode('utf-8'))

s.close()

5.建立多次连接的交互通讯(半双工聊天)

服务端程序: Python socket半双工聊天

 import socket

host = '127.0.0.1'

port = 9008

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((host, port))

s.listen(8)

while 1:

    conn, addr = s.accept()

    print(conn, addr)

    while 1:

        text = conn.recv(1024)

        if len(text.strip()) == 0:

             print('接受到客户端发来的数据为空')

        else:

               print('接受到客户端发来的数据为%s' % text.decode('utf-8'))

               print('服务器接受到的数据为:%s' % text.decode('utf-8'))

               content = input('请输入要发送给客户端的数据:')

               conn.send(content.encode('utf-8'))

              print('\n')

        conn.close()  # while对其

   s.close()

对于第二个while循环来说服务端不断从连接的客户端接受数据,如果没有客户端连接

   过来,会一直处于等待状态

   对于第一个while循环来说,是服务端不断等待客户端的连接

客户端的代码:

import socket

host = '127.0.0.1'

port = 9008  # 端口号保持相同

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((host, port))

while 1:

    content = input('请输入您要发给服务端的信息:')

    s.sendall(content.encode('utf-8'))

    text = s.recv(1024)

    print('接受服务器发来的信息为 % s' % text.decode('utf-8'))

    print('!!!!!!!!!!!!!!!!!!!')

6.分叉多进程技术下的通讯,一个服务端可以接受两个或多个客户端电话(全双工)

服务端代码:

import socketserver

from socketserver import StreamRequestHandler as srh

from time import ctime

host = '127.0.0.1'

port = 9999

addr = (host,port)

class Servers(srh):

    def handle(self):

        print('连接到服务器的客户端地址为%s' % str(self.client_address))

        while True:    # (函数内)

            date = self.request.recv(1024)

            if not date:

                break

            print('服务端接受到数据为:%s' % date.decode('utf-8'))

            print('客户端地址为%s' % self.client_address[0])

            content = input('请输入发送给客户端的信息:')

            self.request.send(content.encode('utf-8'))

        print('服务器端开始运行')

server = socketserver.ThreadingTCPServer(addr, Servers)

server.serve_forever()

客户端代码:

import socket

import time

host = '127.0.0.1'

port = 9999

addr = (host,port)

buff_size= 1024

s= socket.socket(socket.AF_INET,socket.SOCK_STREAM)

s.connect(addr)

while 1:

    date = input('请输入要发送给服务端的信息:')

    if not date or date == 'exit':

        break

    s.sendall(date.encode('utf-8'))

    content = s.recv(buff_size)

    if not content:

        break

    print(content.decode('utf-8'))

s.close()

 

 

注意:

recv()无法传输空信息

发短信的,是不是服务器没开,客户端发送的信息就丢失了呢?

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 Python Socket 通信示例,包含客户服务的代码: 服务代码: ```python import socket # 创建 socket 对象 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 获取本地主机名 host = socket.gethostname() # 设置口号 port = 8888 # 绑定口号 server_socket.bind((host, port)) # 设置最大连接数,超过后排队 server_socket.listen(5) while True: # 建立客户连接 client_socket, addr = server_socket.accept() print("连接地址:%s" % str(addr)) msg = '欢迎访问菜鸟教程!' + "\r\n" client_socket.send(msg.encode('utf-8')) client_socket.close() ``` 客户代码: ```python import socket # 创建 socket 对象 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 获取本地主机名 host = socket.gethostname() # 设置口号 port = 8888 # 连接服务,指定主机和口 client_socket.connect((host, port)) # 接收小于 1024 字节的数据 msg = client_socket.recv(1024) client_socket.close() print(msg.decode('utf-8')) ``` 在上面的示例中,服务客户都使用了 `socket.socket` 方法创建了一个 socket 对象,服务通过 `server_socket.bind()` 方法绑定了主机和口号,并使用 `server_socket.listen()` 方法设置了最大连接数,然后使用一个无限循环来接受客户的连接。当有新客户连接时,服务通过 `server_socket.accept()` 方法接受连接,并向客户发送了一条欢迎消息,随后关闭了该客户的连接。 客户通过 `client_socket.connect()` 方法连接到服务,并使用 `client_socket.recv()` 方法接收了服务发送的欢迎消息,然后关闭了连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值