Python网络编程 Fay·D·Flourite

python socket网络编程

好久都没更新了,补一下最近学的东西

其实我个人认为网络编程更多的在于理解服务端和客户端的一个交互过程,整个一个过程为服务端通过套接字连接到网络,再由网络连接到客户端的套接字,去接受客户端传递的数据,形成一个数据流,就完成了一个收发的过程。我们按照这个过程来开发:

服务端和客户端的基本框架

  • 服务端

按照上面的流程,服务端需要先创建套接字

s=socket.socket()

然后绑定到地址并进行监听

s.bind()
s.listen()

然后需要一个无限循环去连接客户端,再一个无限循环去接受客户端传来的数据,无限循环我觉得也有必要理解一下,这个连接并不是一个直接连接完了就完事,它是一个动态的过程。

while True:
    connect=s.accept()
    while True:
        message=connect.recv()
        send=connect.send()
    connect.close()

然后关闭服务端套接字

s.close
  • 客户端

客户端的流程相似,但更简单,先创建套接字

s=socket.socket()

然后通过套接字连接服务端

s.conntct()

写一个无限循环传输数据

while True:
    s.send()

然后关闭客户端套接字

S.close()

代码

最近阿里云不是免费送6个月服务器嘛,就想搞点东西,这里放出自己服务端和客户端的代码,暂时只能支持一个用户连接

  • 服务端
import socket


host=socket.gethostname()
host_ip=socket.gethostbyname(host)
port=45535

server_addr=(host_ip,port)

server=socket.socket()
server.bind(server_addr)

server.listen(5)
print("等待用户进行连接")

while True:

    client,addr=server.accept()
    print("来自%s用户已连接" %addr[0])
    client.send("欢迎连接".encode())
    while True:
        msg=client.recv(1024)
        if len(msg) == 0:break 
        print(msg,type(msg))

        client.send(msg.upper())
    client.close()

server.close()
  • 客户端
import socket

host=socket.gethostname()
host_ip='47.112.188.203'
port=45535

server_addr=(host_ip,port)

client=socket.socket()

client.connect(server_addr)
print("连接成功")

msg_recv=client.recv(1024).decode()
print(msg_recv)


while True:    
    msg_send=input('在此输入消息>>: ').strip()
    if len(msg_send) == 0:continue
    client.send(msg_send.encode('utf-8'))

    feedback=client.recv(1024)
    print(feedback.decode('utf-8'))

client.close()  

能完成服务端和客户端之间的收发。不知道能不能靠这个搞出个聊天室之类的东西,也是有点期待。

P.S.阿里云服务器开启套接字用局域网ip就可,貌似会进行一个转发到公网ip上,这地方也迷惑了我好久…