ホームページ  >  記事  >  バックエンド開発  >  Python ソケット ネットワーク プログラミング TCP/IP サーバーとクライアントの通信

Python ソケット ネットワーク プログラミング TCP/IP サーバーとクライアントの通信

高洛峰
高洛峰オリジナル
2017-02-23 16:33:581911ブラウズ

Python ソケット ネットワーク プログラミング

私は以前、「Python プログラミング入門から実践まで」と「Python Core Programming Third Edition」という 2 冊の本を購入しました。最初の本では主にいくつかの基本的な構文について説明しています。基本的な使用方法については、2 冊目の本でさらに詳しく説明されていますが、ネットワーク プログラミングのこの部分については、まだ少ししか知識がありません。しかし、私は学び続ける情報を探し続けると思います...

この部分で使用されるメインモジュールは、socket() です。 Word には、ソケット ベースのネットワーク通信を可能にする独自のメソッド セットもあります。

socket() モジュール関数

ソケットを作成するには、socket.socket() 関数を使用する必要があります。その一般的な構文は次のとおりです

socket(socket_family, socket_type, protocol=0)

ここで、socket_family は AF_UNIX または AF_INET、socket_type です。 SOCK_STREAM または SOCK_DGRAM です。プロトコルは通常省略され、デフォルト = 0 です。

したがって、TCP/IP ソケットを作成するには、次のメソッドを使用してソケット.socket() を呼び出すことができます。

tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

同様に UDP を作成します/IP ソケット、次のメソッド呼び出し

udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

を使用して TCP サーバーを作成します

TCP サーバーを作成するプロセスは基本的に次のとおりであり、実際のコードではありません

ss = socket()          #创建服务器套接字
    ss.bind()              #套接字与地址绑定
    ss.listen()             #监听连接
    inf_loop:             #服务器无限循环
        cs = ss.accepr()   #接受客户端连接
        comm_loop:      #通信循环
            cs.recv()/cs.send()   #对话(接收/发送)
        cs.close()        #关闭客户端套接字
    ss.close()            #关闭服务器套接字(可选)

実際には、TCP サーバーを作成する基本的なプロセスは上記のとおりです。多少異なる場合がありますが、基本的な考え方は同じであるはずです。以下は実際のサーバーのコードです:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from socket import *      #将 socket 属性引入到命名空间

HOST = ''          #这是对 bind()方法的标识表示可以使用任何可用的地址
PORT = 21571      #端口号
BUFSIZ = 1024     #缓冲区大小,1kb
ADDR = (HOST,PORT)   #地址????

tcpSerSocket = socket(AF_INET,SOCK_STREAM)    #创建 tcp 套接字
tcpSerSocket.bind(ADDR)           #将地址绑定到套接字上
tcpSerSocket.listen(5)            #设置并启动套接字监听

while True:        #无限循环,等待客户端连接
  print('waiting for connection...')   
  tcpCliSocket,addr = tcpSerSocket.accept()    #被动接受客户端连接     
  print('...connected from:',addr)

  while True:      #对话循环,等待客户端发送消息
    data = tcpCliSocket.recv(BUFSIZ)   #接收客户端消息
    if not data:     #如果消息是空白,跳出对话循环,关闭当前连接
      break
    tcpCliSocket.send(data)   #如果收到消息,将消息原封不动返回客户端

  tcpCliSocket.close()
tcpSerSocket.close()

TCP クライアントの作成

上記と同じ、コードを使わない単純なプロセス

cs = socket()    #创建客户端套接字
    cs.connect()     #尝试连接服务器
    comm_loop:     #通信循环
        cs.send()/cs.recv()  #对话(发送/接收)
    cs.close()       #关闭客户端套接字

実際、クライアントの作成も上記の手順の翻訳です

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from socket import *

HOST = 'localhost'    #服务器的主机名
PORT = 21571     #端口号
BUFSIZ = 1024     #缓冲区
ADDR = (HOST,PORT)   #地址

tcpCliSocket = socket(AF_INET,SOCK_STREAM)  #创建客户端套接字
tcpCliSocket.connect(ADDR)     #连接服务器

while True:        #通信循环
  data = input('> ')    #客户端输入信息
  if not data:   #如果输入信息为空,则跳出循环,关闭通信
    break

  data = str.encode(data)      
  tcpCliSocket.send(data)   #发送客户端信息
  data = tcpCliSocket.recv(BUFSIZ)   #接受服务器返回信息
  if not data:    #如果服务器未返回信息,关闭通信循环
    break
  print('get:',data.decode('utf-8'))

tcpCliSocket.close()

もちろん、これは最も基本的なものにすぎません現時点では、ホスト名やポート番号などについてはよくわかりません。同じコンピュータ上で通信するだけであり、ポート番号も一致している必要があります。異なるコンピュータの場合はどうすればよいでしょうか。通信する?私はただの初心者です...

読んでいただきありがとうございます、皆さんのお役に立てれば幸いです、このサイトのサポートに感謝します!

Python ソケット ネットワーク プログラミング、TCP/IP サーバーおよびクライアント通信に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。