はじめに
robtframework上からpythonのソースコードを呼び出しソケット通信を行っている際にエラーが発生しました。
今回はその時の原因と対処方法についてのメモです。
ソースコード&エラー
ソケットのサーバ側はフリーのアプリを利用していました。
robotframeworkとpythonのソースコードは次の通りです。
*** Settings ***
Library socket_test.py
*** Variables ***
${IP_ADD} 127\.0\.0\.1
*** Keywords ***
*** Test Cases ***
Test
${return_wd}= py_socket ${IP_ADD} 5000
Log To Console ${\n}${return_wd}
robotframeworkを実行してpythonのソケットを呼び出しています。
import socket
from robot.api import logger
def py_socket(ip_addr, port_num):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
param = (ip_addr, int(port_num))
s.connect(param)
print(ip_addr, 'Port:', str(port_num), 'へ接続中')
logger.console(ip_addr, 'Port:', str(port_num), 'へ接続中')
s.send(b'test')
result = int(s.recv(256).decode().rstrip('\n'))
return result
これを実行すると
PS C:\Users\****\Desktop\robotframework\socket> robot .\socket_test.robot
==============================================================================
Socket Test
==============================================================================
Test | FAIL |
ConnectionRefusedError: [WinError 10061] 対象のコンピューターによって拒否されたため、接続できませんでした。
------------------------------------------------------------------------------
Socket Test | FAIL |
1 test, 0 passed, 1 failed
==============================================================================
エラーメッセージ
「ConnectionRefusedError: [WinError 10061] 対象のコンピューターによって拒否されたため、接続できませんでした。」
が表示されました。
原因と対処方法
原因は指定したポート番号でした。
ポート番号によっては既に利用されているものがあり、今回はそれに該当した(ようです)
ポートが合いているかを確認するには、
Windowsの場合、コマンドかコントロールパネル(ファイヤーウォール)から確認出来ます。
コマンドの場合は、プロンプトを開いて
netstat -an
を実行。
コントロールパネルの場合、スタート下の検索ボックスで「コントロールパネル」と入力。
コントロールパネルを開いた後に「システムとセキュリティ」→「Windows Defender ファイヤーウォール」を選びます。
左にある「詳細設定」をクリックするとWindows Defenderの詳細が表示されます。
そこで受信、送信のそれぞれの利用状況が確認出来ます。
また、ポート番号に指定がない場合は誰でも任意に使用できる「49152〜65535」を使うのが良いかと思います。
さいごに
今回はポート番号による通信が出来ない問題でした。
通信に詳しくない場合ポート番号が悪さをしている等わからない(最初は僕もさっぱりでした)ので、起こりうるエラーかと思います。
この記事がお役に立ったのなら嬉しいです。
最後までお読みいただきありがとうございます。