请教:
我的服务器和客服端用 socket 来通信需要相互之间发送 字符串和 jpg 图片文件现在有个问题假设现在 客户端要向服务器 发送图片我首先吧图片变为 流
然后发送服务器这边开始接收服务器怎么判断接收的是客服端发送字符串?
还是客服端发送的 图片如果用 C# 来写
客户端的发送和服务器的接收要怎么写阿?
是一个一个字符循环接收吗?谢谢!
我的服务器和客服端用 socket 来通信需要相互之间发送 字符串和 jpg 图片文件现在有个问题假设现在 客户端要向服务器 发送图片我首先吧图片变为 流
然后发送服务器这边开始接收服务器怎么判断接收的是客服端发送字符串?
还是客服端发送的 图片如果用 C# 来写
客户端的发送和服务器的接收要怎么写阿?
是一个一个字符循环接收吗?谢谢!
SendPicture\r\n
1234\r\n
...共1234字节的图片数据...这样总共发送13+6+1234字节的数据。比如发送长度为6的字符串,可以:
SendMessage\r\n
6\r\n
你好这样总共发送13+3+6字节的数据,其中‘你好’的UTF8字节编码为E4-BD-A0-E5-A5-BD,是6个字节。
如果你不喜欢用\r\n来分隔数据,也可以用其他方法,比如
用一个字节来表示命令(一个字节可以表示最多256个命令)
用3个字节来表示数据长度(3个字节可支持最多256的3次方的数据)
具体数据随后。比如命令:
1:发送图片
2:发送字符串发送‘你好’完整数据包可以表示为
0x1, 0x0,0x0,0x6, 0xE4,0xBD,0xA0,0xE5,0xA5,0xBD
这样总共10个字节,红色部分表示命令为1(发送图片),绿色部分为数据长度6,具体数据为UTF8编码的‘你好’消息。
Dim conSocket As Socket = mySocket
'不断对话
While True
Try
Dim bytes() As Byte = New Byte(1024) {} '字符缓冲区
Dim data As String = String.Empty '字符串数据
Dim tokens() As String '分割后的信息
'传来的字符大小
Dim bytesRec As Integer = conSocket.Receive(bytes)
'转化成人能看懂的字符
data = Encoding.UTF8.GetString(bytes, 0, bytesRec)
'进行分割
tokens = data.Trim.Split("|")
Select Case tokens(0) '分析接收到的数据
Case "Chat" '表示对话
‘xxxxxxx
Case "Exit"'表示客户端主动断线离开
' xxxxxx
Case "Heart"
'测试服务器是否收到心跳包
‘ xxxxxxx
End Select
Catch ex As Exception
'MessageBox.Show(ex.Message)
BeginInvoke(New EventHandler(AddressOf AddInfo), ex.Message)
End Try
End While
简单的思路就是,客户端发送相关信息前在字符串前添加命令语句,如Heart|,Exit|等,服务端接收到后就对其进行分割,这样就能够判断出是发来的语句是做什么的,不同功能就能用不同字符代替。像你是区分字符串和图片,那么你可以在客户端发送前在前面添加string|或者jpg|,服务端收到后就通过分隔符|拆分,这样就能够判断出发来的是字符串还是图片,然后做对应的处理就行了。
{
public string type{get;set;}
public int myuid{get;set;}
public int touid{get;se;}
public byte [] data{get;set;}
}
如果用户1要给用户555发一段文字那么var data=new chartModel(){touid=555,type="msg"......data=getbytes("你好")}.tojson().tobyte();
send(data);
你在接收的时候 你把byte[]先转换成string在转换成chartModel对象. 然后判断type如果是msg的话 那么就把data里的数据转换成字符串输出.如果type=img 那么把data换成base64或者saveas成图片 显示到UI...
发送语句时就是
if 是图片
socket.send(Encoding.UTF8.GetBytes("jpg|"+图片相关字符串序列))
if 是字符串
socket.send(Encoding.UTF8.GetBytes("string|"+字符串序列))
在什么时候写对应的send语句,就你自己考虑了