基于TCP的套接字编程

基于TCP协议的套接字编程(简单)

  • TCP又被称为流式协议,UDP被称为数据报协议(SOCK_DGRAM)
  • 以打电话为例

服务端

import socket

# 1.买一个手机		代表符合TCP/UDP协议	 代表使用TCP协议
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 2.绑定手机号, 也就是ip地址以及端口号,MAC地址会由ip地址解析
phone.bind(('127.0.0.1', 8080))	# 127.0.0.1就是本机ip地址

# 3.开机,半连接池,里面的参数是限制同时接受多少个半连接数
phone.listen(5)

# 4.等待电话打过来
print('wait...')
# 三次握手建立的双向连接,客户端的ip,端口号
conn, client_addr = phone.accept()
print(conn)
print(client_addr)

# 5.通信:收到信息
data = conn.recv(1024)
print(data)

# 6.回复信息
conn.send(data.upper())

# 7.挂电话
conn.close()

# 8.关机
phone.close()

客户端

import socket

# 1. 买手机
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 2.拨电话
phone.connect(('127.0.0.1', 8080))

# 3.通信,发信息
phone.send('hello'.encode('utf-8'))

# 4.通信,收信息
data = phone.recv(1024)
print(data)

# 5.关机
phone.close()

基于TCP协议的套接字编程(循环)

服务端

import socket

phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
phone.bind(('127.0.0.1', 8080))
phone.listen(5)
print('wait...')
while True:	# 连接循环
    conn, client_addr = phone.accept()
    print(client_addr)
    
    while True:	# 通信循环
        try:
            data = conn.recv(1024)
            if len(data) == 0:	# 客户端单方断开连接,服务端就会接收到空数据
                break
            print(data)
            conn.send(data.upper())
        except ConnectionResetError:
            break

客户端1

import socket

phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
phone.connect(('127.0.0.1', 8080))
while True:
    msg = input('输入要发送的信息:>>>').strip()
	phone.send(msg.encode('utf-8'))
    data = phone.recv(1024)
    print(data)
    
phone.close()

客户端2

import socket

phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
phone.connect(('127.0.0.1', 8080))
while True:
    msg = input('输入要发送的信息:>>>').strip()
	phone.send(msg.encode('utf-8'))
    data = phone.recv(1024)
    print(data)
    
phone.close()

补充:

listen(半连接数)

listen 是最大半连接数而不是连接数,半连接就是三次握手没有完成。

产生半连接的情况:

  1. 握了一次,服务器没来得及回复
  2. SYN攻击,客户端故意不进行第三次握手

在windows上,如果客户端异常断开,服务端报错,客户端正常退出,服务端一直接受空

如果是linux全是发空消息

原文地址:https://www.cnblogs.com/lucky75/p/11093667.html