вторник, 26 июля 2016 г.

Сокет-сервера в Linux. (CentOS7).

1. NETCAT

В качестве сокет-сервера может выступать утилита netcat.
Сначала убедимся, что сервер на основе netcat работает и ему ничего не мешает. Запускаем на каком-нибудь сервере Linux сокет-сервер таким образом:
# nc -v -l 10.10.50.250 8021
Ip 10.10.50.250 – это Ip адрес нашего сервера.
8021 – это порт, который будет слушать сервер.
C другой машины подключаемся к созданному сокету так:
# nc 10.10.50.250 8021

Теперь можно писать друг другу что-то в чате и на обоих системах и это будет отображаться в обоих консолях.
При закрытии соединения с одной стороны, соединение закроется и с другой стороны.

С клиентской машины послать в порт данные можно так
# echo "12345" | nc 10.200.16.214 8021
Правда и в этот раз после приема данных сервер закроет соединение.
Для того что бы сервер каждый раз открывал соединение заново при закрытии сессии запускаем сервер так(с ключиком -k):
# nc -k -v -l 10.200.16.214 8021

2. PYTHON SOCKETSERVER

Ссылка на библиотеку сокет-сервера PYTHON:
https://docs.python.org/2/library/socketserver.html

Существует 4 класса SocketServer на PYTHON. Нас интересует класс TCPServer. 
Создание сервера требует нескольких шагов. Во-первых, необходимо создать класс обработчик - подкласс класса BaseRequestHandler и переопределить в обработчике метод handle (); Этот метод будет обрабатывать входящие запросы. Во-вторых, нужно создать экземпляр класса TCPServer, передавая ему адрес сервера и класса обработчика.
Затем вызвать handle_request() или serve_forever().
Для закрытия сокета вызывается server_close ()

Файл сервера servcall.py:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import SocketServer

class MyTCPHandler(SocketServer.BaseRequestHandler):

    def handle(self):
        # self.request is the TCP socket connected to the client
        self.data = self.request.recv(1024).strip()
        print "{} wrote:".format(self.client_address[0])
        print self.data
        self.request.sendall(self.data.upper())


server = SocketServer.TCPServer(("localhost", 8022), MyTCPHandler)
# Активация сервера до ввода Ctrl-C
server.serve_forever()
Сервер делает только одно: переводит все буквы в верхний регистр и отвечает тем же текстом клиенту.
Запуск сервера выполняется так:
# ./servcall.py

В соседней консоли создаем клиента.
Файл клиента clientsocketserv.py:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import socket
import sys

HOST, PORT = "10.200.16.214", 8022
data = " ".join(sys.argv[1:])

# Create a socket (SOCK_STREAM means a TCP socket)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
    # Connect to server and send data
    sock.connect((HOST, PORT))
    sock.sendall(data + "\n")

    # Receive data from the server and shut down
    received = sock.recv(1024)
finally:
    sock.close()

print "Sent:     {}".format(data)
print "Received: {}".format(received)
Клиент принимает все аргументы команды запуска и отправляет их серверу

Запуск клиента:
# ./clientsocketserv.py 12345 privet drug
При этом мы увидим:
Sent:     12345 privet drug
Received: 12345 PRIVET DRUG
В консоли сервера будет отображено:
127.0.0.1 wrote:
12345 privet drug


Комментариев нет:

Отправить комментарий