未例网站,218.201.168.14 端口:589
用telnet可以收到文本形式的字符(是不间断的)。可是我用winsock得不到。有没有这方面的源码?或是思路。
我找了个TELNET的源码。只能得到前几行。之后的就得不到了。不知道什么原因。这样数据量比较大的话,VB应该用哪种方法进行处理?

解决方案 »

  1.   

    对于数据量比较大的网络传输,可以使用一个文件作缓冲,然后从文件里获得内容,这样可以避免内存伸缩和UNICODE字符转换带来的效率低下问题,最主要的是还可以避免半个汉字现象的出现。(俺曾经测试过,使用VB接收到网络二进制数据流后,然后转换成UNICODE,由于其间需要不段调整和释放内存,速度上反而比不过磁盘文件,也许有人说不可能,但这是事实,当然前提是网络数据流比较大,而且接收端电脑比较空闲)。
      

  2.   

    自己构建个HTTP请求包往HTTP服务器上扔,自然会有数据回来
      

  3.   

    使用WININET API,俺在博客里写有源代码,自己找一些吧。
      

  4.   

    Option Explicit
    'WININET API
    Public Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal lpszAgent As String, ByVal dwAccessType As Long, ByVal lpszProxyName As String, ByVal lpszProxyBypass As String, ByVal dwFlags As Long) As Long
    Public Declare Function InternetOpenUrl Lib "wininet.dll" Alias "InternetOpenUrlA" (ByVal hInternet As Long, ByVal lpszUrl As String, ByVal lpszHeaders As String, ByVal dwHeadersLength As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Long
    Public Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, ByVal lpBuffer As Long, ByVal dwNumberOfBytesToRead As Long, lpdwNumberOfBytesRead As Long) As Boolean
    Public Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInternet As Long) As Boolean
    Public Const INTERNET_OPEN_TYPE_PRECONFIG As Long = &H0
    Public Const INTERNET_FLAG_NO_CACHE_WRITE As Long = &H4000000
    Public Const INTERNET_FLAG_RELOAD As Long = &H80000000
    Public Declare Function InternetCanonicalizeUrl Lib "wininet.dll" Alias "InternetCanonicalizeUrlA" (ByVal lpszUrl As String, ByVal lpszBuffer As Long, lpdwBufferLength As Long, dwFlags As Long) As Boolean
    Public Const ICU_BROWSER_MODE = &H2000000
    Public Const ICU_ENCODE_SPACES_ONLY = &H4000000
    Public Const ICU_NO_META = &H8000000
    Public Const ICU_DECODE = &H10000000
    Public Const ICU_NO_ENCODE = &H20000000'ÎļþAPI
    Public Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
    Public Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, ByVal lpBuffer As Long, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, ByVal lpOverlapped As Long) As Long
    Public Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, ByVal lpBuffer As Long, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lpOverlapped As Long) As Long
    Public Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long
    Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Public Const FILE_BEGIN = 0
    Public Const CREATE_ALWAYS = 2
    Public Const FILE_ATTRIBUTE_NORMAL = &H80
    Public Const FILE_ATTRIBUTE_TEMPORARY = &H100
    Public Const GENERIC_READ = &H80000000
    Public Const GENERIC_WRITE = &H40000000'ϵͳĿ¼API
    Public Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
    Public Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
    Public Function GetResponse(ByVal Url As String, Optional ByVal strFileName As String = "") As String
        Dim bytesBuffer() As Byte
        Dim hInternet As Long, hUrl As Long, hFile As Long
        Dim lpdwNumberOfBytesRead As Long, dwTotalBytes As Long, dwWritten As Long
        Dim strPath As String, strFile As String, strBuffer As String * 255    hInternet = InternetOpen("Open URL Application", INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, INTERNET_FLAG_NO_CACHE_WRITE)
        hUrl = InternetOpenUrl(hInternet, Url, vbNullString, 0, INTERNET_FLAG_RELOAD, 0)
        If hUrl <> 0 Then
            ReDim bytesBuffer(4095)
            If Len(strFileName) = 0 Then
                GetTempPath Len(strBuffer), strBuffer
                strPath = Left(strBuffer, InStr(strBuffer, Chr(0)) - 1)
                strFile = strPath & "\Cache" & CStr(App.ThreadID) & ".dat"
            Else
                strFile = strFileName
            End If
            hFile = CreateFile(strFile, GENERIC_READ Or GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL Or FILE_ATTRIBUTE_TEMPORARY, 0)
            Do
                Call InternetReadFile(hUrl, VarPtr(bytesBuffer(0)), 4096, lpdwNumberOfBytesRead)
                If lpdwNumberOfBytesRead > 0 Then
                    WriteFile hFile, VarPtr(bytesBuffer(0)), lpdwNumberOfBytesRead, dwWritten, 0
                    dwTotalBytes = dwTotalBytes + lpdwNumberOfBytesRead
                Else
                    Exit Do
                End If
            Loop
            If Len(strFileName) = 0 And dwTotalBytes > 0 Then
                ReDim bytesBuffer(dwTotalBytes - 1)
                SetFilePointer hFile, 0, ByVal 0, FILE_BEGIN
                ReadFile hFile, VarPtr(bytesBuffer(0)), dwTotalBytes, dwWritten, 0
                GetResponse = StrConv(bytesBuffer, vbUnicode)
            End If
            CloseHandle hFile
            Erase bytesBuffer
        Else
            GetResponse = "Inner_Error"
        End If
        Call InternetCloseHandle(hUrl)
        Call InternetCloseHandle(hInternet)
    End Function
      

  5.   

    楼上的注意。是我表达错了。不是一个网站,是一个公网IP上面的。你可以用TELNET连上试试。