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






2.18/5 (6投票s)
一个可以设置为服务或应用程序的聊天服务器。 打开监听端口并等待来自 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.BeginRecieve
和 Socket.BeginConnect
和 Socket.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 方式的双向通信,因此需要客户端。