环境: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()