C#从Socket接收数据并将其放入字符串中?

时间:2015-09-05 11:52:25

标签: c# sockets

我有一个套接字服务器,并尝试从客户端接收一个字符串。

客户端非常完美,当我使用此

Socket s = myList.AcceptSocket();                 Console.WriteLine("连接从" + s.RemoteEndPoint接受);

            byte[] b = new byte[100];
            int k = s.Receive(b);
            Console.WriteLine(k);
            Console.WriteLine("Recieved...");
            for (int i = 0; i < k; i++)
                Console.Write(Convert.ToChar(b[i]));

                        ASCIIEncoding asen = new ASCIIEncoding();
            s.Send(asen.GetBytes("The string was recieved by the server."));

一切都很好,我在控制台中收到了我的字符串。

但是我如何才能将我的接收变成一个字符串,以便在切换案例中使用它?

像这样:

string action = Convert.ToChar(b[i]);

错误:

  

名称i不在当前上下文中。   它是我得到的唯一错误消息。

3 个答案:

答案 0 :(得分:3)

Init socket

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ipAdd = System.Net.IPAddress.Parse(m_ip);
IPEndPoint remoteEP = new IPEndPoint(ipAdd, m_port);

连接套接字

socket.Connect(remoteEP);

从套接字

接收
byte[] buffer = new byte[1024];
int iRx = socket.Receive(buffer);
char[] chars = new char[iRx];

System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
int charLen = d.GetChars(buffer, 0, iRx, chars, 0);
System.String recv = new System.String(chars);

发送消息

byte[] byData = System.Text.Encoding.ASCII.GetBytes("Message");
socket.Send(byData);

关闭套接字

socket.Disconnect(false);
socket.Close();

答案 1 :(得分:2)

假设s是您呼叫接收的Socket对象,则会返回byte[]。要将其转换回字符串,请使用适当的编码,例如

string szReceived = Encoding.ASCII.GetString(b);

编辑:由于缓冲区b总是100个字节,但实际接收的字节数随每个连接而变化,因此应使用Socket.Receive()调用的返回值仅转换实际数字接收的字节数。

byte[] b = new byte[100];
int k = s.Receive(b);
string szReceived = Encoding.ASCII.GetString(b,0,k); 

答案 2 :(得分:1)

这种方式不需要设置缓冲区大小,它适合响应:

public static byte[] ReceiveAll(this Socket socket)
    {
        var buffer = new List<byte>();

        while (socket.Available > 0)
        {
            var currByte = new Byte[1];
            var byteCounter = socket.Receive(currByte, currByte.Length, SocketFlags.None);

            if (byteCounter.Equals(1))
            {
                buffer.Add(currByte[0]);
            }
        }

        return buffer.ToArray();
    }