注册 登录
编程论坛 VB6论坛

如何用socket实现两个list之间的数据传输

candy_3100 发布于 2013-06-07 15:20, 630 次点击
我做的是一个聊天程序,有服务器和客户端。

服务器搜集在线好友信息之后,形成一个好友列表,list1,我用函数传输
for i = 0 to list1.listcount - 1
   winsock1.senddata list1.list(i)
next

客户端用定时时钟实时刷新接收数据,形成好友列表,list1,我用函数接收
dim ff as string
list1.clear
winsock1.getdata ff
list1.additem  ff

问题是,假如我服务器传输的list如下
192.168.0.1
192.168.0.2
客户端接收到的list1如下
192.168.0.1192.168.0.2

客户端没有换行,是我代码的问题吗?求大神讲解。我被这个问题困扰好久了。
2 回复
#2
Artless2013-06-07 17:59
客户端用定时为什么?
#3
风吹过b2013-06-07 18:09
你需要一个数据封包。和数据指令系统。

数据封包是一个结构,如:
type 数据封包结构
  头 as string *1        '例如 $
  指令 as string * 3
  数据体 as string
  尾 as string *1        '例如 & 要求与头不相同
end type
指令,按上面的定义,用三位数据组成的一个字符串。
例如:
const 客户端发OK = "101"
const 服务端发OK ="102"
const 请求用户 ="201"
const 发送用户 ="202"
const 请求广播="301"
const 服务器消息="310"

客户端发包函数
sub putdata(指令 as string*3 ,内容 as string)
'需要增加错误处理,对未联通时等待处理,超时处理。
with winsock1   
     if  .start =7 then
     .senddata  "$"   '头
     .senddata  指令
     .senddata 内容
     .senddata  "&"  '尾
    end if
end with
end sub

接收时
定义一个静态变量 或全局变量 如  s1
dim s as string
dim b as boole             '标识是否处理了有尾的数据
dim fj() as string
winsock1.getdata s
s=s1 & s             '把上次的保留下来的数据放到本次数据前
fj=split(s,"$" )   '头字符
for i= 0 to ubound(fj)
  if len(fj(i))>0 then
     if right(fj(i),1)="&" then    '如果还包含尾
        fj(i)=mid(fj(i),1`,len(fj(i))-1)
     '分解出二部分来
     指令=left(fj(i),3)
     内容=mid(fj(i),4)
     select case 指令
     case 服务端发OK
          '不处理
     case 发送用户
         list1.additem 内容
         putdata 客户端发OK,""
     case 服务器消息
         '显示内容
         putdata 客户端发OK,""
     end select
else
    s1=fj(ubound(fj))        '数据未接收完,没有找到尾,则留到下次处理 。
end if

大体上就是这样的。
服务器端,大体相同,只能对应的指令不同
1