python TCP网络编程---练习例子1

环境:MACOS  +  python3

Service端

from socket import *
from time import ctime

HOST = ''
PORT = 48557
BUFSIZE = 1024
ADDR = (HOST, PORT)


def print_hi(name):
    # Use a breakpoint in the code line below to debug your script.
    print(f'Hi, {name}')  # Press ⌘F8 to toggle the breakpoint.


# Press the green button in the gutter to run the script.
if __name__ == '__main__':
    print_hi('PyCharm')
    tcp_socket = socket(AF_INET, SOCK_STREAM)
    tcp_socket.bind(ADDR)
    tcp_socket.listen(5)  # 限定传入链接的最大数量

    try:
        # 进入循环 等待链接
        while True:
            print("Waiting for Connection ... ... ")
            tcp_cli_socket, addr = tcp_socket.accept()
            # help(tcp_socket.accept())
            print("...connected from:", addr)

            while True:
                data = tcp_cli_socket.recv(BUFSIZE)
                data = data.decode('cp936')  # 网络传输字节,接收到后需要进行中文转码
                if not data:
                    break
                print(data)
                tcp_cli_socket.send(('[%s] %s' % (ctime(), data)).encode(encoding='cp936'))

            tcp_cli_socket.close()
    except:
        tcp_socket.close()

Client 端

# -*- coding: cp936 -*-

# 网络编程客户端
from socket import *

HOST = 'localhost'
PORT = 48557
BUFSIZE = 1024
ADDR = (HOST, PORT)


def start_client():
    tcp_client = socket(AF_INET, SOCK_STREAM)
    tcp_client.connect(ADDR)
    while True:
        data = input("> ")
        if not data:
            break
        data = data.encode(encoding='cp936')
        tcp_client.send(data)
        data = tcp_client.recv(BUFSIZE)
        if not data:
            break
        print(data.decode(encoding='cp936'))
    tcp_client.close()


if __name__ == '__main__':
    print("Start client ...")
    start_client()

需要注意的问题:

 1.send方法只接收bytes类型变量,因此在send之前需要使用decode进行转码,否则会报错

 2.python3不再支持raw_input, 而是input

 3.要支持中文输出,需要在传输和接受后,对数据进行转码(cp936就是gb2312)

实际效果如下:

增加功能:使用UDP制作聊天框:

服务端
 print("UDP Server:")
        udp_socket = socket(AF_INET, SOCK_DGRAM)
        udp_socket.bind(ADDR)
        try:
            while True:
                # print("Waiting message ......")
                data, udp_address = udp_socket.recvfrom(BUFSIZE)
                # print(udp_address)
                data = data.decode('cp936')
                print("receive < " + data)
                send_data = input('send >                             ')
                udp_socket.sendto(send_data.encode('cp936'), udp_address)
        except:
            udp_socket.close()


客户端
 print("UDP Client:")
        udp_socket = socket(AF_INET, SOCK_DGRAM)

        while True:
            send_data = input('send >                              ')
            if not send_data:
                break

            send_data = send_data.encode(encoding='cp936')
            udp_socket.sendto(send_data, ('localhost', 48559)) # 为什么不能使用ADDR?
            recv_data, ADDR = udp_socket.recvfrom(BUFSIZE)
            recv_data = recv_data.decode(encoding='cp936')
            print('receive < ' + recv_data)

        udp_socket.close()

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值