python3 网络编程

TCP建立服务端

# coding = utf-8
import socket
net_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
net_socket.bind(("",7788))
net_socket.listen(10)

new_socket,client_info = net_socket.accept()
message = new_socket.recv(1024)
new_socket.close()
net_socket.close()
  • SOCK_STREAM是TCP协议,SOCK_DGRAM是使用udp,AF_INET是IPV4,AF_INET6是IPV6
  • net_socket.bind((“”,7788)) 绑定本机所有IP的7788端口,如果服务器有多张网卡,又需要指定单独的IP,需要把IP写在端口前
  • net_socket.listen(10) 10代表主socket等待(半连接)和已连接的总和,linux会自己计算设置
  • net_socket.accept() 主socket建立tcp连接后,会新建一个socket给这个客户单独服务。client_info是建立时截取的客户IP地址和端口号,是一个元组
  • new_socket.recv(1024) 每次接受客户1K的消息大小,注意接收消息是recv,发消息是send。注意编码,发送时编码.encode(“utf-8”),接收时.decode(“utf-8”),因为网络传输时是只能传送字节码格式的数据,所以才有encode和decode
  • new_socket.close() 用完记得关闭掉,先关单独的socket,再关主socket

TCP客户端

# coding = utf-8
import socket
net_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
net_socket.connect(("192.168.16.1",7788))
message = input("请输入你要发送的消息:")
net_socket.send(message.encode("utf-8"))
net_socket.close

此时如果服务器端要发送消息,直接调用net_socket.send(message,(“192.168.16.1”,7788)),TCP连接会缺省记录对方IP和端口,()括号里面直接需要发送的信息即可。
如果要实现全双工聊天,由于intput方法和socket.recv都有阻断等待的功能,此时就需要引入线程或者进程的功能

UDP服务端

#coding=utf-8
from socket import *
#1. 创建套接字
udpSocket = socket(AF_INET, SOCK_DGRAM)
#2. 绑定本地的相关信息,如果程序不绑定,则系统会随机分配
bindAddr = ('', 7788) # ip地址和端口号,ip一般不写,表示本机的任何一个ip
udpSocket.bind(bindAddr)
#3. 等待接收对方发送的数据
recvData = udpSocket.recvfrom(1024) # 1024表示本次接收的最大字节数
#4. 显示接收到的数据
print recvData
#5. 关闭套接字
udpSocket.close()

UDP客户端

#coding=utf-8
from socket import *
#1. 创建套接字
udpSocket = socket(AF_INET, SOCK_DGRAM)
#2. 准备接收收的地址
sendAddr = ('192.168.1.103', 8080)
#3. 从键盘获取数据
sendData = raw_input("请输入要发送的数据:")
#4. 发送数据到指定的电脑上
udpSocket.sendto(sendData.encode("utf-8"), sendAddr)
#5. 等待接收对方发送的数据
recvData = udpSocket.recvfrom(1024) # 1024表示本次接收的最大字节数
#6. 显示对方发送的数据
print(recvData)
#7. 关闭套接字
udpSocket.close()

多线程,多进程TCP连接服务器

# coding = utf-8
from multiprocessing import Pool
import socket

def func(conn):
    conn.send("我是服务器".encode("utf-8"))
    print(conn.recv(1024).decode("utf-8"))
    conn.close()


if __name__ == "__main__":
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(("192.168.16.83", 8080))
    server_socket.listen(10)
    pool = Pool(10)
    while True:
        conn,client_info = server_socket.accept()
        pool.apply_async(func,args=(conn,))
    server_socket.close()
    pool.close()
    pool.join

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值