Skip to main content

5 posts tagged with "Socket"

View All Tags

Python: UDP/IPv4 Socket Server/Client (1 Client接続のみ)

· 2 min read
Yu Sasaki
Enterprise Security Manager / Advisor

先日はTCPでのデータ送受だったので、今回はUDPプロトコルを用いた確認をする。

ソースコード(for Python 2.7)

補足はソースコード中のコメントを参照。サンプルの為、サーバ・クライアントは同一マシン上での実行を想定。 tsUdpServ.py

# coding: utf-8
from socket import *
from time import ctime
HOST = gethostname()
PORT = 34512
BUFSIZE = 1024
ADDR = (gethostbyname(HOST), PORT)
USER = 'Server'
udpServSock = socket(AF_INET, SOCK_DGRAM) # IPv4/UDPでソケット作成
udpServSock.bind(ADDR) # HOST, PORTでbinding
while True:
print 'Waiting for message...'
data, addr = udpServSock.recvfrom(BUFSIZE) # データ受信
print '...received from and returned to:', addr
udpServSock.sendto('%s > [%s] %s' % (USER, ctime(), data), addr) # データ送信
udpServSock.close()

TCPと大きく変わるところは、ソケットの作成時にソケットファミリーをSOCK_DGRAMとすること。また、listen()とaccept()メソッドが不要となったところあたりかな。 tsUdpClnt.py

# coding: utf-8
from socket import *
HOST = gethostname()
PORT = 34512
BUFSIZE = 1024
ADDR = (gethostbyname(HOST), PORT)
USER = 'Client'
udpClntSock = socket(AF_INET, SOCK_DGRAM)
while True:
data = raw_input('%s > ' % USER) # 標準入力からのデータ入力
if not data:
break
udpClntSock.sendto(data, ADDR) # データ送信
data, ADDR = udpClntSock.recvfrom(BUFSIZE) # データ受信
if not data:
break
print data # データ出力
udpClntSock.close()

Python: TCP/IPv4 Socket Server/Client (1 Client接続のみ)

· 2 min read
Yu Sasaki
Enterprise Security Manager / Advisor

PythonでSocketサーバ、クライアントの接続方法を下記のソースコードを用いて確認。C言語のどう程度のサンプルと比較すると行数が少なく、書きやすい。これがThreadやノンブロッキング・多重化を用いた時にどの程度膨らむかは今後確認予定。

ソースコード(for Python 2.7)

補足はソースコード中のコメントを参照。サンプルの為、サーバ・クライアントは同一マシン上での実行を想定。 tsTcpServ.py

# coding: utf-8
from socket import *
from time import ctime
HOST = gethostname()
PORT = 34567
BUFSIZE = 1024
ADDR = (gethostbyname(HOST), PORT)
USER = 'Server'
tcpSerSock = socket(AF_INET, SOCK_STREAM) # IPv4/TCPソケットとして作成
tcpSerSock.bind(ADDR) # アドレス、ポートのbinding
tcpSerSock.listen(5) # サーバソケットの最大接続要求の順番待ち数
while True:
print 'Waiting for connection...'
(tcpCliSock, addr) = tcpSerSock.accept() # 接続待受開始
print '...connected from.' , addr
while True:
data = tcpCliSock.recv(BUFSIZE) # C->Sデータの受信
if not data:
break
tcpCliSock.send('%s > [%s] %s' % (USER, ctime(), data)) # S->Cデータの送信
tcpCliSock.close() # Clientソケットのclose
tcpSerSock.close() # Serverソケットのclose (到達不能コード)

tsTcpclnt.py

# coding: utf-8
from socket import *
HOST = gethostname()
PORT = 34567
BUFSIZE = 1024
ADDR = (gethostbyname(HOST), PORT)
USER = 'Client'
tcpClntSock = socket(AF_INET, SOCK_STREAM)
tcpClntSock.connect(ADDR)
while True:
data = raw_input('%s > ' % USER) # 標準入力からのデータ入力
if not data:
break
tcpClntSock.send(data) # C->Sへデータ送信
data = tcpClntSock.recv(BUFSIZE) # S->Cのデータ受信
if not data:
break
print data
tcpClntSock.close()

Java: TCP Socket Echo Server/Client サンプル

· 3 min read
Yu Sasaki
Enterprise Security Manager / Advisor

以下の2つのサンプルコードはローカルでTCP Socketを用いたEchoサーバ/クライアントを走らせるもの。Javaのネットワークプログラミングで基本となるクラスとメソッドの使いどころを確認しておきたくて作成。まぁ今はnioがデファクトですけど。

サーバ

package tcpechoserver;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
public class Main {
private static final int BUFSIZE = 32; // 受信バッファサイズ
public static void main(String[] args) throws IOException {
int servPort = 5000;
// サーバソケットの作成
ServerSocket servSock = new ServerSocket(servPort);
int recvMsgSize; // 受信メッセージサイズ
byte[] receiveBuf = new byte[BUFSIZE]; // 受信バッファ
// クライアントからの接続を待ち受けるループ
while (true) {
Socket clntSock = servSock.accept(); // クライアントの接続を取得
SocketAddress clientAddress = clntSock.getRemoteSocketAddress();
System.out.println("接続中:" + clientAddress);
InputStream in = clntSock.getInputStream();
OutputStream out = clntSock.getOutputStream();
while ((recvMsgSize = in.read(receiveBuf)) != -1) {
out.write(receiveBuf, 0, recvMsgSize);
}
clntSock.close();
}
// 到達不能コード
}
}

Java: インターフェースとローカルのIPv6, IPv4アドレスの取得 - NetworkInterfaceクラス

· 2 min read
Yu Sasaki
Enterprise Security Manager / Advisor

下記のコードはネットワークインターフェース情報取得し、IPv6とIPv4のアドレスを取得、表示するサンプルコードです。

ソースコード

import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
/**
* ネットワークインターフェースの取得
*/
public class InetAddressesInfo {
private HashMap<networkInterface, ArrayList<inetAddress>> interfaceMap;
public InetAddressesInfo() {
interfaceMap = new HashMap<networkInterface, ArrayList<inetAddress>>();
}
public void getInterfaces() {
interfaceMap.clear();
try {
Enumeration<networkInterface> interfaceList = NetworkInterface.getNetworkInterfaces();
if (interfaceList == null) {
System.out.println("Message: No interfaces found");
} else {
while (interfaceList.hasMoreElements()) {
NetworkInterface iface = interfaceList.nextElement();
Enumeration<inetAddress> addrList = iface.getInetAddresses();
if (!addrList.hasMoreElements()) continue;
ArrayList<inetAddress> iaddress = new ArrayList<inetAddress>();
while (addrList.hasMoreElements())
iaddress.add(addrList.nextElement());
interfaceMap.put(iface, iaddress);
}
}
} catch (SocketException se) {
System.out.println("Error getting network interfaces: " + se.getMessage());
}
}
public void show() {
for (NetworkInterface n : interfaceMap.keySet()) {
System.out.println("Interface " + n.getName() + ": ");
for (InetAddress a : interfaceMap.get(n)) {
System.out.print("\tAddress " + ((a instanceof Inet4Address ? "(IPv4)"
: (a instanceof Inet6Address ? "(IPv6)" : "(?)"))));
System.out.println(": " + a.getHostAddress());
}
}
}
public HashMap<networkInterface, ArrayList<inetAddress>> getInterfaceMap() {
return interfaceMap;
}
public void setInterfaceMap(
HashMap<networkInterface, ArrayList<inetAddress>> interfaceMap) {
this.interfaceMap = interfaceMap;
}
public static void main(String[] args) {
InetAddressesInfo i = new InetAddressesInfo();
i.getInterfaces();
i.show();
}
}

実行結果

Interface lo:
Address (IPv6): 0:0:0:0:0:0:0:1
Address (IPv4): 127.0.0.1
Interface net4:
Address (IPv6): fe80:0:0:0:0:5efe:c0a8:10a%12
Interface net5:
Address (IPv6): 2001:0:4137:9e76:8ae:1cf7:3f57:fef5
Address (IPv6): fe80:0:0:0:8ae:1cf7:3f57:fef5%13
Interface eth3:
Address (IPv6): 2001:c90:33d:21d4:919c:836b:2d1a:cf33
Address (IPv6): 2001:c90:33d:21d4:8856:aef1:d0bd:db64
Address (IPv6): fe80:0:0:0:919c:836b:2d1a:cf33%11
Address (IPv4): 192.168.1.10

ドキュメント

NetworkInterface (Java Platform SE 6)

AIR: Webサーバ、Socketの接続状況を検知 - URLMonitor、SocketMonitorクラス

· 2 min read
Yu Sasaki
Enterprise Security Manager / Advisor

任意のアドレスのWebサイト[サービス]のネットワーク状況を検知するURLMonitorと、任意のサーバ+ポートに接続可能か否かを検知するSocketMonitorクラスの動作サンプルを下記に示します。

ソースコード

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
applicationComplete="startup()">
<mx:Script>
<![CDATA[
import air.net.SocketMonitor
import air.net.URLMonitor;
import flash.net.URLRequest;
import flash.events.StatusEvent;
private var SERVER_URL:String = "http://www.yukun.info/";
private var SOCK_ADRR:String = "yukun.info";
private var PORT:int = 6667;
private var INTERVAL_TIME:int = 3000; // ms
private var serviceMonitor:URLMonitor = null;
private var socketMonitor:SocketMonitor = null;
private function startup():void {
var endpoint:URLRequest = new URLRequest(SERVER_URL);
serviceMonitor = new URLMonitor(endpoint);
serviceMonitor.addEventListener(StatusEvent.STATUS, onStatusEvent);
serviceMonitor.pollInterval = INTERVAL_TIME;
serviceMonitor.start();
socketMonitor = new SocketMonitor(SOCK_ADRR, PORT);
socketMonitor.addEventListener(StatusEvent.STATUS, onSocketStatusChange);
socketMonitor.pollInterval = INTERVAL_TIME;
socketMonitor.start();
}
// ネットワークサービスの状態の検知
private function onStatusEvent(e:StatusEvent):void {
var date:Date = new Date();
trace(date.toLocaleTimeString());
trace(SERVER_URL + "に" + (serviceMonitor.available ? "接続可" : "切断中"));
}
private function onSocketStatusChange(e:StatusEvent):void {
trace(SOCK_ADRR + "のポート" + PORT + "は" +
(socketMonitor.available ? "接続可" : "切断中"));
}
]]]]><![CDATA[>
</mx:Script>
</mx:WindowedApplication>

実行結果

http://www.yukun.info/に接続可
yukun.infoのポート6667は切断中

URLMonitorはネットワーク状況を検知する為にサーバへGETリクエストを送出して、レスポンスのステイタスコードを確認して判断しているようです↓。

リファレンス

  • URLMonitor - ActionScript 3.0 言語およびコンポーネントリファレンス
  • Adobe AIR 1.1 * ネットワーク接続の監視