注:服务器端是在一台电脑上的PyCharm IDE上编写的,客户端是在另一台电脑的VS2015 IDE上编写的,所以对于中文会出现一些乱码问题,代码中对这些进行了处理。可以看到服务器端没有进行额外的编码处理,客户端进行了很多处理为了防止命令行窗口打印的中文乱码。
TCP Socket编程的一般步骤:
服务器端:
1、socket()方法创建一个socket对象
2、bind()方法绑定IP地址和端口号
3、调用listen()方法开始监听
4、通过accept()方法获取客户端请求,创建socket对象,进行通信
5、通过close()方法关闭连接
客户端:
1、socket()方法创建一个socket对象
2、给定IP地址和端口号,通过connect()方法请求连接
3、连接建立后,通过send()和recv()方法进行通信
4、close()方法关闭连接
示例(客户端向服务器请求传输一个小视频):
服务器端:
server.py文件
# _*_ coding: utf-8 _*_
import socket
import os
class Server(object):
def __init__(self):
self.server = socket.socket()
self.server.bind(("192.168.31.117", 8080))
def start_service(self):
self.server.listen(5)
count = 0
while True:
conn, addr = self.server.accept()
print '连接' + str(count) + '已建立,连接地址:', addr
mes_client = conn.recv(1024)
path = 'F:\\' + mes_client
size = os.stat(path).st_size
conn.sendall(str(size)) # 发送文件大小
try:
with open(path, 'rb') as f_obj: # 一定要以二进制流的方式打开文件
for line in f_obj:
conn.sendall(line)
print '文件发送完毕'
except IOError:
print mes_client + '文件操作异常!'
conn.close()
count += 1
if count > 5:
print '服务器关闭!'
break
test1.py
# coding=utf-8
from server import Server
sv = Server()
sv.start_service()
客户端:
# _*_ coding: UTF-8 _*_
import sys
import socket
import time
encodeType = sys.getfilesystemencoding() # 获取系统默认编码类型
def changeEncode(strs):
return strs.decode('utf-8').encode(encodeType) # 对字符串先解码再编码
start_time = time.time()
client = socket.socket()
client.connect(("192.168.31.117", 8080))
# 向服务器请求文件
client.sendall('pythonSocket.mp4')
file_size = int(str(client.recv(1024))) # 传输的文件大小
size = 0
path = 'F:\\pythonSocket.mp4' # 文件存储位置
try:
with open(path, 'wb') as f_obj: # 一定要以二进制流的方式打开文件
while size < file_size:
print size, file_size
mes = client.recv(1024)
f_obj.write(mes)
size += len(mes)
except IOError:
print changeEncode('文件操作异常')
end_time = time.time()
total_time = end_time - start_time
print changeEncode('文件接收完毕,耗时:') + str(total_time) + changeEncode('秒')
client.close()
UPD:
在这里我们给出一个udp通信的简单小例子:
服务器端:
# _*_ coding: utf-8 _*_
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
ip_port = ("192.168.31.117", 8080)
server.bind(ip_port)
server.settimeout(100)
while True:
data, addr = server.recvfrom(1024)
print '客户端发送的数据:', data
mes = '这里是服务器!'
server.sendto(mes, addr)
客户端:
# _*_ coding: utf-8 _*_
import socket
import sys
sysEncode = sys.getfilesystemencoding()
def changeEncode(strs):
return strs.decode('utf-8').encode(sysEncode)
ip_port = ("192.168.31.117", 8080)
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
mes = '这里是客户端!收到请回答!'
client.sendto(mes.decode(sysEncode).encode('utf-8'), ip_port)
data, addr = client.recvfrom(1024)
print '服务器回复:', changeEncode(str(data))