聊天室?(200分)

  • 主题发起人 主题发起人 laolor
  • 开始时间 开始时间
L

laolor

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大侠:
小弟相请教一个问题。怎样在局域网做一个icq那样的聊天室?
为了能向icq那样,就不能有服务器,或说固定服务器。
我看了delphi4的msg(demo)和chat(demo),值得参考的实在不多。
我看发送消息还是该用msg那种方式——用虚拟链路。
问题在于,初始建了聊天室的机器就该作为本次连接的服务器了,
他怎样标志出这个聊天室的存在以及他自己作为服务器这一事实?
也就是说,另一部机器登陆该聊天室时,怎样实质上的找到服务器的ip?
 
可以让每个客户端隔一定时间向某个IP段的一个特定端口发送一个query,
返回信息为聊天室的名称之类的信息。
对于局域网来讲,每台机器都可以指定一个固定IP,这样就更简单

 
icq是有固定的服务器的,(这个服务器不同与你说的聊天室服务器)
当有人建立聊天室的时候(即你所说的服务器),
ICQ服务器会在聊天室列表中加入相应的数据项。其中包括聊天室的IP。
 
即客户间通讯的建立是依赖于ICQ服务器
一旦建立通讯,客户间的通讯就与ICQ服务器无关了
 
>就不能有服务器,或说固定服务器
这一句有问题,应该是:就要有服务器,或说固定服务器 才对

一台固定的服务器,所有聊天的群众都是连到服务器的,聊天的群众之间是不连接的
某个人说话只是说给服务器听,服务器听到后负责告诉其他群众
 
是不能有固定服务器的,就说所有用户都只是用同一个程序,地位相等。
谁都可以建聊天室。不过我现在才发现,icq的聊天室并不可以看到聊天室列表,
应该容易很多。
 
icq开始是向服务器注册,并取得服务端口号,很多个,以及在线人信息,端口号等,与某
人联系,就是通过服务器协商服务端口的过程,服务端口确定后用户间就可以直接通讯.
好象用UDP通讯,处理逻辑不复杂,但大用户量的稳定性很重要.
 
客户和服务器都用两个Socket,一个用UDP通讯,另一个用TCP通讯
当建立一个聊天服务端时,UDP socket开始listen,
当客户端搜索聊天服务器时,客户端发UDP广播消息,
其中包括客户端的IP地址等信息,
服务端UDP Socket接收到后,根据包中的IP将自己的IP地址及聊天室名称
等用UDP发送到客户端,客户端就可以通过TCP连接了
 
danceofwind:
很好。谢谢
不过,我还是不懂,UDP怎样发广播消息?
可不可以给点例程?
 
建议你用ics winsock控件包,
网址是http://www.rtfm.be/fpiette/indexuk.htm
有不少例子.

用ICS的TWsocket控件,只要将协议设为"UDP",Ip设为
'255.255.255.255',就可以广播了
 
laolor:

WinSock是windows系统提供的一种网络文件传输协议。Visual Basic 5.0 提供WinSock control简化我们的设计流程。它可以利用User Datagram Protocol(UDP)或Transmission Control Protocol (TCP),来设计网络的Client-Server 程序。
  TCP是一种Connection base的Protocol,在文件传输时会先行建立Link,通过Link 可确保文件传输的正确性;UDP则是一种Connectionless的Protocol,它在传输文件时不会确保传输端的文件能够正确无误的传送到接收端,所以当我们使用UDP protocol时,我们通常要自己作接收确认的工作。UDP protocol看起来好像比较没效率,其实不然!UDP protocol有一个好处:当文件很小,或我们要做网络boardcast (广播)时,会比较有效率。所以了! 当我们利用WinSock设计程序时,首先要依自己的需要,决定使用那一种protocol。本文将分别教您使用TCP及UDP Protocol来设计Chat程序。

Step 1???Domain name?IP address
  在“我的电脑”中选择“控制面板”。Double click“网络”选项,选择“标识”
,您将会发觉您的计算机名称、工作组名等信息。将它记录起来,我们稍后会用到。

Step 2???TCP Server??
  在File选项中选New Project建立一个新的工程,在屏幕上会看到许多选项,如ActiveX Document.EXE、ActiveX Document.DLL、ActiveX.EXE、ActiveXControl等,选Standard.EXE。
  接着在Project下选择Property属性选项,在General选项下将ProjectName改为TCP-Server,并将Form名称及Caption更改为Server。在屏幕的Form上加入一个WinSock control,取名为Tcps;加入两个TextBox control(Outtext、Intext),并在两个TextBox前加入两个label,分别将caption改为Outtext、Intext。

〈TextBox〉

Name

Outtext(????)

Intext(????)

〈Label〉

Caption

----------------------------------------------------

Outtext(????)

Intext(????)

  在Form_Load()中加入以下程序代码,这个动作是设置好我们Local的传输端口,并 到接收的状态:

Tcps.protocol=0-scktcp protocol

Tcps.LocalPort = 1002

Tcps.Listen

  双击Tcps,在Tcps_ConnectionRequest(ByVal requestID As Long)中加入以下程 序代码,这表示winsock接受了连接请求:


Tcps.Accept requestID

  双击Outtext到Outtext_change(),加入以下程序代码,当Outtext内容改变后,文件就会自动送出:


Tcps.SendData Outtext.text

在Tcps_DataArrival(ByVal bytesTotal As Long)中加入以下程序代码,这是用来把所接收的文件显示在Intext这个TextBox中。

Dim S As StrIng

Tcps.GetData S

InText.Text = S

这样我们就完成了Server端的设计。

Step 3???TCP Client??

在File选项中选择New Project建立一个新的工程,在屏幕上看到许多选项,如ActiveX Document.EXE、ActiveX Document.DLL、ActiveX.EXE、ActiveX Control等。选Standard.EXE。接着在Project下,选择Property属性选项,在General选项下,将Project Name改为TCP-Client,并将FORM名称及Caption更改为Client。

  在屏幕的Form上加入一个WinSock control,取名为Tcpc,将protocol property设置成 0-scktcp protocol,加入两个TextBox control(Outtext、Intext),并在两个TextBox前加入两个Label,分别将其Caption改为Outtext、Intext。接着放入一个Button(button1)并将Caption 改为Connect。

(TextBox)

Name

-----------------------------------------------------

Outtext(????)

Intext(????)

(Label)

Caption

--------------------------------------------------------

Outtext(????)

Intext(????)

〈Button〉

Name Caption

--------------------------------------------------------

  Button1(执行建立session命令) Connect 在Form_Load()中加入以下程序代码,这个动作是设置好我们Remote所要连接的传输端口及其网络名称。我们要连接的计算机网络名称为DAVID:

Tcpc.RemoteHost ="David"

Tcpc.RemotePort=1002

  双击Outtext到Outtext_change()加入以下程序代码,当Outtext内容改变后,文件
会自动送出:

Tcpc.SendData Outtext.text

在Tcpc_DataArrival(ByVal bytesTotal As Long)中加入以下程序代码,这是用来把所接收的文件显示在Intext这个TextBox 中。

Dim S As StrIng

Tcpc.GetData S

InText.Text = S

这样就完成了Client端的设计。

Step 4???TCP Chat??

  分别执行Server及Client程序,这时在Client的屏幕上显示In及Out TextBox及一个 Connect Button;在Server屏幕上显示In及Out TextBox。

我们按Client程序Connect
  button建立连接,连接建立成功后,我们可尝试在
Client?Outbox ?????????Hello nice to meet you?????Server??Inbox??????? ?????Server?Outbox?????????Nice to meet you, too? ????Client??Inbox??????????????????

用UDP设计Chat程序

Step 1??????UDP(UDP1)??

  在File选项中选择New Project建立一个新的工程,屏幕上会看到许多选项,如ActiveX Document.EXE、ActiveX Document.DLL、ActiveX.EXE、ActiveX Control等,这时选Standard.EXE。接着在Project下选择Property属性选项,在General选项下将Project Name改为UDP1,将protocol property设置成0-udptcp protocol, 并将Form名称及Caption更改为UDP1。

  在屏幕的Form上加入一个WinSock control,取名为UDP1;加入两个TextBox control ( Outtext、Intext),并于两个TextBox前加入两个Label control,分别将Caption改为 Outtext、 Intext。

(TextBox)

Name


-----------------------------------------------------

Outtext(????)

Intext(????)

(Label)

Caption

-------------------------------------------------------

Outtext(????)

Intext(????)

  在Form_Load()中加入以下程序代码,这个动作是设置好我们要连接的远端输入端口
为 1001,并将输入端口设为1002。

UDP1.RemoteHost = "DAVID"

UDP1.RemotePort = 1001

UDP1.BInd 1002

  双击Outtext到Outtext_change(),加入以下程序代码,当Outtext内容改变,文件
会自动送出:

UDP1.SendData Outtext.text

在UDP1_DataArrival(ByVal bytesTotal As Long)中加入以下程序代码,这是用来把所接收的文件显示在Intext这个TextBox 中。

Dim S As String

UDP1.GetData S

InText.Text = S

这样我们就完成了UDP1的设计。

Step 2??????UDP(UDP2)??

  在File选项中选New Project建立一个新的工程,屏幕上会看到许多选项,如ActiveX Document.EXE、 ActiveX Document.DLL、ActiveX.EXE、ActiveX Control等,这时要选Standard.EXE。接着在Project下,选择Property属性选项,在General选项下,将Project Name改为UDP2,将protocol property设置成0-udptcp protocol,并将Form名称及Caption更改为UDP2 。

在屏幕的Form上加入一个WinSock control取名为UDP2 ,加入两个TextBox control ( Outtext、Intext),并在两个TextBox control前加入两个Label control,分别将Caption改为Outtext、Intext。

(TextBox)

Name

-----------------------------------------------------

Outtext(????)

Intext(????)

(Label)

Caption

--------------------------------------------------------

Outtext(????)

Intext(????)

  在Form_Load()中加入以下程序代码,这个动作是设置好我们要连接的远端输入端 口,设置为1002,并将输入端口设置为1001。

UDP2.RemoteHost = "MARY"
UDP2.RemotePort = 1002

UDP2.Bind 1001

  双击Outtext到Outtext_change()加入以下程序代码,当Outtext内容改变,文件就 会自动送出:

UDP2.SendData Outtext.text

  在UDP2_DataArrival(ByVal bytesTotal As Long)中加入以下程序代码,这是用来 把所接收的文件显示在Intext这个TextBox 中。

Dim S As StrIng

UDP2.GetData S

InText.Text = S

  这样我们就完成了UDP2的设计。

Step 3???UDP Chat??

  分别执行UDP1及UDP2程序。这时UDP1的屏幕上显示In及Out TextBox;UDP2屏幕也显示In及Out两个TextBox。我们在UDP1的Outbox中输入一些字符串 I want talk to Mary,我们将在UDP2端的Inbox看到这些字符串。接着我们在UDP2的Outbox也输入一些字符串This is Mary speaking!,我们将在UDP1端的Inbox看到这些字串。结果证明我们成功了!

triton
http://triton.home.chinaren.net
 
像oicq一样,那肯定的要服务器端软件了,可惜我还没找到,要不然,放到局域网上,
也非常合适,非常不错的!建议你去找一找,然后顺便告诉我!

聊天室很好作嘛,到我哪儿下一个就行了,<a href="http://fush2000.yeah.net/">fush乐园</a>。
我是用asp写的,你可以做基于http方式的聊天室嘛,既方便又实用,但像你说说的
不要服务端的可以推荐你用epop,那可是个好东东,前身是winpop,具有黑客能力,
在我站上也有下载!
 
triton说得不错。futao就不明白了,epop我用过。国人如果也能做出这样的东西就
好了。
epop功能特强,我想知道,用delphi能有什么简单点的办法,可以做到在聊天的时
候,可以看见对方一个个字打出来的过程?(比如窗口有一个memo做显示聊天内容
用,一个edit做发送用。我开始打字时,所有聊天时成员的memo就会显示"gun:>",
然后我每打一个字,所有人都能动态看得见?
 
triton说的那种方法,(指定协议)好像在delphi里面不行哦,怎么办?
那位大虾知道怎样在delphi中指定协议的?
我听说powersock控件可以用来自己定义一个网络协议,那位大虾知道怎么搞啊?
 
怎么好像都没兴趣了?nmmsg怎样发送附件呢?怎么老是说连接不上?
 
多人接受答案了。
 
后退
顶部