我现在利用socket作为客户端来访问服务端(串口服务器),我需要通过用SOCKET连接上一个串口后,给远端的控制单元发送控制命令,然后接收控制单元返回的数据,控制指令是特定格式的:
测试通信是否成功 BBH 0 0 44H 正确通信返回数据:80H 现在需要把这个返回的数据显示在文本框内供用户查看。
紧急 紧急 解决后立即高分相送
测试通信是否成功 BBH 0 0 44H 正确通信返回数据:80H 现在需要把这个返回的数据显示在文本框内供用户查看。
紧急 紧急 解决后立即高分相送
解决方案 »
- 【求助】CS架构的项目SQL Server数据库与网络同步怎么做?
- 有没有什么 办法(命令)让一个文件和它之内的所有文件全部 结束被“另一个进程访问”
- C# windows Form 创建的消息流程
- 如何在sql数据库中查询image格式数据??????
- 怎样使textbox或其它控件高度会随内容大小变化?
- treenode 的问题
- WPF,如何使treeview里的某个关键词,高亮?
- 初次用c#读写.txt文件,不太会写,请大家帮忙,谢谢了。在线等
- 关于server 2003中的C#的编译问题
- notes安装问题
- [急急急]c#调用delphi7写的dll的问题!!!请高手帮忙
- 关于文章关键字搜索算化的问题
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
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
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
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)");
}
}
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();
}
补完接上面
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
但在我的代码里面,发送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))