小弟用.NET实现即时聊天工具(类似QQ),有不少请各位高手提出宝贵意见

liyoukebit 2004-03-13 10:00:51
1,请问服务器和客户端的通信采用哪一层比较好,直接用socket、还是用WebRequest和WebResponse、或者是采用.NET Remoting.
2, 采用何种协议:UDP 、Http、 Tcp。
3,当服务器向在局域网的客户端发送数据,用UDP如何路由、通过防火墙。


欢迎大家各抒己见,分不够在加。
...全文
257 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
babyjavalover 2004-03-29
  • 打赏
  • 举报
回复
关注
goldenwing 2004-03-29
  • 打赏
  • 举报
回复
Imports System
Imports System.Net
Imports System.Net.Sockets
Imports System.Threading
Imports System.Text

Public Class Chat
Private Shared m_Client As UDPClient

Private Shared ListenerPort As Integer = 8080
Private Shared SenderPort As Integer = 8080
Private Shared LocalPort As Integer
Private Shared RemotePort As Integer

Private Shared m_szHostName As String

Private Shared m_GroupAddress As IPAddress
Private Shared m_LocalHost As IPHostEntry
Private Shared m_RemoteEP As IPEndPoint

Private Shared m_Done As Boolean = False

Public Shared Sub Usage()
Console.WriteLine("UDP 多路广播聊天实用工具")
Console.WriteLine("\n用法::")
Console.WriteLine("chat.exe")
End Sub

Public Shared Sub Main()
LocalPort = SenderPort
RemotePort = ListenerPort
Dim args As String() = Environment.GetCommandLineArgs()

If (args.Length > 1) Then
' 输出帮助消息,因为此实用工具不采用任何参数
Usage()
Exit Sub
End If

m_szHostName = DNS.GetHostName()
m_LocalHost = DNS.GetHostByName(m_szHostName)

Console.WriteLine("本地端口:{0},远程端口:{1}", LocalPort, RemotePort)
Console.WriteLine("正在初始化...")

Initialize()
Console.WriteLine("正在启动侦听器线程...")

Dim t As Thread
t = New Thread(AddressOf Listener)
t.Start()

Dim buffer() As Byte
Dim ASCII As Encoding = Encoding.ASCII

Dim m_ShuttingDown As Boolean = False

While (Not (m_ShuttingDown))
Dim s As String = Console.ReadLine()

If (s.Length = 0) Then
'continue()
End If

If (String.Compare(s, 0, "@", 0, 1) = 0) Then
m_Done = True
' 将结束符发送给我们自己,
' 以便接收线程可以关闭
s = m_szHostName & ":@"
m_ShuttingDown = True
Else
s = m_szHostName + ":" & s
End If

ReDim buffer(s.Length + 1)

' 将数据发送给远程对方主机

Dim len As Integer = ASCII.GetBytes(s.ToCharArray(), 0, s.Length, buffer, 0)
Dim ecode As Integer = m_Client.Send(buffer, len, m_RemoteEP)

If (ecode <= 0) Then Console.WriteLine("发送时出错:" & ecode)
End While

t.Abort()
t.Join()
Console.WriteLine("正在关闭连接...")
Terminate()
End Sub 'Main


Public Shared Sub Terminate()
m_Client.DropMulticastGroup(m_GroupAddress)
End Sub

Public Shared Sub Initialize()
' 实例化 UDPCLient
m_Client = New UDPClient(LocalPort)

' 创建多路广播组对象
m_GroupAddress = IPAddress.Parse("224.0.0.1")

' 联接组
Try
m_Client.JoinMulticastGroup(m_GroupAddress, 100)
Catch Exc As Exception
Console.WriteLine("无法联接多路广播组")
End Try

' 创建对方主机的终结点
m_RemoteEP = New IPEndPoint(m_GroupAddress, RemotePort)

End Sub

Public Shared Sub Listener()
' 侦听器等待数据到来
' 并用缓冲区保存它。

Try
Thread.Sleep(2000) ' 确保 client2 正在接收
Dim ASCII As Encoding = Encoding.ASCII

While (Not m_Done)
Dim endpoint As IPEndPoint
Dim data() As Byte = m_Client.Receive((endpoint))

Dim strData As String = ASCII.GetString(data)

If strData.IndexOf(":@") > 0 Then

' 我们接收到一个终止指示,
' 现在我们必须确定它是来
' 自我们的主线程的关闭,
' 还是来自其他地方

Dim separators() As Char = {CChar(":")}
Dim vars() As String = strData.Split(separators)

If (vars(0) = m_szHostName) Then
' 这是来自我们自己的线程,因此立即结束
Console.WriteLine("正在关闭侦听器线程...")

' 此过程应已由主线程完成了,但为
' 安全起见,我们再执行一次
m_Done = True
Else
' 这是来自其他地方的
Console.WriteLine("{0} 已离开对话", vars(0))
End If
Else
' 这是从其他地方以及我们自己
' 处接收到的正常数据
' 在输出前,查看它是否来自我
' 们自己
If (strData.IndexOf(":") > 0) Then
Dim separators() As Char = {CChar(":")}
Dim vars() As String = strData.Split(separators)

If (vars(0) <> m_szHostName) Then
Console.WriteLine(strData)
End If
End If
End If
End While
Catch
console.WriteLine(Environment.StackTrace)
Exit Sub
End Try
Console.WriteLine("侦听器线程已完成...")
End Sub

End Class
sunruping 2004-03-24
  • 打赏
  • 举报
回复
本人以前一直是做聊天的windows程序。
不知如何在web上做聊天程序
jkflyfox 2004-03-23
  • 打赏
  • 举报
回复
shiningpolarstar(闪亮的北极星) 可以把你的代码发给小弟学习下吗?小弟的同学毕业设计需要这个东西,但是偶搞不定。
whidbey2005 2004-03-20
  • 打赏
  • 举报
回复
本人以前一直是做聊天的windows程序。
不知如何在web上做聊天程序
liyoukebit 2004-03-19
  • 打赏
  • 举报
回复
感谢各位积极参与讨论,我比较关注如何在服务器端管理客户端的socket。
小弟有如下设想:
1)建立用户id和socket对应的类。
2)然后建立一个ArraryList来管理这个类
bitsbird 2004-03-18
  • 打赏
  • 举报
回复
1. socket
2. udp
xj1122 2004-03-18
  • 打赏
  • 举报
回复
udp
happymingnan 2004-03-18
  • 打赏
  • 举报
回复
mark
shiningpolarstar 2004-03-18
  • 打赏
  • 举报
回复
是用应用程序做就用socket了
用Web做的聊天,可以通过数据库,做中介,做出一个来,我已经做了一个Web 的了,呵
感觉还行
速马 2004-03-17
  • 打赏
  • 举报
回复
1.socket
2.udp
3.连上了直接发就是了
关于防火墙的问题,很难,想想QQ,MSN...
xueqs 2004-03-17
  • 打赏
  • 举报
回复
聊天程序,建议使用UDP协议;
定时刷新信息,建议使用XML文件方式
liyoukebit 2004-03-14
  • 打赏
  • 举报
回复
我还是有些不明白:
1 如何在UDP上实现服务器。MSDN上只有实现http服务器和客户端的例子。是否是用http协议来保持服务器和客户端的连接,有udp来传送数据。

2 如何检测客户端是否有连接,是否利用http协议,定时轮询;还是用.net remoting 中的客户端激活方式的生存期管理方式。

3 如何维护服务器和客户端的连接,我们考虑是用一个类的数组来维护,该类中包含一个sokect的实例,还有客户端用户的基本信息。
liqiangjun 2004-03-14
  • 打赏
  • 举报
回复
关注!
stsvr 2004-03-14
  • 打赏
  • 举报
回复
关注!
zergtant 2004-03-14
  • 打赏
  • 举报
回复
同意 xxdneu(xxd)

因为udp的无连接性,会节省不少带宽,但是传输的准确性不能保证,所以聊天用udp如果传文件就用tcp好了
liyoukebit 2004-03-13
  • 打赏
  • 举报
回复
谢谢各位!
能否深入谈一下,最好给些例子。
hertcloud 2004-03-13
  • 打赏
  • 举报
回复
qq用udp的,不存在这个问题
只要有服务器帮助连接一下,之后就OK了
xxdneu 2004-03-13
  • 打赏
  • 举报
回复
1. socket
2. udp
3. 普通文本应该可以通过防火墙的
hertcloud 2004-03-13
  • 打赏
  • 举报
回复
关注!·

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧