网络编程 之 有用的 socket

socket

1.什么是socket?

Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。

2.socket()函数

用 socket()函数来创建套接字,语法格式如下:
socket.socket([family[, type[, proto]]])
参数

  • family: 套接字家族可以使AF_UNIX或者AF_INET type:
  • 套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAM或SOCK_DGRAM
  • protocol: 一般不填默认为0

3.基于UDP协议的Socket使用

udp是无链接的,启动服务之后可以直接接受消息,不需要提前建立链接。
服务端
我们使用 socket 模块的 socket 函数来创建一个 socket 对象。socket 对象可以通过调用其他函数来设置一个 socket 服务。
完整代码如下:

#服务端
import socket
#1.创建一个服务端
server = socket.socket(type=socket.SOCK_DGRAM)
#2.绑定套接字
ip_port=("127.0.0.1",8000)
server.bind(ip_port)

while True:
    #3. 接收客户端的消息
    msg,addr=server.recvfrom(1024)
    msg=msg.decode("utf-8")
    print("客户端{}发给的消息是:{}".format(addr,msg))
    #4. 回复客户端
    content=input("我回复的消息是:")
    content=content.encode("utf-8")
    server.sendto(content,addr)
#关闭
server.close()

客户端
完整代码如下:

#客户端
import socket
while True:
    #1. 创建一个服务器soket对象
    client=socket.socket(type=socket.SOCK_DGRAM)
    #2. 给服务器发消息
    #服务器地址和端口
    ip_port=("127.0.0.1",8000)
    content = input("请输入你的聊天内容:")
    #以UTF-8编码对content进行编码,获取二进制bytes类型对象,encode函数进行编码
    content=content.encode("utf-8")


    #向服务器发一条消息,client。sendto 发送udp数据,将数据发送到套接字,address 形式是(ip地址 ,port)的元组
    client.sendto(content,ip_port)
    #3. 接收服务器信息
    #接收的是从服务器返回的消息。client。recvfrom() 接收udp数据,但返回的是(data,address)
    msg,addr=client.recvfrom(1024)
    msg=msg.decode("utf-8")
    #4. 打印消息
    print("服务器{}发的消息是:{}".format(addr,msg))
#5. 关闭套接字
client.close()

运行结果如下:
服务端
在这里插入图片描述
客户端
在这里插入图片描述

4.基于TCP协议的Socket使用

Socket是基于tcp协议的,tcp是基于链接的,因此在通讯开始之前,一定要先建立相关的 链接,才能发送数据。必须先启动服务端,然后再启动客户端去链接服务端。
服务端
完整代码如下:

import socket

#1.创建服务器套接字
tcp_server = socket.socket(type=socket.SOCK_STREAM)
#2.绑定端口
ip_port=("127.0.0.1",9000)
tcp_server.bind(ip_port)

while True:
    # 3.将socket创建的套接字变成被动类型,等待客户链接请求
    tcp_server.listen(5)
    # 4.让服务器阻塞,等待客户端的链接
    client_socket, client_addr = tcp_server.accept()

    #5. 接收客户端发来的消息
    recv_msg=client_socket.recv(1024)
    recv_msg =recv_msg.decode("utf-8")

    #打印客户端消息
    print("客户端{}的消息是:{}".format(client_addr,recv_msg))

    #6. 给客户端发消息
    msg=input("给客户端发的消息是:")
    msg=msg.encode("utf-8")
    client_socket.send(msg)

client_socket.close()
tcp_server.close()

客户端
完整代码如下:

import socket

while True:
    #1. 创建客户端的套接字
    tcp_client =socket.socket(type=socket.SOCK_STREAM)

    #2. 连接服务器端口
    ip_port=("127.0.0.1",9000)#服务器的ip端口
    tcp_client.connect(ip_port)

    #3. 给服务器发消息
    msg=input("给服务器发消息:")
    msg=msg.encode("utf-8")
    tcp_client.send(msg)

    #4. 接受服务器的消息
    recv_msg =tcp_client.recv(1024)
    recv_msg=recv_msg.decode("utf-8")
    print("服务器的消息是:{}".format(recv_msg))

#5. 关闭套接字
tcp_client.close()

运行结果如下:
服务端
在这里插入图片描述
客户端

在这里插入图片描述

5.python里的编码

  • ASCII码

    ASCII码 表示127个英文字符

  • Unicode码

    Unicode 用来把所有语言都统一到一套编码里,这样就不会再有乱 码问题了。Unicode 通常用两个字节编码(有的也用四个字节),而 ASCII码通常用一个字节字节。ASCII码转换成Unicode在前面一个字节 补0

  • UTF-8码

    UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字 节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生 僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文 字符,用UTF-8编码就能节省空间。 UTF-8的一个好处在于,原有的ASCII的编码可以在UTF-8下继续工 作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值