我使用Socket编程开发了客户端和服务器聊天应用程序...
我的问题是,如何将字符串项目列表转换为ASCII编码。 有没有办法使用它?
我的服务器端列表如下:
public static List<string> NickNameList = new List<string>();
在这里,我将客户的昵称添加到列表中。
Socket socket = socketClient as Socket;
byte[] bs = new byte[1024];
int ks = socket.Receive(bs);
string RecievedSocket = Encoding.ASCII.GetString(bs, 0, ks);
NickNameList.Add(RecievedSocket);
最后,我尝试将列表发送回客户端,该客户端保存在服务器上的NickNameList中。
ASCIIEncoding asen = new ASCIIEncoding();
socket.Send(asen.GetBytes(listBox1.Items.ToString()));
但我不知道如何获取未转换为字符串的客户列表。有没有办法直接使用ASCII编码发送列表?
如果您对此有任何了解,请告诉我......
答案 0 :(得分:0)
好的......如果你讨厌ASCII,我会帮助你: - )
一般情况下,请尝试使用BinaryReader
和BinaryWriter
。他们有一个构造函数,要求Stream
(从Tcp类中获取NetworkStream
)和Encoding
(您将使用Encoding.ASCII
)。
BinaryWriter
您使用Write(int)
来写List<>
的长度,然后使用Write(string)
编写列表元素(在for
中{1}} / foreach
周期)。
BinaryReader
支持你ReadInt32
需要阅读的元素数量,然后在for
周期中ReadString()
。
Write(string)
/ ReadString()
有一个“技巧”:它们在它们正在编写的字符串的长度之前/期望预先设置长度。这是因为在“纯”TCP连接中没有“消息”。你只有一个字节流,所以你不知道字符串的长度,除非你说(或者除非你使用特定的值,比如字节0,指定字符串的结尾)。我们使用相同的“技巧”来指定List<>
的长度:我们预先设置它的长度。
发送字符串列表的服务器的有趣示例,以及反转所有字符串并将其发回的客户端。
public static void Server()
{
var lst = new List<string> { "Foo", "Bar", "Baz" };
int port = 15001;
var localAddr = IPAddress.Parse("127.0.0.1");
var listener = new TcpListener(localAddr, port);
try
{
listener.Start();
while (true)
{
var client = listener.AcceptTcpClient();
var thread = new Thread(() =>
{
using (client)
using (var ns = client.GetStream())
using (var br = new BinaryReader(ns, Encoding.ASCII, true))
using (var bw = new BinaryWriter(ns, Encoding.ASCII, true))
{
bw.Write(lst.Count);
for (int i = 0; i < lst.Count; i++)
{
bw.Write(lst[i]);
}
var lst2 = new List<string>();
int count = br.ReadInt32();
for (int i = 0; i < count; i++)
{
lst2.Add(br.ReadString());
}
foreach (string str in lst2)
{
Console.WriteLine("Server: {0}", str);
}
}
});
thread.Start();
}
}
finally
{
listener.Stop();
}
}
public static void Client()
{
Trace.WriteLine("Client");
int port = 15001;
using (var client = new TcpClient("127.0.0.1", port))
using (var ns = client.GetStream())
using (var br = new BinaryReader(ns, Encoding.ASCII, true))
using (var bw = new BinaryWriter(ns, Encoding.ASCII, true))
{
var lst = new List<string>();
int count = br.ReadInt32();
for (int i = 0; i < count; i++)
{
lst.Add(br.ReadString());
}
foreach (string str in lst)
{
Console.WriteLine("Client: {0}", str);
}
bw.Write(lst.Count);
for (int i = 0; i < lst.Count; i++)
{
var chars = lst[i].ToCharArray();
Array.Reverse(chars);
bw.Write(new string(chars));
}
}
}
关于NetworkStream
的工作的有用问题:https://stackoverflow.com/a/30499295/613130(以及如何发送/接收消息)