ソケットは、IP アドレスとポートを表すために使用されることが多く、アプリケーションは通常、「ソケット」を通じてネットワークにリクエストを送信したり、ネットワーク リクエストに応答したりします。
Socket は Unix に由来しており、Unix/Linux の基本理念の 1 つは「すべてはファイルである」というもので、ファイルを操作するには [Open] [Read-Write] [Close] モードを使用します。ソケットはこのモードの実装です。ソケットは特殊なファイルであり、一部のソケット関数はそのファイルに対する操作 (読み取り/書き込み IO、オープン、クローズ) です。
ソケットとファイルの違い:
ファイル モジュール指定されたファイルに対して [開く] [読み書きする] [閉じる]
一般にソケットとして知られるソケットは、実際には IP アドレスとポートの組み合わせです。この形式 (ip、port) と同様に、ip は特定のホストを表し、ポートはソケットを介して別のホストと通信できます。
ソケットのソースコードの分析は、現在執筆中のtarnadoシリーズの記事にあります。 。 。 。 。
tcp通信
udp通信
Unixベース通信
# 暂时知道的也就这么多,之后要是在用到其他的我会继续进行保存Methods of socket objects (keyword arguments not allowed): _accept() -- accept connection, returning new socket fd and client address bind(addr) -- bind the socket to a local address 给本地地址绑定一个socket套接字 close() -- close the socket 关闭一个套接字 connect(addr) -- connect the socket to a remote address 连接到远端主机 connect_ex(addr) -- connect, return an error code instead of an exception dup() -- return a new socket fd duplicated from fileno() fileno() -- return underlying file descriptor getpeername() -- return remote address [*] getsockname() -- return local address getsockopt(level, optname[, buflen]) -- get socket options gettimeout() -- return timeout or None listen([n]) -- start listening for incoming connections recv(buflen[, flags]) -- receive data 接受数据 recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer) 接受数据到缓冲区中, recvfrom(buflen[, flags]) -- receive data and sender's address recvfrom_into(buffer[, nbytes, [, flags]) -- receive data and sender's address (into a buffer)sendall(data[, flags]) -- send all data 发送数据给远端主机,3.x之后只能发送字节形式,因此在发送的时候一般要进行转换bytes send(data[, flags]) -- send data, may not send all of it 也是发送数据,区别在于send发送的不完整,随机进行发送的,二sendall发送的完整 sendto(data[, flags], addr) -- send data to a given address 基于udp发送数据的 setblocking(0 | 1) -- set or clear the blocking I/O flag 是否设置成阻塞模式0 代表阻塞,1代表非阻塞 setsockopt(level, optname, value) -- set socket options 设置一些socket的桉树 settimeout(None | float) -- set or clear the timeout 设置超时市场 shutdown(how) -- shut down traffic in one or both directions if_nameindex() -- return all network interface indices and names if_nametoindex(name) -- return the corresponding interface index if_indextoname(index) -- return the corresponding interface name [*] not available on all platforms!
データを送信する場合、サーバーは応答しますデータを持った彼 + Hello
1 # -*- coding:utf-8 -*- 2 # zhou 3 # 2017/7/3 4 5 import socket 6 # 创建一个server对象 7 server_obj = socket.socket() 8 # 绑定一下端口 9 server_obj.bind(("127.0.0.1", 8888, ))10 # 设置监听的等待队列长度为5,当大于5的时候就拒绝连接11 server_obj.listen(5)12 13 while True:14 # 等待接受客户端的连接,为阻塞方式15 conn, address = server_obj.accept()16 # 发送欢迎信息17 conn.sendall(bytes("欢迎来到简单的聊天室..", encoding='utf-8'))18 while True:19 # 接受到对面的消息就会把对面消息后面加上你好重新发送回去20 ret = str(conn.recv(1024), encoding='utf-8')21 if ret == 'q':22 # 如果对面发送的为q就退出23 break24 conn.sendall(bytes(ret + ",你好", encoding='utf-8'))
# -*- coding:utf-8 -*-# zhou# 2017/7/3import socket client = socket.socket() client.connect(("127.0.0.1", 8888, ))# 接受欢迎信息并打印ret = str(client.recv(1024), encoding='utf-8')print(ret)while True: message = input("请输入您要发送的内容:") client.sendall(bytes(message, encoding='utf-8'))if message == 'q':breakret = str(client.recv(1024), encoding='utf-8')print(ret)
です。
1 # -*- coding:utf-8 -*- 2 # zhou 3 # 2017/7/2 4 5 import socket 6 7 server = socket.socket() 8 server.bind(("127.0.0.1", 9998, )) # 绑定ip 9 server.listen(5)10 11 while True:12 conn, address = server.accept()13 # 连接之后首先接收文件大小14 file_size = int(str(conn.recv(1024), encoding='utf-8'))15 # 用来解决粘包问题的16 conn.sendall(bytes("1001", encoding='utf-8'))17 # 已经接受的文件大小18 has_size = 019 num = 120 # 连接之后接收文件21 f = open("new.jpg", 'wb')22 while True:23 num += 124 if file_size == has_size:25 break26 data = conn.recv(1024)27 f.write(data)28 has_size += len(data)29 f.close() # 关闭文件
Four. スティッキー問題の解決策
スティッキーパケットの解決 問題は、ファイルをアップロードするときに、最初にそのファイルをアップロードすることです。サイズをアップロードした後、承認ステートメントを作成する必要があり、サーバー側はファイル サイズを受信した後、すぐに確認用のデータを送信する必要があります。これにより、データをサイズごとに完全に分離できます。
以上がPython のソケットの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。