Python2 Socket编程

注:服务器端是在一台电脑上的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))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值