C#从套接字接收数据并将其放入字符串中?
我有一个套接字服务器,正在尝试从客户端接收字符串 客户是完美的,当我使用这个C#从套接字接收数据并将其放入字符串中?,c#,sockets,C#,Sockets,我有一个套接字服务器,正在尝试从客户端接收字符串 客户是完美的,当我使用这个 Socket s = myList.AcceptSocket(); Console.WriteLine("Connection accepted from " + s.RemoteEndPoint); byte[] b = new byte[100]; int k = s.Receive(b); Console.WriteLine(k); Console.WriteLine("Recieved..."); for (
Socket s = myList.AcceptSocket();
Console.WriteLine("Connection accepted from " + 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."));
}
错误:
名称i不在当前上下文中。
这是我收到的唯一错误信息
假设
s
是调用receive的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);
初始化套接字
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();
这样无需设置缓冲区大小,适合响应:
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();
}
公共静态字节[]ReceiveAll(此套接字)
{
var buffer=新列表();
而(socket.Available>0)
{
var currByte=新字节[1];
var byteCounter=socket.Receive(currByte,currByte.Length,SocketFlags.None);
if(字节计数器等于(1))
{
buffer.Add(currByte[0]);
}
}
返回buffer.ToArray();
}
请增强您的代码示例,并显示b和s的定义。接下来,您肯定没有得到您正在描述的错误,因为它显然有打字错误。请发布一个副本粘贴版本的异常加上调用堆栈,而不是一个复述写上去。我怀疑你犯了这篇文章中描述的错误:好吧,我稍微更新了我的代码部分。我会检查链接:)@Christoph我检查了你的链接,但没有多少帮助或通知我。我必须说我不经常用C语言编程,你不能只说Convert.ToChar(b[I])
,然后期望它返回一个字符串,其中变量I
循环通过b
-数组的所有字节。明确地在for
语句中创建循环变量i
,否则该变量将不存在<代码>字符串操作=”;对于(inti=0;i
将适当地填充操作
变量。“名称i不在当前上下文中”-那么您就不会显示实际代码。在for()后面有分号吗代码>?它能工作一半谢谢!:)但现在,当我在控制台中编写它时,它显示正确。。。。但是我的开关箱坏了。。无事发生:o控制台写入线(szReceived);Console.WriteLine(“接收…”);开关(szReceived){case“ping”:Console.WriteLine(“ping-wird-ausgeführt!”);break;case“somethingelse”:break;}我的第一个直觉是,应该按照接收到的字节数切断数组Socket.Receive()
有一个返回值,您需要该值在实际接收的字节处切掉数组。使用这个:intk=s.Receive(b);string szReceived=Encoding.ASCII.GetString(b.Take(k.ToArray())
那么字符串的构造应该是完美的。(您需要一个使用System.Linq;
,或者使用第二个重载string szReceived=Encoding.ASCII.GetString(b,0,k);
)您做到了D谢谢大家。
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();
}