VB如何实现传输语音和文件,我想做个聊天工具

VB如何实现传输语音和文件,我想做个聊天工具,第1张

传输语音和文件都可以通过Mswinsock 实现,只是速度方面我没有试过,我正巧最近也弄了点Mswinsock 相关的东西,代码发给你看看,希望有帮助

传送文件对于网络编程来说是基本的功能,比如远程控制软件。在编制一个软件时,我从网上下了很多传文件的程序,这些程序提供的传文件功能根本就不能用。传文本还可以,传二进制文件根本就不行。因此,作为一个基本的功能模块,有必要单独介绍一下。

首先,在VB中要传送字符串,你可以这样写:

Dim strData As String

strData = "Test"

Winsock1SendData strData

但是如果你传送的二进制文件,你还能用String变量来存放吗?从理论上分析是不行的,我也做了实验,确实是不行的。文件虽然可以传,但是接受的文件和发送的不一样,原因可能是二进制文件里可以有任何"字符",但是不是所有的字符都可以放在String变量里。

除了String类型的变量,VB中其他类型的变量都只有几个字节长,难道一次只能发几个字节吗?那样岂不是要累死机器了!其实,情况没有那么悲观,我们完全可以使用数组来解决这个问题,就是使用byte数组。把要传送的文件都读到数组里,然后发送出去。程序如下:

FileName 为要传送的文件名,WinS为发送文件的WinSock控件。这是一个发送端的程序。

Public Sub SendFile(FileName As String, WinS As Winsock)

Dim FreeF As Integer ''空闲的文件号

Dim LenFile As Long ''文件的长度

Dim bytData() As Byte ''存放数据的数组

FreeF = FreeFile ''获得空闲的文件号

Open FileName For Binary As #FreeFile ''打开文件

DoEvents

LenFile = LOF(FreeFile) ''获得文件长度

ReDim bytData(1 To LenFile) ''根据文件长度重新定义数组大小

Get #FreeFile, , bytData ''把文件读入到数组里

Close #FreeFile ''关闭文件

WinSSendData bytData ''发送数据

End Sub

接受端的程序如下:

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)

Dim bytData() As Byte

Dim f

f = FreeFile

Open strFileName For Binary As #f

ReDim bytData(1 To bytesTotal)

Winsock1GetData bytData

Put #f, i, bytData

i = i + bytesTotal ''保证每次写都是在文件的末尾, i是个全局变量

Close #f

End Sub

这里有两个需要注意的地方,ReDim Preserve bytData(1 To LenFile),下标是从1开始的,如果你写成ReDim bytData( LenFile),下标就是从0开始了,数组就有LenFile+1长了。LenFile = LOF(FreeFile)中的LOF是获得文件长度的函数,是VB里带的,我见过很多例子用API,或者循环的读直到末尾来获取文件长度,这样都是很麻烦的,使用LOF函数就可以了。

这样的程序,即可以传送文本文件,也可以传送二进制文件。但是你有没有发现这个程序的问题呢?如果我要传送一个50M的文件呢?系统可以为bytData分配50M的内存空间吗?

于是笔者拿一个50M的文件做实验吧,接收到的文件和原来的文件不一样,比原来的大。问题出在那呢?

首先,根据文件大小重新定义bytData数组的大小本身就有问题,系统是不可能无限制的给数组分配空间的,即使可以,也会造成系统响应变慢。在传50M文件的时候,系统就跟死机了一样。那么怎么解决这个问题呢,一个自然的想法就是把数据分段传送。程序如下:

发送程序, iPos是个全局变量,初始值为0。这个变量保存着当前数据的位置。Const iMax = 65535是每个数据块的大小。

Dim FreeF As Integer ''空闲的文件号

Dim LenFile As Long ''文件的长度

Dim bytData() As Byte ''存放数据的数组

FreeF = FreeFile ''获得空闲的文件号

Open FileName For Binary As #FreeF ''打开文件

DoEvents

LenFile = LOF(FreeF) ''获得文件长度

If LenFile <= iMax Then ''如果要发送的文件小于数据块大小,直接发送

ReDim bytData(1 To LenFile) ''根据文件长度重新定义数组大小

Get #FreeF, , bytData ''把文件读入到数组里

Close #FreeF ''关闭文件

WinSSendData bytData ''发送数据

Exit Sub

End If

''文件大于数据块大小,进行分块发送

Do Until (iPos >= (LenFile - iMax)) ''发送整块数据的循环

ReDim bytData(1 To iMax)

Get #FreeF, iPos + 1, bytData

WinSSendData bytData

iPos = iPos + iMax ''移动iPos,使它指向下来要读的数据

Loop

''这里要注意的是,必须检查文件有没有剩下的数据,如果文件大小正好等于数据块大小的

'' 整数倍,那么就没有剩下的数据了

ReDim bytData(1 To LenFile - iPos) ''发送剩下的不够一个数据块的数据

Get #FreeF, iPos + 1, bytData

WinSSendData bytData

Close #FreeF

下面是接收端的程序:

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)

Dim bytData() As Byte

Dim lLenFile As Long

Dim f

f = FreeFile

Open strFileName For Binary As #f ''strFileName是文件名

lLenFile = LOF(f)

ReDim bytData(1 To bytesTotal)

Winsock1GetData bytData

If lLenFile = 0 Then ''lLenFile=0表示是第一次打开文件,这里有个问题,就是''如果如果该文件存在的话,就会出错,应该在打开前检查文件是否存在。(这里我省略了)

Put #f, 1, bytData

Else

Put #f, lLenFile + 1, bytData

End If

Close #f

End Sub

Dim vhour As Integer, vminute As Integer, vsecond As Integer

Private Sub Form_Load()

Timer1Enabled = True

Timer1Interval = 1000

End Sub

Private Sub Timer1_Timer()

vhour = Hour(Time)

vminute = Minute(Time)

vsecond = Second(Time)

If vminute = 0 And vsecond = 0 Then

WindowsMediaPlayer1URL = AppPath & "/现在时刻mp3"

WindowsMediaPlayer1Controlsplay

WindowsMediaPlayer1URL = AppPath & "/" & vhour & "mp3"

WindowsMediaPlayer1Controlsplay

End If

End Sub

没用过mic控件,用WindowsMediaPlayer控件代替了,人人电脑里都有(XP系统,部件拉到底)

窗体放一个WindowsMediaPlayer1,一个timer1

其中两段声音需要你自己准备的,你应该看得懂代码吧,准备好<现在时刻>的声音和0点到晚上11点的声音,apppath只想的是程序自身文件夹下,你保存下工程,再把音乐放到文件夹下就好了

我这里是用小时代替了音乐的名字 所以0点的音乐名应该是“0mp3” 1点是“1mp3”。。。晚上11点是“23mp3” 以此类推,还不明白加我QQ,程序没测试过。。。没耐心等。。。

可以从你这个程序进行扩展,正好之前,我参加一个项目是java聊天工具开发。

虽然编程语言不同,但是思路是相同的。

你现在已经有一个客户端程序和服务端程序了。

目前一般的聊天工具都是在服务端转送文本,而像视频、语音则是用点对点。

在服务端用winsock控件数组监听多个客户端,每一个winsock控件对应一个连接到客户端。

客户端不用改很多。

但多人聊天,比较复杂,需要加入简单的聊天协议。

就最简单的来说是首字母协议。

客户端要发送信息给另一个客户端,

比如P [另一个客户端的名字] 文本内容,

到了服务器,服务器根据首字母,和给出的客户端名字,在winsock数组中查找到对应的连接,再转发到对应的客户端。

大概就是这样。

引用:

Microsoft Speech Object Library

代码

通用部分

Dim Voice As New SpVoice

执行部分

VoliceSpeak Text1Text

不明白再Hi我

我的理解是这样的:

我们的目的:向文本框输入语音文字

操作过程就得分两步:

一:获取语音文字进行存储

二:将语音文字写入文本框

这样实施起来你就有了明确的操作过程。

语音识别这方面的技术我现在没有,你可以在网上查找相应的技术或者购买相应的技术,只要将语音转换成了文字,相信再写入文本框你就可以很简单的操作了

欢迎分享,转载请注明来源:表白网

原文地址:https://h5.hunlipic.com/biaobai/3787904.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2024-03-25
下一篇2024-03-25

发表评论

登录后才能评论

评论列表(0条)

    保存