TCP-IP客户端-服务器应用程序来操作字典

时间:2019-05-05 01:46:29

标签: c# tcp tcpclient tcplistener

我正在编写一个客户端服务器程序。

服务器将容纳一个词典,并且客户端能够向该词典添加更新键值。

假设客户端-'A'添加了项目import arabic_reshaper reshaped = arabic_reshaper.reshape(exam_name) c.drawString(x - 100, y - 20, reshaped, direction=RTL) 。当另一个客户端-'B'要更新(1, 111)的值时,它必须从'A'寻求确认,反之亦然。


请看一下以下程序:

(1, 111)

问题出在using MyClientServerLib; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; namespace MyServerProgram { class ServerProgram { static Dictionary<string, KeyValue> KeyValueDictionary; static Dictionary<string, ClientClass> ClientDictionary; static void Main(string[] args) { Console.Title = "Server"; Console.WriteLine("Server program started..."); KeyValueDictionary = new Dictionary<string, KeyValue>(); ClientDictionary = new Dictionary<string, ClientClass>(); string ipAddress = "127.0.0.1"; int portNo = 2000; IPAddress ip = IPAddress.Parse(ipAddress); TcpListener listener = new TcpListener(ip, portNo); // poll for clients in a 2nd thread Thread thread = new Thread(delegate() { ServerProgram.PollIncomingClientConns(listener); }); thread.Start(); } #region catching client connections static void PollIncomingClientConns(TcpListener listener) { listener.Start(); try { bool keepRunning = true; while (keepRunning) { ClientClass client = new ClientClass(listener); ClientDictionary.Add(client.ID, client); Thread thread = new Thread(delegate() { ServerProgram.ReadFromClient(client); }); thread.Start(); } } catch (Exception ex) { var inner = ex.InnerException as SocketException; if (inner != null && inner.SocketErrorCode == SocketError.ConnectionReset) Console.WriteLine("Disconnected"); else Console.WriteLine(ex.Message); listener.Stop(); } } #endregion static void ReadFromClient(ClientClass client) { try { ClientClass origClient = null; while (client.Tcp.Connected) { string str = client.ReadString(); switch(str) { case Commands.AddKeyValue: string key = client.ReadString(); string val = client.ReadString(); KeyValue keyValue = new KeyValue(client.ID, key, val); KeyValueDictionary.Add(key, keyValue); Console.WriteLine(keyValue.ToString() + " added."); break; case Commands.ListKeys: if (KeyValueDictionary.Keys.Count > 0) { foreach (string key1 in KeyValueDictionary.Keys) { client.Write("(" + key1 + "," + KeyValueDictionary[key1].Value + ")\t"); } } else { client.Write("No KV"); } break; case Commands.UpdateValue: //obtain update requester client-ID client.Key = client.ReadString(); //read key client.Value = client.ReadString(); //read val KeyValue oldKeyVal = null; bool currClientFound = KeyValueDictionary.TryGetValue(client.Key, out oldKeyVal); //search the dictionary with the client name if (currClientFound) //if found { if (oldKeyVal.ClientID.Equals(client.ID))//if rem requested by same client... { KeyValueDictionary[client.Key].Value = client.Value; client.Write(client.Key + " is updated."); } else //if rem requested by a different client... { //get the original client bool origClientFound = ClientDictionary.TryGetValue(oldKeyVal.ClientID, out origClient); //search the dictionary with the client name if (origClientFound) { origClient.Write(client.ID + " wants to change " + oldKeyVal.ToString() + "(y/n)"); } } } break; case Commands.Yes: Console.WriteLine(client.Key + ", " + client.Value); KeyValueDictionary[client.Key].Value = client.Value; client.Write(client.Key + " is updated."); break; } } } catch { client.Disconnect(); } } } } case Commands.UpdateValue中。

当客户端在先前的迭代中请求更新时,键值对将与client-instance一起保存。然后,在下一次迭代中,当另一个客户端发送确认时,键值对将更新。

但是,在下一次迭代中,case Commands.Yes显示client.Key。因此null失败了。

我该如何解决这个问题?


其他源代码文件:

  1. ClientProgram.cs
  2. ClientClass.cs

1 个答案:

答案 0 :(得分:0)

我已经通过使键和值保持变量为静态来解决此问题:

 class ServerProgram
 { 
      static stKey;
      static stValue;

      ....
      ....      
                    case Commands.UpdateValue: //obtain update requester client-ID                            
                        stKey = client.ReadString(); //read key 
                        stValue = client.ReadString(); //read val

                        ....
                        ....

                    case Commands.Yes:
                        Console.WriteLine(stKey + ", " + stValue);
                        KeyValueDictionary[stKey].Value = stValue;
                        client.Write(stKey + " is updated.");
                        break;

     }