使用python进行网络编程,创建TCP Server和Client端,进行本地回环测试
目录
import socket
import sys
import struct
SEND_BUF_SIZE = 256
RECV_BUF_SIZE = 256
Communication_Count: int = 0
receive_count : int = 0
def start_tcp_server(ip, port):
# create socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = (ip, port)
# bind port
print("starting listen on ip %s, port %s" % server_address)
sock.bind(server_address)
# get the old receive and send buffer size
s_send_buffer_size = sock.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF)
s_recv_buffer_size = sock.getsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF)
print("socket send buffer size[old] is %d" % s_send_buffer_size)
print("socket receive buffer size[old] is %d" % s_recv_buffer_size)
# set a new buffer size
sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, SEND_BUF_SIZE)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, RECV_BUF_SIZE)
# get the new buffer size
s_send_buffer_size = sock.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF)
s_recv_buffer_size = sock.getsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF)
print("socket send buffer size[new] is %d" % s_send_buffer_size)
print("socket receive buffer size[new] is %d" % s_recv_buffer_size)
# start listening, allow only one connection
try:
sock.listen(1)
except socket.error:
print("fail to listen on port %s" % e)
sys.exit(1)
while True:
print("waiting for connection")
client, addr = sock.accept()
print("having a connection")
break
msg = 'welcome to tcp server' + "\r\n"
receive_count = 0
receive_count += 1
while True:
print("\r\n")
msg = client.recv(16384)
msg_de = msg.decode('utf-8')
print("recv len is : [%d]" % len(msg_de))
print("###############################")
print(msg_de)
print("###############################")
if msg_de == 'disconnect':break
msg = ("hello, client, i got your msg %d times, now i will send back to you " % receive_count)
client.send(msg.encode('utf-8'))
receive_count += 1
print("send len is : [%d]" % len(msg))
print("finish test, close connect")
client.close()
sock.close()
print(" close client connect ")
if __name__=='__main__':
start_tcp_server('127.0.0.1',6000)
1. 创建socket
2. bind IP和Port
3. 监听连接
4. accept到连接信息
经过上述步骤后,即可进行与客户端的信息交互了,使用socke中的函数send和recv进行数据的发送和接收
当收到客户端发送的disconnect信息后,结束数据接收,关闭客户端链接的socket和本身服务器的socket
这里需要用户手动去设置断开链接的接头暗号,socket并没有提供这样的自动化交互方式,根据代码中看,如果不设置接头暗号而直接将任意一端直接断开连接,但是另一端会处于send/recv状态,这时会报错,显示有一端没有友好的进行断开连接的操作,而是强制断开,带来不好的用户体验,而且不方便进行下次连接。
import socket
import sys
receive_count : int = 0
def start_tcp_client(ip,port):
###create socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
failed_count = 0
while True:
try:
print("start connect to server ")
s.connect((ip,port))
break
except socket.error:
failed_count += 1
print("fail to connect to server %d times" % failed_count)
if failed_count == 100: return
# send and receive
while True:
print("connect success")
#get the socket send buffer size and receive buffer size
s_send_buffer_size = s.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF)
s_receive_buffer_size = s.getsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF)
print("client TCP send buffer size is %d" % s_send_buffer_size)
print("client TCP receive buffer size is %d" %s_receive_buffer_size)
receive_count = 0
while True:
msg = 'hello server, i am the client'
s.send(msg.encode('utf-8'))
print("send len is : [%d]" % len(msg))
msg = s.recv(1024)
print(msg.decode('utf-8'))
print("recv len is : [%d]" % len(msg))
receive_count+= 1
if receive_count==14:
msg = 'disconnect'
print("total send times is : %d " % receive_count)
s.send(msg.encode('utf-8'))
break
break
s.close()
if __name__=='__main__':
start_tcp_client('127.0.0.1',6000)
1. 创建socket
2. connect到server端,连接时采用循环超时机制,循环连接直到连接上或者超时退出
连接上服务器之后,便可以与server端进行交互