请教:
我的服务器和客服端用 socket 来通信需要相互之间发送 字符串和 jpg 图片文件现在有个问题假设现在 客户端要向服务器 发送图片我首先吧图片变为 流
然后发送服务器这边开始接收服务器怎么判断接收的是客服端发送字符串?
还是客服端发送的 图片如果用 C# 来写
客户端的发送和服务器的接收要怎么写阿?
是一个一个字符循环接收吗?谢谢!

解决方案 »

  1.   

    解决方法就是所谓的通讯协议。比如,每次发送都是如下格式:一行命令,一行数据长度,数据。比如发送长度为1234的图片,可以:
    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:发送字符串发送‘你好’完整数据包可以表示为
    0x10x0,0x0,0x6, 0xE4,0xBD,0xA0,0xE5,0xA5,0xBD
    这样总共10个字节,红色部分表示命令为1(发送图片),绿色部分为数据长度6,具体数据为UTF8编码的‘你好’消息。
      

  2.   

    这是我之前自己学习socket时写的服务器通信的代码
    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|,服务端收到后就通过分隔符|拆分,这样就能够判断出发来的是字符串还是图片,然后做对应的处理就行了。
      

  3.   

    其实你的思路就有点错误了.虽然tcp/ip传输是byte[]这种形式.. 但是没人说 不允许加"别的东西"啊..你可以封装你自己的通讯协议嘛..比如  (伪代码,根据你具体实际需求)class chartModel
    {
      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...
      

  4.   

    我是用vb.net写的,c#差不多的,改变下语法就行了,客户端发送信息前加命令语句,服务端拆分再处理,同样,服务端向客户端发送信息时也添加命令语句,客户端接收到照样拆分处理。我不知道你具体是干嘛,但是这样的思路是完全可行的。
    发送语句时就是
    if 是图片
    socket.send(Encoding.UTF8.GetBytes("jpg|"+图片相关字符串序列))
    if 是字符串
    socket.send(Encoding.UTF8.GetBytes("string|"+字符串序列))
    在什么时候写对应的send语句,就你自己考虑了