Еще один вопрос: я скопировал класс Command из клиента и вставил на сервер для десериализации. Это правильно?
Нет. Пространство имен для вашего Клиента и Сервера, вероятно, различается, поэтому Сервер будет пытаться десериализовать поток, который соответствует его пространству имен.
Вы должны создать свой Командный класс, используя его собственное пространство имен и ссылаться на него как с вашего Клиента, так и с Сервера.
После этого ...
Клиент:
static void StreamToServer(TcpClient client, Command obj) {
using (NetworkStream ns = client.GetStream()) {
using (MemoryStream ms = new MemoryStream()) {
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms, obj);
byte[] buf = ms.ToArray();
ns.Write(buf, 0, buf.Length);
}
}
}
Сервер:
static Command ReadStream(TcpListener listener) {
Command obj = null;
using (TcpClient client = listener.AcceptTcpClient()) { // waits for data
using (NetworkStream ns = client.GetStream()) {
byte[] buf = new byte[client.ReceiveBufferSize];
int len = ns.Read(buf, 0, buf.Length);
using (MemoryStream ms = new MemoryStream(buf, 0, len)) {
BinaryFormatter formatter = new BinaryFormatter();
obj = formatter.Deserialize(ms) as Command;
}
}
}
return obj;
}
WCF или Обрамление сообщений может быть проще, но у меня не часто есть возможность сидеть и читать книгу.