Python——TCP Server & Client

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014471752/article/details/84313742

使用python进行网络编程,创建TCP Server和Client端,进行本地回环测试

目录

Server端

server端流程

结束connect流程:

Client端 

Client端流程


Server端

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)

server端流程

1. 创建socket

2. bind IP和Port

3. 监听连接

4. accept到连接信息

经过上述步骤后,即可进行与客户端的信息交互了,使用socke中的函数send和recv进行数据的发送和接收

结束connect流程:

当收到客户端发送的disconnect信息后,结束数据接收,关闭客户端链接的socket和本身服务器的socket

这里需要用户手动去设置断开链接的接头暗号,socket并没有提供这样的自动化交互方式,根据代码中看,如果不设置接头暗号而直接将任意一端直接断开连接,但是另一端会处于send/recv状态,这时会报错,显示有一端没有友好的进行断开连接的操作,而是强制断开,带来不好的用户体验,而且不方便进行下次连接。


Client端 

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)

Client端流程

1. 创建socket

2. connect到server端,连接时采用循环超时机制,循环连接直到连接上或者超时退出

连接上服务器之后,便可以与server端进行交互

猜你喜欢

转载自blog.csdn.net/u014471752/article/details/84313742