您的位置:程序门 -> .net技术 -> vb.net



多线程问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


多线程问题
发表于:2007-06-07 15:24:05 楼主
服务器与客户端的通信(socket)  
不知道为什么,我在用线程接受信息的时候,总是不稳定
例如服务器发了5条信息,
我接受的时候,只接受了2条,第一条正确,第二条包含了剩下4条的信息


服务器发送:
1
2
3
4
5
客户端接收
1
2345
有时候接受正确,大多情况下接收不正确
我的服务器是用for语句循环发送的,结果就像上面举得例子
如果用timer发送(5ms),服务器接收就是正常的!

这是我客户端的接收代码
        '客户端socket
        dim   clisocket   as   socket
        '连接状态
        dim   isconnected   as   boolean   =   false
        '接收信息线程
        dim   mythread   as   thread

        private   sub   form1_load(byval   sender   as   system.object,   byval   e   as   system.eventargs)   handles   mybase.load

                dim   remoteep   as   new   ipendpoint(net.ipaddress.parse( "192.168.123.7 "),   9999)

                clisocket   =   new   socket(addressfamily.internetwork,   sockettype.stream,   protocoltype.tcp)

                try
                        clisocket.connect(remoteep)
                        listbox1.items.add( "连接服务端成功! ")
                        isconnected   =   true

                        mythread   =   new   thread(addressof   recivemsg)
                        mythread.start()
                catch   ex   as   exception
                        listbox1.items.add(ex.message)
                end   try
        end   sub

        sub   recivemsg()
                dim   bytes()   as   byte   =   new   byte(1024)   {}
                dim   data   as   string   =   string.empty
                dim   tokens()   as   string

                while   true
                        dim   bytesrec   as   integer   =   clisocket.receive(bytes)
                        data   =   encoding.utf8.getstring(bytes,   0,   bytesrec)

                        begininvoke(new   eventhandler(addressof   addinfo),   data)       'invoke保证线程安全

                end   while

        end   sub

        '非ui线程调用窗体控件,保证线程安全。与聊天实现无关。
        sub   addinfo(byval   sender   as   system.object,   byval   e   as   system.eventargs)
                listbox1.items.add( "远程信息:   "   +   sender.tostring)

        end   sub
发表于:2007-06-07 15:30:151楼 得分:0
怎么没有写怎么发送的

感觉没有什么问题
发表于:2007-06-07 15:42:142楼 得分:0
发送代码:
      dim   i   as   long
        '服务端的socket
        dim   listener   as   socket
        '与客户端会话的socket
        dim   mysocket   as   socket
        '服务端的运行状态
        dim   isrun   as   boolean   =   false
        '监听接收数据线程
        dim   mythread   as   thread

        private   sub   form1_load(byval   sender   as   system.object,   byval   e   as   system.eventargs)   handles   mybase.load
                mythread   =   new   thread(addressof   listen)
                mythread.start()
        end   sub

        private   sub   btnsend_click(byval   sender   as   system.object,   byval   e   as   system.eventargs)   handles   btnsend.click

                for   i   =   0   to   10
               
                dim   msg   as   byte()   =   encoding.utf8.getbytes( "chat ¦ "   +   textbox1.text   +   i.tostring)

                mysocket.send(msg)

                listbox1.items.add( "本地信息:   "   +   textbox1.text   +   i.tostring)
          next
        end   sub
发表于:2007-06-08 11:20:413楼 得分:0
没有人会么
发表于:2007-06-09 14:08:444楼 得分:0
这是tcp的“粘包”现象,你应该设计一个封包把数据封装起来!
这样就可以解决这个问题了!
发表于:2007-06-09 14:48:405楼 得分:0
在每次发送数据时,在数据最后加上一个结束标记,如 <eof> 等等,以表示标记之前的数据为一次完整的数据,接收方接收之后,再根据结束标记截取正确的数据.


快速检索

最新资讯
热门点击