CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  网络编程

[求救]用winsock写出来的客户端,多开的话就会出错,高分求救!!!

楼主keney(keney)2004-08-01 01:57:04 在 VB / 网络编程 提问

客户端用来接收服务器端发过来的文本信息,开一个的时候数据不会出错,但同一台机器上开两个或以上的时候问题就来了,b客户端接收到的数据就会在a客户端上接收显示出来,a客户端的数据也会在b客户端上显示,搞到数据大乱,为什么会这样的呢? 问题点数:100、回复次数:14Top

1 楼daisy8675(莫依 沉迷)回复于 2004-08-01 02:17:43 得分 0

你的通信协议选择的是UDP还是TCPTop

2 楼keney(keney)回复于 2004-08-01 07:30:16 得分 0

tcp的Top

3 楼zyg0(影子(被评为本年度最可爱流氓)回复于 2004-08-01 09:18:28 得分 0

不会阿,我的就没问题Top

4 楼zyg0(影子(被评为本年度最可爱流氓)回复于 2004-08-01 09:19:38 得分 0

关键是服务器的控件数组的index正确就不会发错Top

5 楼qyii(劳心劳力)回复于 2004-08-03 05:06:45 得分 0

呵呵~小问题!!!但无从入手...不知道你现在的情况~贴出你服务器代码里的发送数据部分的源码来Top

6 楼LGYAN(紫衣随想)回复于 2004-08-03 08:47:46 得分 30

估计是你服务器响应请求时乱掉的。  
   
  如果应用程序要使用   TCP   协议,那么首先必须决定应用程序是服务器还是客户端。如果要创建一个服务器端,那么应用程序需要“监听”指定的端口。当客户端提出连接请求时,服务器端能够接受请求并建立连接。在连接建立之后,客户端与服务器端可以自由地互相通讯。  
   
  下列步骤创建一个非常简单的服务器:  
   
  要创建一个   TCP   服务器,请按照以下步骤执行:    
   
  创建新的   Standard   EXE   工程。  
   
   
  将缺省窗体的名称改为   frmServer。  
   
   
  将窗体的标题改为“TCP   服务器”。  
   
   
  在窗体中放入一个   Winsock   控件,并将它的名字改为   tcpServer。  
   
   
  在窗体上添加两个   TextBox   控件。将第一个命名为   txtSendData,第二个为   txtOutput。  
   
   
  为窗体添加如下的代码。    
  Private   Sub   Form_Load()  
  '将   LocalPort   属性设置为一个整数。  
  '然后调用   Listen   方法。  
  tcpServer.LocalPort   =   1001  
  tcpServer.Listen    
  frmClient.Show   '显示客户端的窗体。  
  End   Sub  
   
  Private   Sub   tcpServer_ConnectionRequest   _  
  (ByVal   requestID   As   Long)  
  '检查控件的   State   属性是否为关闭的。  
  '如果不是,  
  '在接受新的连接之前先关闭此连接。  
  If   tcpServer.State   <>   sckClosed   Then   _  
  tcpServer.Close  
  '接受具有   requestID   参数的  
  '连接。  
  tcpServer.Accept   requestID  
  End   Sub  
   
  Private   Sub   txtSendData_Change()  
  '名为   txtSendData   的   TextBox   控件中  
  '包含了要发送的数据。当用户往文本框中  
  '键入数据时,使用   SendData   方法  
  '发送输入的字符串。  
  tcpServer.SendData   txtSendData.Text  
  End   Sub  
   
  Private   Sub   tcpServer_DataArrival   _  
  (ByVal   bytesTotal   As   Long)  
  '为进入的数据声明一个变量。  
  '调用   GetData   方法,并将数据赋予名为   txtOutput    
  '的   TextBox   的   Text   属性。  
  Dim   strData   As   String  
  tcpServer.GetData   strData  
  txtOutput.Text   =   strData  
  End   Sub  
   
  上面的步骤创建了一个简单的服务器应用程序。为了使它能够工作,还必须为它创建一个客户端的应用程序。  
   
  要创建   TCP   客户端,请按照以下步骤执行:    
   
  在工程中添加一个新的窗体,将其命名为   frmClient。  
   
   
  将窗体的标题改为“TCP   Client”。  
   
   
  在窗体中添加一个   Winsock   控件,并将其命名为   tcpClient。  
   
   
  在   frmClient   中添加两个   TextBox   控件。将第一个命名为   txtSend,第二个为   txtOutput。  
   
   
  在窗体上放一个   CommandButton   控件,并将其命名为   cmdConnect。  
   
   
  将   CommandButton   控件的标题改为   Connect。  
   
   
  在窗体中添加如下的代码。    
  重点       必须将   RemoteHost   属性值修改为您的计算机的名字。  
   
  Private   Sub   Form_Load()  
        'Winsock   控件的名字为   tcpClient。  
        '注意:要指定远程主机,可以使用  
        '   IP   地址(例如:"121.111.1.1"),也可以使用  
        '计算机的“好听的名字”如下所示。  
        tcpClient.RemoteHost   =   "RemoteComputerName"  
        tcpClient.RemotePort   =   1001  
  End   Sub  
   
  Private   Sub   cmdConnect_Click()  
        '调用   Connect   方法,初始化连接。  
        tcpClient.Connect  
  End   Sub  
   
  Private   Sub   txtSendData_Change()  
        tcpClient.SendData   txtSend.Text  
  End   Sub  
   
  Private   Sub   tcpClient_DataArrival   _  
  (ByVal   bytesTotal   As   Long)  
        Dim   strData   As   String  
        tcpClient.GetData   strData  
        txtOutput.Text   =   strData  
  End   Sub  
   
  上面的代码创建了一个简单的客户/服务器模式的应用程序。我们可以将两者都运行起来:运行工程,然后单击“连接”。在两个窗体之一的   txtSendData   文本框中键入文本,可以看到同样的文字将出现在另一个窗体的   txtOutput   文本框中。  
   
  接受多个连接请求  
  上面设计的基本服务器只能接受一个连接请求。通过创建控件数组,使用一个控件也可以同时接受多个连接请求。利用这种方法,不需要关闭连接,而只需创建新的控件实例(通过设置其索引属性),然后在新的实例上调用   Accept   方法。  
   
  下面的代码假定名为   sckServer   的窗体上有一个   Winsock   控件,它的   Index   属性被设置为   0;因此控件是控件数组的一部分。在声明部分,声明了一个模块级的变量   intMax。在窗体的   Load   事件中,intMax   被设置为   0,数组中第一个控件的   LocalPort   属性被设置为   1001。然后调用控件的   Listen   方法,使之成为“监听”控件。在连接请求到达时,代码将检测   Index   是否为   0(“监听”控件的值)。如果为   0,监听控件将增加   intMax   的值,并使用该号码来创建新的控件实例。然后,使用新的控件实例接受连接请求。  
   
  Private   intMax   As   Long  
   
  Private   Sub   Form_Load()  
        intMax   =   0  
        sckServer(0).LocalPort   =   1001  
        sckServer(0).Listen  
  End   Sub  
   
  Private   Sub   sckServer_ConnectionRequest   _  
  (Index   As   Integer,   ByVal   requestID   As   Long)  
        If   Index   =   0   Then  
              intMax   =   intMax   +   1  
              Load   sckServer(intMax)  
              sckServer(intMax).LocalPort   =   0  
              sckServer(intMax).Accept   requestID  
              Load   txtData(intMax)  
        End   If  
  End   Sub  
   
  Top

7 楼iambluebird(胡搅蛮缠)回复于 2004-08-03 09:16:53 得分 0

我也发觉有这个问题,当CLIENT少的时候不会出错,一旦CLIENT多了后,数据就会出现发错的情况Top

8 楼happytoy()回复于 2004-08-03 13:19:58 得分 30

可以用一个数组把,INDEX存储起来,当发送时,从数组里读取,发送完之后数组清0,我做的程序就是这样做的  
  Top

9 楼danielinbiti(金)回复于 2004-08-10 12:24:31 得分 0

应该是没有正确对应index问题。  
  起码我写过的都没出现过这种问题Top

10 楼900126(息夫人)回复于 2004-08-10 13:58:15 得分 30

检查补丁是否完整,每一次的补丁都影响WINSOCK。否则TCP是绝对不会出现这个毛病。  
  还有,就是你的程序编写有问题,错在程序中。WINSOCK最重要的是对象编程,许多人都不习惯事件变成,用循环等待的方式,就容易出这个毛病。  
  还有,就是DOEVENTS,胡乱使用DOEVENTS最容易出这种毛病。按说,在正常情况下,TCP是绝对不会出现这种毛病的。UDP(旧版本)到有可能。  
  Top

11 楼of123()回复于 2004-08-10 14:05:08 得分 10

服务端侦听到客户请求后要查出对应的   Index,然后选择对应的端口发送消息。  
  可能你的服务端是根据机器名查   Index   的。这样就会出现你所说的问题。Top

12 楼to017(017)回复于 2004-08-11 21:52:28 得分 0

通过对客户的IP判断如果重复就不让它连了。  
  这样在一台机子就只能运行一个客户端就了。Top

13 楼unknow_123(不懂)回复于 2004-08-14 19:54:43 得分 0

同意   900126(息夫人)   的意见,我也做这个的,好像从来都没有这个问题Top

14 楼keney(keney)回复于 2004-08-18 00:10:11 得分 0

问题找到了,已经解决,给分了Top

相关问题

  • MIDAS客户端运行出错。
  • 当winsock通信出错时
  • 用winsock api编一个简单的TCP客户端程序,和一个LISTEN的服务器端连接,为什么会出错????
  • winsock调试出错!!帮忙啊!!!!
  • 使用winsock控件时出错
  • 使用SocketConnection1连接,客户端运行出错?
  • 客户端调用服务器端的存储过程出错
  • 救命啊,程序经常出错,客户都火了。
  • 运行一个SERVER数据库的客户端程序出错
  • 服务器用stNonBlocking,客户机ctNonBlocking出错??

关键词

  • 控件
  • 服务器
  • 客户
  • 连接
  • 属性
  • 应用程序
  • winsock
  • 数据
  • 监听
  • 代码

得分解答快速导航

  • 帖主:keney
  • LGYAN
  • happytoy
  • 900126
  • of123

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo