シリアル化されたオブジェクトをサーバーに送信しようとしているプロジェクトがあり、「OK」または「エラー」メッセージが返されるのを待ちます。
私は次のポスターと同様の問題を抱えているようです: TcpClient send/close problem
問題は、元のオブジェクトを送信できるように見える唯一の方法は接続を閉じることですが、(もちろん) オブジェクトがサーバーによって正常に処理されたかどうかを確認するのが待ちきれません。
private void button4_Click(object sender, EventArgs e)
{
RequestPacket req = new RequestPacket();
/// ... Fill out request packet ...
/// Connect to the SERVER to send the message...
TcpClient Client = new TcpClient("localhost", 10287);
using (NetworkStream ns = Client.GetStream())
{
XmlSerializer xml = new XmlSerializer(typeof(RequestPacket));
xml.Serialize(ns, req);
/// NOTE: This doesn't seem to do anything....
/// The server doesn't get the object I just serialized.
/// However, if I use ns.Close() it does...
/// but then I can't get the response.
ns.Flush();
// Get the response. It should be "OK".
ResponsePacket resp;
XmlSerializer xml2 = new XmlSerializer(typeof(ResponsePacket));
resp = (ResponsePacket)xml2.Deserialize(ns);
/// ... EVALUATE RESPONSE ...
}
Client.Close()
}
更新: 1 人のコメンターへの回答として、クライアントに責任があるとは思えません。それは単にオブジェクトを待っているだけで、ソケットを閉じるまでオブジェクトは決して来ません....しかし、もし私が間違っていたら、喜んで公にカラスを食べます. =) クライアントは次のとおりです。
static void Main(string[] args)
{
// Read the port from the command line, use 10287 for default
CMD cmd = new CMD(args);
int port = 10287;
if (cmd.ContainsKey("p")) port = Convert.ToInt32(cmd["p"]);
TcpListener l = new TcpListener(port);
l.Start();
while (true)
{
// Wait for a socket connection.
TcpClient c = l.AcceptTcpClient();
Thread T = new Thread(ProcessSocket);
T.Start(c);
}
}
static void ProcessSocket(object c)
{
TcpClient C = (TcpClient)c;
try
{
RequestPacket rp;
//// Handle the request here.
using (NetworkStream ns = C.GetStream())
{
XmlSerializer xml = new XmlSerializer(typeof(RequestPacket));
rp = (RequestPacket)xml.Deserialize(ns);
}
ProcessPacket(rp);
}
catch
{
// not much to do except ignore it and go on.
}
}
ええ....それはとても簡単です。