python scoket

一、简介

scoket(套结字)在python就是模块

二、分类

基于文件型(不用)

基于网络型

名字:AF_INET

  AF_INET6

三、scoket应用

1、基于tcp

长连接:基于tcp的Server端只能和一台Client端进行数据传输

特点

  必须先运行Server端,再运行Client端

  在Server端,第一次可以接收或发送信息  

# server端,基于tcp协议
import socket
sk = socket.socket()
sk.bind(('127.0.0.1', 8010))
sk.listen()
connect, addr = sk.accept()
ret = connect.recv(1024).decode('utf-8')
print(ret)
connect.send(bytes('hello', encoding='utf-8'))
connect.close()
sk.close()
# client端,基于tcp协议
import socket
sk = socket.socket()
sk.connect(('127.0.0.1', 8010))
sk.send(bytes('你好', encoding='utf-8'))
ret = sk.recv(1024).decode('utf-8')
print(ret)
sk.close()
# server端,基于tcp协议
"""
优化,实现简单的对话功能
"""
import socket
sk = socket.socket()
sk.bind(('127.0.0.1', 8010))
sk.listen()
connect, addr = sk.accept()
while 1:
    ret = connect.recv(1024).decode('utf-8')
    print(ret)
    if ret == 'byte':
        break
    info = input('server>>>')
    connect.send(bytes(info, encoding='utf-8'))
connect.close()
sk.close()
# client端,基于tcp协议
"""
优化,实现简单的对话功能
"""
import socket
sk = socket.socket()
sk.connect(('127.0.0.1', 8010))
while 1:
    info = input('client>>>')
    sk.send(bytes(info, encoding='utf-8'))
    if info == 'byte':
        break
    ret = sk.recv(1024).decode('utf-8')
    print(ret)

sk.close()

注意:

1)sk.accept()和sk.connect(),里面是tuple

2)在bind前加

sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

 3)网络传输用bytes类型

4)客户端和服务器的send和recv是相互关联的

2、基于udp协议

基于udp协议,不需要监听和连接,发送和接收都有两个参数(信息,地址)

特点:

  Server端和Client端运行的顺序没有先后

  在Server端,第一次只能接收信息

"""
基于udp协议
Server端
聊天系统
"""
import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1', 8010))
while 1:
    msg, addr = sk.recvfrom(1024)
    new_msg = msg.decode('utf-8')
    print(new_msg)
    # if new_msg == 'byte':
    #     break
    info = input('Server>>>')
    sk.sendto(info.encode('utf-8'), addr)
    if info == 'byte':
        break
sk.close()
"""
基于udp协议
Client端
"""
import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
ip_port = ('127.0.0.1', 8010)
while 1:
    info = input('Client1>>>')
    new_info = ('来自Client的消息:' + info).encode('utf-8')
    sk.sendto(new_info, ip_port)
    if info == 'byte':
        break
    msg, addr = sk.recvfrom(1024)
    new_msg = msg.decode('utf-8')
    print(new_msg)
    if new_msg == 'byte':
        break
sk.close()
"""
基于udp协议
Client2端
"""
import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
ip_port = ('127.0.0.1', 8010)
while 1:
    info = input('Clinet2>>>')
    new_info = ('来自Client2的消息:' + info).encode('utf-8')
    sk.sendto(new_info, ip_port)
    if info == 'byte':
        break
    msg, addr = sk.recvfrom(1024)
    new_msg = msg.decode('utf-8')
    print(new_msg)
    if new_msg == 'byte':
        break
sk.close()

注意:

  发送和接收数据,有两个参数(数据,地址)

  Server端不需要监听和连接,Client端不需要连接

  网络传输的数据类型是bytes,注意字符编码

  Server端第一次只能接收信息

 

posted @ 2019-06-03 22:37  市丸银  阅读(209)  评论(0编辑  收藏  举报