65.9K
CodeProject 正在变化。 阅读更多。
Home

没有 RFC 聊天服务器,带有 .NET 客户端或 Java 客户端

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.18/5 (6投票s)

2005年6月4日

CPOL

2分钟阅读

viewsIcon

71998

downloadIcon

646

一个可以设置为服务或应用程序的聊天服务器。 打开监听端口并等待来自 Java 客户端或 .NET 客户端的连接。 你甚至可以用一些 JavaScript 知识设置一个 HTML 刷新。 我只包含了服务器,因为我想得到一些关于我做线程方式的反馈。

引言

你好,我叫 Bobby。 很好奇我是如何在这个应用程序上做线程的? 我知道我们现在都看到了微软发布的 Cassini 网络服务器。 我已经在互联网网站/视频/聊天行业工作多年。 当 .NET 第一次发布时,我很好奇是否可以在 VB.NET 中创建一个视频服务器和聊天服务器。 这将成为我第一次在 Java 之外做线程,或者真正糟糕的 VB 控件做线程。

从那以后,我已经用 VB.NET 完成了这两个服务器。 第一个是使用服务器推送 JPG 图像流式传输到简单 Java 小程序的视频服务器。 这个服务器是视频的更好解决方案,因为我之前的解决方案需要为 Windows 构建一个 Apache,以及一位了解很多 C++ 但很少了解 MFC 的朋友。 :) 然而,最终我相信 Apache 服务器和我的视频服务器都有一个致命的问题,它们是如何线程化的?

这个项目包含一个当前位于 .NET 应用程序中的聊天服务器。 当然,它最终会以服务形式运行,但我仍在测试。 与 Apache 和我之前的服务器不同,这个服务器不会预加载 100-200-800 个线程来为客户端提供服务、存储图像/聊天文本。 这个使用 Socket.BeginRecieveSocket.BeginConnectSocket.BeginAccept 等... 正如我认为你们都知道的,这些是异步调用。 对于那些不知道的人,这些套接字函数不会阻塞,而是使用一个回调函数/子程序,当它们完成执行时。 据说有一些 Windows API 用于 IO W/套接字和驱动器甚至内存。 我很好奇这是否能承受 1000 个客户端,所有客户端都在队列服务器中寻找新行、禁令、踢、单词等.....

如果您对此感兴趣,请随时与我联系,我还在开发一个 ASYNC 视频服务器和视频捕获程序,并且已经编写了 Java 客户端,包括一个接收和显示实时视频但允许您像 TIVO 一样倒带和暂停的 Java 客户端等等...

这里有一些源代码片段

Private Sub Recieved(ByVal AR As IAsyncResult)
    Dim inBytes As Long
    Try
        inBytes = mySock.EndReceive(AR)
    Catch 'Socket Error 'We Close f***er...
        Console.WriteLine("Socket Closed")
        myState = ClientStates.Idle
        mySock.Close() : LeaveRoom()
        Exit Sub
    End Try
    rBufLen += inBytes
    rString = System.Text.ASCIIEncoding.ASCII.GetString(rBuffer, _
                                                     0, rBufLen)
    If inBytes <= 0 Then
        Console.WriteLine("Socket Closed")
        mySock.Close() : LeaveRoom()
        Exit Sub
    End If
    If myState = ClientStates.Sending Then myState = myStateLast
    If Not rString.IndexOf("<") >= 0 And _
                             rString.IndexOf(">") >= 2 Then
        Exit Sub
    End If
    SyncLock Me
        LastTimeHeard = Now
        If Not IsNothing(myUser) Then 
           Console.WriteLine("Setting " & myUser.Username & Now)
    End SyncLock
    Select Case myState
        Case ClientStates.WaitingCmd
            If IsCmdDone() Then
                If DEBUGME Then
                    Console.WriteLine("RECIEVED: " & rString)
                    DoCmd()
                End If
            Else
                If DEBUGME Then
                    'Console.WriteLine("Got Some Data: " & rString)
                End If
                mySock.BeginReceive(rBuffer, rBufLen, 2048, 
                                      SocketFlags.None, RecievedCB, Me)
            End If
        Case Else
    End Select
End Sub
Imports System.Net
Imports System.Net.Sockets
Imports System.Threading
Imports System.Runtime.InteropServices
Public Class ServerListen
    Private mySock As Socket
    Private SockConnectCB As AsyncCallback
    Private sockMode As Long
    Public Sub New(ByVal IP As String, ByVal Port As Integer, _ 
                                        ByVal Mode As Long)
        mySock = New Socket(AddressFamily.InterNetwork, _
                           SocketType.Stream, ProtocolType.Tcp)
        mySock.SetSocketOption(SocketOptionLevel.Socket, _
                                 SocketOptionName.KeepAlive, 1)
        mySock.Bind(New IPEndPoint(IPAddress.Parse(IP), Port))
        mySock.Listen(7)
        SockConnectCB = AddressOf SockConnect
        sockMode = Mode
        mySock.BeginAccept(SockConnectCB, Me)
    End Sub
    Public Sub SockConnect(ByVal AR As IAsyncResult)
        Try
            Dim S As Socket
            Dim C As Client
            'Dim sIP As String
            S = mySock.EndAccept(AR)
            S.SetSocketOption(SocketOptionLevel.Socket, _
                                 SocketOptionName.DontLinger, 1)
            S.SetSocketOption(SocketOptionLevel.Socket, _
                                  SocketOptionName.KeepAlive, 1)
            C = New Client
            Select Case sockMode
                Case ClientSockModes.modeADMIN
                    C.isADMIN = True
                Case ClientSockModes.modeHTTP
                    C.isHTTP = True
                Case ClientSockModes.modeCHAT
                    C.isCHAT = True
            End Select
            C.Accept(S)
            mySock.BeginAccept(SockConnectCB, mySock)
            SyncLock ezClients.SyncRoot
                If Not ezClients.ContainsKey(C.ThreadId) Then _
                         'This Guys f***ING WIth You, DUMP This Thread
                    ezClients.Add(C.ThreadId, C)
                End If
            End SyncLock
            'End If
        Catch ex As Exception
            If DEBUGME Then
                MsgBox("ERROR In ServerListen: " & ex.ToString())
            End If
        End Try
    End Sub
End Class

我很乐意与那些有意见、想看它或是在同一领域工作的开发人员分享任何代码。 如果我在这里发布的代码足够好,可以不以任何方式联系我就拿走,那么就让我感到荣幸,并乐于窃取。 然而,那些寻找快速下载和工作的互联网聊天解决方案的人将会感到惊讶 :) 此服务器使用非 RFC 方式的双向通信,因此需要客户端。

© . All rights reserved.