我现在利用socket作为客户端来访问服务端(串口服务器),我需要通过用SOCKET连接上一个串口后,给远端的控制单元发送控制命令,然后接收控制单元返回的数据,控制指令是特定格式的:
测试通信是否成功 BBH 0 0 44H 正确通信返回数据:80H  现在需要把这个返回的数据显示在文本框内供用户查看。  
               紧急    紧急    解决后立即高分相送

解决方案 »

  1.   

    你是用异步还是同步连接的呢?
    1.在类中定义事件 
      Public Event TexthasChanged(ByVal msg As String)2.收到消息触发事件   Private Sub ReceiveCallBack(ByVal ar As IAsyncResult)
            Try
                Dim client As Socket = CType(ar.AsyncState, Socket)
                Dim bytesRead As Integer = client.EndReceive(ar)
                If bytesRead > 0 Then
                    Dim strB As StringBuilder = New StringBuilder
                    strB.Append(Encoding.BigEndianUnicode.GetString(buffer, 0, bytesRead))
                    Dim content As String = strB.ToString()
                    strB.Remove(0, content.Length)
                    '收到消息触发事件
                    RaiseEvent NewMessage(content)
                    
                    RaiseEvent TexthasChanged(content)                client.BeginReceive(buffer, 0, BufferSize, 0, New AsyncCallback(AddressOf ReceiveCallBack), client)            End If        Catch ex As Exception
                RaiseEvent TexthasChanged(ex.Message)
            End Try    End Sub
    3.显示消息
      Public Sub GetMsg(ByVal msg As String) Handles clsClient.TexthasChanged
      end sub
      

  2.   

    VB.net
    1.client
    Imports System.Net.Sockets
    Imports System.IO
    Imports System.Net
    Imports System.Threading
    Imports System
    Imports System.Collections
    Imports System.Text
    Public Class CClient
        ' Incoming data from the client    Public data As String = Nothing
        ' Thread signal.
        Public msgBuff() As Byte = New [Byte](1024) {}
        Public msgRecS, msgSendS, msgRecC, msgSendC As String
        Public ConnDone As New ManualResetEvent(False)
        Public SendDone As New ManualResetEvent(False)
        Private buffer(BufferSize) As Byte
        Private Const BufferSize As Integer = 256
        Public ClientSock As Socket    Public Event TexthasChanged(ByVal msg As String)    Public Event NewMessage(ByVal msg As String)    Public Sub SendCallBack(ByVal ar As IAsyncResult)
            Try
                Dim client As Socket = CType(ar.AsyncState, Socket)
                SendDone.Set()
            Catch e As Exception
                Throw New Exception(e.Message)
            End Try
        End Sub    Public Sub send(ByVal msg As String, ByVal clientSock As Socket)
            Dim strSend As String
            Dim byteSend() As Byte
            Try
                'strSend = "Client--->" + frmMain.rtxtSend.Text & Chr(13) & Chr(10)
                'here Apid
                'strSend = PstrApp & "-AgentAlive" & Chr(13) & Chr(10)
                byteSend = Encoding.BigEndianUnicode.GetBytes(msg)
                clientSock.BeginSend(byteSend, 0, byteSend.Length, 0, New AsyncCallback(AddressOf SendCallBack), clientSock)
            Catch ex As Exception
                Throw New Exception(ex.Message)
            End Try    End Sub
        Public Sub ConnectCallBack(ByVal ar As IAsyncResult)
            Dim sock As Socket = CType(ar.AsyncState, Socket)
            Dim byteData() As Byte        Try
                sock.EndConnect(ar)
                If sock.Connected Then
                    Try
                        'APID
                        byteData = Encoding.BigEndianUnicode.GetBytes(PstrApp & "-AgentAlive")
                        ClientSock.BeginSend(byteData, 0, byteData.Length, 0, New AsyncCallback(AddressOf SendCallBack), sock)
                    Catch ex As Exception                End Try                'frmMain.stuClient.Text = "connect successfully"
                    'RaiseEvent TexthasChanged("connect successfully" & Chr(13) & Chr(10))                ClientSock.BeginReceive(buffer, 0, BufferSize, 0, New AsyncCallback(AddressOf ReceiveCallBack), ClientSock)
                Else
                    Throw New Exception("Can not connect Agent")
                End If
            Catch ex As SocketException
                If ex.ErrorCode = 10061 Then
                    'Throw New Exception("Agent isn't start")
                    'frmMain.stuClient.Text = "Server isn't start"
                    RaiseEvent TexthasChanged("Agent isn't start")
                End If
            Catch ex As Exception
                RaiseEvent TexthasChanged(ex.Message)
            End Try
        End Sub    Private Sub ReceiveCallBack(ByVal ar As IAsyncResult)
            Try
                Dim client As Socket = CType(ar.AsyncState, Socket)
                Dim bytesRead As Integer = client.EndReceive(ar)
                If bytesRead > 0 Then
                    Dim strB As StringBuilder = New StringBuilder
                    strB.Append(Encoding.BigEndianUnicode.GetString(buffer, 0, bytesRead))
                    Dim content As String = strB.ToString()
                    strB.Remove(0, content.Length)                RaiseEvent NewMessage(content)
                    'frmMain.rtxtRec.AppendText(content & Chr(13) & Chr(10))
                    RaiseEvent TexthasChanged(content)                client.BeginReceive(buffer, 0, BufferSize, 0, New AsyncCallback(AddressOf ReceiveCallBack), client)            End If        Catch ex As Exception
                RaiseEvent TexthasChanged(ex.Message)
            End Try    End Sub    Public Sub Connect()
            Try
                'Dim clientSock As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
                Dim epServer As IPEndPoint = New IPEndPoint(IPAddress.Parse("127.0.0.1"), 3333)
                'Connect to server non-Blocking method
                ClientSock = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
                ClientSock.Blocking = False
                ClientSock.BeginConnect(epServer, New AsyncCallback(AddressOf ConnectCallBack), ClientSock)        Catch ex As Exception
                Throw New Exception(ex.Message)
            End Try
        End Sub    Public Sub StopConn()
            Try
                ClientSock.Shutdown(SocketShutdown.Both)
                ClientSock.Close()
            Catch ex As Exception
                Throw New Exception(ex.Message)
            End Try
        End Sub
    End Class
      

  3.   

    2.server -----
    Imports System.Net.Sockets
    Imports System.IO
    Imports System.Net
    Imports System.Threading
    Imports System
    Imports System.Collections
    Imports System.TextPublic Class CServer
        ' Incoming data from the client
        Public data As String = Nothing
        ' Thread signal.
        Public allDone As New ManualResetEvent(False)
        Public msgBuff() As Byte = New [Byte](1024) {}
        Public msgRecS, msgSendS, msgRecC, msgSendC As String
        'Public handler As Socket    'handler for new connection 
        Public listener As Socket
        Public mySocket As Socket
        Private buffer(BufferSize) As Byte
        Private Const BufferSize As Integer = 256    Public htSockets As Hashtable = New Hashtable(iArr)
        Public arrSockets As ArrayList = New ArrayList(iArr)
        Public arrPorts As ArrayList = New ArrayList(iArr)
        Private Const iArr As Integer = 200
        Private Const iTimeOut As Integer = 30
        Public Event ServerMessage(ByVal msg As String)
        Public Event NewMessage(ByVal msg As String)    Public Delegate Sub testDele()
        Public Sub StartListening()
            ' Data buffer for incoming data.
            Dim bytes() As Byte = New [Byte](1024) {}
            Try
                listener = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
                'listener.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 2000)
                listener.Bind(New IPEndPoint(IPAddress.Loopback, 3333))
                listener.Listen(50)
                listener.BeginAccept(New AsyncCallback(AddressOf AcceptCallback), listener)            RaiseEvent ServerMessage("Agent service is start...")
                'frmMain.stuServer.Text = "Server is listening..."
            Catch ex As Exception
                RaiseEvent NewMessage(ex.Message)
            End Try
        End Sub 'StartListening
        Public Sub AcceptCallback(ByVal ar As IAsyncResult)
            ' Signal the main thread to continue.
            ' Get the socket that handles the client request.
            Dim handler As Socket
            Dim byteData() As Byte
            Dim ipe As IPEndPoint
            Dim strKey As String
            Try
                mySocket = CType(ar.AsyncState, Socket)
                handler = mySocket.EndAccept(ar)
                ipe = CType(handler.RemoteEndPoint, IPEndPoint)
                strKey = ipe.Port.ToString
                If handler.Connected = True Then
                    arrSockets.Add(handler)
                    arrPorts.Add(strKey)
                    htSockets.Add(strKey, handler)
                End If            'frmMain.lstUser.Items.Add(strKey)
                'byteData = Encoding.BigEndianUnicode.GetBytes("Agent is ready,can talk" & Chr(13) & Chr(10))
                'handler.BeginSend(byteData, 0, byteData.Length, 0, New AsyncCallback(AddressOf SendCallback), handler)            handler.BeginReceive(buffer, 0, BufferSize, 0, New AsyncCallback(AddressOf ReadCallback), handler)
                'do another connection
                mySocket.BeginAccept(New AsyncCallback(AddressOf AcceptCallback), mySocket)
            Catch ex As Exception
                RaiseEvent NewMessage(ex.Message)
            End Try    End Sub 'AcceptCallback
        Public Sub DetectConn()
            Dim i As Integer
            Dim handler As Socket
            Dim ipe As IPEndPoint
            Dim bytes() As Byte = {2, 0, 0, 0}
            For i = 0 To arrSockets.Count - 1
                Try
                    handler = arrSockets(i)
                    ipe = CType(handler.RemoteEndPoint, IPEndPoint)
                    If handler.Connected = False Then
                        Throw New Exception("Connection to client closed")
                    End If
                    If handler.Send(bytes) <> 4 Then
                        Throw New Exception("Failed to ping client socket")
                    End If                If handler.Available > 0 Then
                        arrSockets.RemoveAt(i)
                        arrPorts.RemoveAt(i)
                        htSockets.Remove(ipe.Port.ToString())
                    End If
                Catch ex As Exception
                    Try
                        If i >= 0 And Not IsNothing(handler) Then
                            arrSockets.RemoveAt(i)
                            arrPorts.RemoveAt(i)
                            htSockets.Remove(ipe.Port.ToString())
                        End If
                    Catch exp As Exception                End Try
                    Try
                        If handler.Connected Then
                            handler.Shutdown(SocketShutdown.Both)
                            handler.Close()
                        End If
                    Catch e As Exception                End Try            End Try
            Next
        End Sub
      

  4.   

    采用异步:
     public byte []buffer=null;
    public static ManualResetEvent socketevent=new ManualResetEvent(false);
    private Socket slistener=null;
    private Socket handler=null;
    private string box=string.Empty;
    private  Thread myt1=null;
    -------------------------------------
    //get ip address
    IPHostEntry iphost=Dns.Resolve(System.Environment.MachineName);
     string ip=iphost.AddressList[0].ToString();

    IPEndPoint localend=new IPEndPoint(IPAddress.Parse(ip),10000); //create socket
    slistener=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
                    
    //bind socket
    slistener.Bind(localend);

    //start listening
    slistener.Listen(10); try
    {

    while(true)
    {
     buffer=new byte[1024];
    slistener.BeginAccept(new AsyncCallback(Acceptcallback),slistener);
        socketevent.WaitOne();
    Application.DoEvents();
    if( handler!=null)
    {
    if(handler.Connected)
    {

    handler.Shutdown(SocketShutdown.Both);
    handler.Close();

    }
    }

    socketevent.Reset();

    }
    }
    catch(SocketException my)
    {
    MessageBox.Show(my.Message.ToString(),"error1(server)",System.Windows.Forms.MessageBoxButtons.OK,System.Windows.Forms.MessageBoxIcon.Hand); }
    public void Acceptcallback(IAsyncResult ar)
    {             Socket q=null;
     
    try
    {

     q=(Socket)ar.AsyncState;
     Application.DoEvents();
    if(q!=null)
    { //create new socket
    handler=q.EndAccept(ar);

    Thread.Sleep(100);
    if (handler!=null)
    {
    if(handler.Connected)
    {
    handler.BeginReceive(buffer,0,buffer.Length,0,new AsyncCallback(ReceiveCallback),handler);
    }
    else
    {
    socketevent.Set();
    }
    }
    else
    {
    socketevent.Set();
    }
    }
    else
    {
                  socketevent.Set();
    }


    }
    catch(Exception y)
    {
                      MessageBox.Show(y.Message.ToString(),"Acceptcallback(server)");
        handler=null;
    socketevent.Set();
    return;
    }


              
    } public void ReceiveCallback(IAsyncResult ar)
    {

    handler=(Socket)ar.AsyncState;

    int bytesread=handler.EndReceive(ar);
    //if there is some data...
    try
    {
    if(bytesread>0)
    {
    //append it to the main string
    box=System.Text.Encoding.Default.GetString(buffer,0,buffer.Length);
    box=box.Trim();

    //see the file is over
    if(box.IndexOf("<the end>")>0)
    {
    string []a=box.Split('&');
    string b=a[1].Replace("<the end>",""); //委托更新UI线程
    this.richTextBox1.Invoke(new UPDATE_richtext(this.update_richtext),new object[]{a[0],b});

    this.richTextBox1.Invoke(new CHANG_color(this.chang_color),new object[]{this.richTextBox1.Text});
                          
    byte []bytedata=System.Text.Encoding.Default.GetBytes("文件已接受结束");
    //send the data
    handler.BeginSend(bytedata,0,bytedata.Length,0,new AsyncCallback(this.sendcallback),handler);
    }
    else
    {

    handler.BeginReceive(buffer,0,buffer.Length,0,new AsyncCallback(ReceiveCallback),handler);
    }
    }
    }
    catch(Exception my)
    {
    if(my.Message.ToString().IndexOf("An existing connection was forcibly closed by the remote host")>-1)
    {
    slistener.BeginAccept(new AsyncCallback(Acceptcallback),slistener);
    }
    else
    {
    MessageBox.Show(my.Message.ToString(),"ReceiveCallback(server)",System.Windows.Forms.MessageBoxButtons.OK,System.Windows.Forms.MessageBoxIcon.Hand);
    } }

    } public void sendcallback(IAsyncResult ar)
    {
    try
    {
    Socket q=(Socket)ar.AsyncState; //send data back to client
    int bytesent=q.EndSend(ar);
     
    socketevent.Set();
    buffer=null;
    }
    catch(Exception y)
    {
    MessageBox.Show(y.Message.ToString(),"sendcallback(server)");
    }

    }
      

  5.   

    客户端:
    public byte []buffer=new byte[1024];//存放回发信息
    public string box=string.Empty;//存放回发信息 public static ManualResetEvent socketdone=new ManualResetEvent(false);

    private string data=String .Empty; public  Socket sclient=null;
    public  IPEndPoint endpoint=null;
    public  IPAddress ipadd=null;----------------
    data="要发送的内容"; string a=k+data+"<the end>";
    byte []bytedata=System.Text.Encoding.Default.GetBytes(a);
    sclient=new Socket(AddressFamily.InterNetwork,SocketType.Stream,System.Net.Sockets.ProtocolType.Tcp); sclient.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReceiveTimeout,3000);

    if(!sclient.Connected)

    socketdone.Reset();
    Thread.Sleep(100);

    sclient.BeginConnect(endpoint,new AsyncCallback(this.connectcallback),sclient);

    socketdone.WaitOne();//阻塞线程

    }

    //send data

    sclient.BeginSend(bytedata,0,bytedata.Length,0,new AsyncCallback(this.sendcallback),sclient);
        socketdone.Reset();
    socketdone.WaitOne();//阻塞线程

    //receive

    sclient.BeginReceive(buffer,0,buffer.Length,0,new AsyncCallback(this.receivecallback),sclient);
     socketdone.Reset();
    socketdone.WaitOne();//阻塞线程

    if(sclient.Connected)
    {
    sclient.Shutdown(SocketShutdown.Both);
    sclient.Close();
    }
    Application.DoEvents();
    sclient=null;
    this.button1.Enabled=true;             
    }
    public void connectcallback(IAsyncResult ar)
    {
    Socket sclient=(Socket)ar.AsyncState;
    sclient.EndConnect(ar);
    socketdone.Set();

    } public void sendcallback(IAsyncResult ar)
    {

    Socket sclient=(Socket)ar.AsyncState;
    int bytesend=sclient.EndSend(ar);

    socketdone.Set();
    }

    public void receivecallback(IAsyncResult ar)
    {
    Socket s=(Socket)ar.AsyncState;
             Application.DoEvents();
    s.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReceiveTimeout,3000);
    int bytereceive=s.EndReceive(ar); if(bytereceive>0)
    {   
    box+=System.Text.Encoding.Default.GetString(buffer,0,bytereceive);
    box=string.Empty;

    }

    socketdone.Set();


    }

      

  6.   

    ---
    补完接上面
       Public Sub ReadCallback(ByVal ar As IAsyncResult)
            Dim bytesRead As Integer
            Dim strB As StringBuilder
            Dim content As String
            Dim errMessage As String
            Dim handler As Socket
            Dim tSocket As Socket
            Dim ipe As IPEndPoint
            Dim strKey As String
            Dim bytedata() As Byte
            Try
                tSocket = CType(ar.AsyncState, Socket)
                ipe = CType(tSocket.RemoteEndPoint, IPEndPoint)
                strKey = ipe.Port.ToString
                handler = htSockets(strKey)
                'DetectConn()
                bytesRead = handler.EndReceive(ar) '结束挂起的异步读取,返回接收到的字节数
                If bytesRead > 0 Then
                    strB = New StringBuilder  '接收数据的可变字符字符串,在通过追加、移除、替换或插入字符而创建它后可以对它进行修改。                strB.Append(Encoding.BigEndianUnicode.GetString(buffer, 0, bytesRead)) '追加字符串
                    content = strB.ToString() '转换为字符串
                    strB.Remove(0, content.Length)  '清除strb内容                'reply to client when "Alive"
                    If InStr(content, "AgentAlive") <> 0 Then
                        Dim j As Integer
                        j = InStr(content, "-")
                        bytedata = Encoding.BigEndianUnicode.GetBytes(Left(content, j) & "AgentYes")
                        'handler.BeginSend(byteData, 0, byteData.Length, 0, New AsyncCallback(AddressOf SendCallback), handler)
                        handler.Send(bytedata)
                    End If                If InStr(content, "Connection:") <> 0 Then
                        'content = content.Substring(11)
                        'frmMain.lstUser.Items.Add(content)
                        RaiseEvent NewMessage(content)
                    Else
                        RaiseEvent NewMessage(content)
                    End If                handler.BeginReceive(buffer, 0, BufferSize, 0, New AsyncCallback(AddressOf ReadCallback), handler)
                Else
                    listener.BeginAccept(New AsyncCallback(AddressOf AcceptCallback), listener)
                End If        Catch ex As SocketException
                'When disconnec from clien, here will be a SocketException
                errMessage = ex.Message
                RaiseEvent NewMessage(ex.Message)
                'frmMain.stuServer.Text = errMessage
                If ex.ErrorCode = 10054 Then
                    listener.BeginAccept(New AsyncCallback(AddressOf AcceptCallback), listener)
                End If
            Catch ex As Exception
                errMessage = ex.Message
                RaiseEvent NewMessage(ex.Message)
                'frmMain.stuServer.Text = errMessage
            End Try    End Sub 'ReadCallback    Public Sub Send(ByVal data As String, ByVal ports As String)
            Dim strSend As String
            Dim byteSend() As Byte
            Dim handler As Socket
            Try
                handler = htSockets(ports)
                'strSend = "Server--->" + frmMain.rTxtSend.Text & Chr(13) & Chr(10)
                strSend = data
                byteSend = Encoding.BigEndianUnicode.GetBytes(strSend)
                handler.BeginSend(byteSend, 0, byteSend.Length, 0, New AsyncCallback(AddressOf SendCallback), handler)
            Catch ex As Exception
                RaiseEvent NewMessage(ex.Message)
            End Try    End Sub 'Send    Public Sub SendCallback(ByVal ar As IAsyncResult)
            Dim handler As Socket
            Try
                ' Retrieve the socket from the state object
                handler = CType(ar.AsyncState, Socket)
                ' Complete sending the data to the remote device
                Dim bytesSent As Integer = handler.EndSend(ar)
                'handler.Shutdown(SocketShutdown.Both)
                'handler.Close()
            Catch e As Exception
                RaiseEvent NewMessage(e.Message)
            End Try
        End Sub 'SendCallback
        Public Sub StopListen()
            Dim handler As Socket
            Dim i As Integer        Try
                If Not IsNothing(listener) Then
                    For i = 0 To arrSockets.Count - 1
                        handler = arrSockets(i)
                        Try
                            handler.Shutdown(SocketShutdown.Both)
                            handler.Close()
                        Catch ex As Exception                    End Try
                    Next
                    Try
                        If listener.Connected = True Then
                            listener.Shutdown(SocketShutdown.Both)
                            listener.Close()
                        End If
                    Catch ex As Exception                End Try
                End If
            Catch ex As Exception
                RaiseEvent NewMessage(ex.Message)
            Finally
                Try
                    listener = Nothing
                    htSockets.Clear()
                    arrSockets.Clear()
                Catch ex As Exception            End Try        End Try
        End Sub
    End Class
      

  7.   

    在这里我首先向我解答问题的各位表示深深的感谢,我在这个工程里面主要是采用Socket作为客户端来相传口服务器]的端口发送指令然后根据指令返回的数据来判断设备的工作状态。因为刚刚接触c#进行socket编程所以不是很熟悉。主要是采用异步方式进行数据读取。发送的是16进制的数据协议上说返回 的是16进制数据。可是我读取到的数据是乱码。串口服务器和控制单元的设置我检查过没有问题。怎墨杨才能正确读取返回的16进制数据呢  大家帮帮我好吗。今天帮助我的朋友我会进快把分给你们。 再次谢谢大家。给我一个思路或者代码  真的快崩溃了
      

  8.   

    我不清楚在你的代码里,16进制数据是怎么传送的,
    但在我的代码里面,发送vb下面的十六进制:Hex(4559),在client 端可以正常接收server:
                handler = htSockets(ports)
                'strSend = "Server--->" + frmMain.rTxtSend.Text & Chr(13) & Chr(10)
                'byteSend = Encoding.BigEndianUnicode.GetBytes(strSend)
                strSend = Hex(4559)
                byteSend = Encoding.BigEndianUnicode.GetBytes(strSend)Client:
                 Dim strB As StringBuilder = New StringBuilder
                strB.Append(Encoding.BigEndianUnicode.GetString(buffer, 0, bytesRead))
    byteSend = Encoding.BigEndianUnicode.GetBytes(strSend)
    你可以改成采用 Little-Endian 字节顺序的 Unicode 格式的编码方式试试:
    byteSend = Encoding.Unicode.GetBytes(strSend)strB.Append(Encoding.Unicode.GetString(buffer, 0, bytesRead))