TCP
- протокол, обеспечивающий надежную последовательную доставку данных. Фактически, TCP предоставляет интерфейс, похожий на файловый ввод\вывод для сетевых соединений.TCP порт
- это “адрес” сетевого соединения в пределах одного хоста. TCP порты позволяют поддерживать множество открытых соединений на одной машине.import socket
req = "Hello tcp!"
# AF_INET for network connection
# SOCK_STREAM - for TCP
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 1234))
s.send(req)
res = s.recv(1024)
s.close()
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 1234))
s.listen(10) # 10 - количество клиентов в очереди
while True:
conn, addr = s.accept() # возвращается когда пришло новое соединение от клиента
while True:
data = conn.recv(1024)
if not data: break
conn.send(data)
conn.close()
sock.recv(n)
это значит что мы запросили n
байта из сокета, но сокет может нам вернуть количество в дипапзоне [0, n]. К примеру в случае если сокет вернул нам 10 байт, а нам нужно было 1024, то нужно вызывать метод recv
ещё раз.
def reveive_from_socket(sock, msglen):
msg = ''
while len(msg) < msglen:
chunk = sock.recv(msglen - len(msg))
if chunk == ''
raise RuntimeError('broken')
msg = msg + chunk
return msg
n
длина отправляемого сообщения, т.к. получатель может быть не готов получить такой объём данных - к примеру нет буфера такого размера.
def send_to_socket(sock, msg):
totalsent = 0
while totalsent < len(msg):
sent = sock.send(msg[totalsend:])
if sent == 0:
raise RuntimeError('broken')
totalsent = totalsent + sent