2017-09-09 1 views
0

c를 소켓 프로그래밍, 여기에 서버 코드, 나는 클라이언트에서 문자열을 받아 데이터베이스에 삽입 데스크탑 소프트웨어 서버 시스템을 만들었습니다 #

public class TcpServer 
{ 
    public TcpListener _server; 
    public Boolean _isRunning; 
    Data_connection dbobject = new Data_connection(); 
    SQLiteConnection SQLconnect = new SQLiteConnection(); 
    Window win; 
    public DataTable dt_stored; 
    public List<string> connected_users; 

    public TcpServer(int port,Window _win) 
    { 
     win = _win; 
     _server = new TcpListener(IPAddress.Any, port); 
     connected_users = new List<string>(); 
     _server.Start(); 

     _isRunning = true; 

     SQLconnect.ConnectionString = dbobject.datalocation(); 

     Thread th = new Thread(listenClients); 
     th.Start(); 
     //listenClients(); 
    } 
    public void listenClients() 
    { 
     while (_isRunning) 
     { 
      try 
      { 
       // wait for client connection 
       TcpClient newClient = _server.AcceptTcpClient(); 

       // client found. 
       // create a thread to handle communication 
       Thread t = new Thread(new ParameterizedThreadStart(HandleClient)); 

       t.Start(newClient); 
      }catch(Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
      } 
     } 
    } 

    public void HandleClient(object obj) 
    { 
     // retrieve client from parameter passed to thread 
     TcpClient client = (TcpClient)obj; 

     StreamWriter sWriter = new StreamWriter(client.GetStream(), Encoding.ASCII); 
     StreamReader sReader = new StreamReader(client.GetStream(), Encoding.ASCII); 


     // reads from client stream 
     string sData = sReader.ReadLine(); 

     if (!string.IsNullOrEmpty(sData)) 
     { 
      //store to sqlite database 
      insertToDB(sData, 0); 
      string[] arr = sData.Split(','); 
      //add name to list 
      connected_users.Add(arr[0]); 
      //select all students from the DB 
      SelectAllStudents(); 
      ////show 
      //MessageBox.Show(sData); 

      // to write data back. 
      string allnames = convertDtNamesToString(); 
      sWriter.WriteLine(allnames); 
      sWriter.Flush(); 
     } 
    } 

    private string convertDtNamesToString() 
    { 
     string data = ""; 
     foreach(DataRow row in dt_stored.Rows) 
     { 
      data = data +row[1].ToString()+","; 
     } 
     return data; 
    } 

    public void SelectAllStudents() 
    { 
     if (SQLconnect.State != ConnectionState.Open) 
     { 
      SQLconnect.Open(); 
     } 
     SQLiteCommand cmd = new SQLiteCommand("select * from Students", SQLconnect); 
     SQLiteDataAdapter da = new SQLiteDataAdapter(); 
     dt_stored = new DataTable(); 
     da.SelectCommand = cmd; 
     da.Fill(dt_stored); 

     if (SQLconnect.State != ConnectionState.Closed) 
     { 
      SQLconnect.Close(); 
     } 
    } 

    private void insertToDB(string sData,int n) 
    { 
     if(n>20) 
     { 
      MessageBox.Show("Error inserting data"); 
      return; ; 
     } 
     if (SQLconnect.State != ConnectionState.Open) 
     { 
      SQLconnect.Open(); 
     } 
     //create students table if not exist 
     try 
     { 
      SQLiteCommand SQLcommand = new SQLiteCommand(); 
      SQLcommand = SQLconnect.CreateCommand(); 
      SQLcommand.CommandText = "CREATE TABLE IF NOT EXISTS Students" + "(Name TEXT, Phone TEXT, Address Text, Passport Text);"; 
      SQLcommand.ExecuteNonQuery(); 
      SQLcommand.Dispose(); 
      // MessageBox.Show("Table Created"); 

      //insert student 
      string[] data = sData.Split(','); 
      SQLiteCommand cmd = new SQLiteCommand(); 

      cmd = SQLconnect.CreateCommand(); 
      cmd.CommandText = "insert into Students values (@_name,@_phone,@_address,@_passport)"; 
      cmd.Parameters.AddWithValue("@_name", data[1]); 
      cmd.Parameters.AddWithValue("@_phone", data[2]); 
      cmd.Parameters.AddWithValue("@_address", data[3]); 
      cmd.Parameters.AddWithValue("@_passport", data[4]); 

      cmd.ExecuteNonQuery(); 
      cmd.Dispose(); 
     } 
     catch (Exception ex) 
     { 
      n++; 
      Thread.Sleep(200); 
      insertToDB(sData,n); 
     } 
     finally 
     { 
      if (SQLconnect.State != ConnectionState.Closed) 
      { 
       SQLconnect.Close(); 
      } 
     } 
     //MessageBox.Show("Data Inserted"); 
    } 
} 

내가이 클라이언트 sofwtare을 가지고, 문자열 대신, 네트워크를 통해 JSON 데이터를 전송,, 내가 그것에 대해 이동하는 방법을 모르는 이는 또한, 데이타베이스에 삽입하기 위해 서버로 데이터를 전송하고, 여기에 코드

class Client 
{ 
    private TcpClient _tcpclient; 

    private StreamReader _sReader; 
    private StreamWriter _sWriter; 
    public static List<string> lst_storeddata = new List<string>(); 

    private Boolean _isConnected; 
    string name; 
    string phone; 
    string address; 
    string passport; 
    public Client(string _name, string _phone, string _address, string _passport) 
    { 
     //server ip 
     String ipAddress = "127.0.0.1"; 
     //String ipAddress = "192.168.43.15"; 
     //port number 
     int portNum = 8585; 
     try 
     { 
      _tcpclient = new TcpClient(); 
      _tcpclient.Connect(ipAddress, portNum); 

      name = _name; 
      phone = _phone; 
      address = _address; 
      passport = _passport; 

      HandleCommunication(); 
     }catch(Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 

    public void HandleCommunication() 
    { 
     _sReader = new StreamReader(_tcpclient.GetStream(), Encoding.ASCII); 
     _sWriter = new StreamWriter(_tcpclient.GetStream(), Encoding.ASCII); 

     string clientData = Environment.MachineName+","+name + "," + phone + "," + address + "," + passport; 
     _sWriter.WriteLine(clientData); 
     _sWriter.Flush(); 

     // receive data 
     String sDataIncomming = _sReader.ReadLine(); 
     lst_storeddata = (sDataIncomming.Split(',')).ToList();  
     _sWriter.Close(); 
     _tcpclient.Close(); 
    } 
} 

나의 도전은 이제도 정렬.

도와주세요.

+0

JSON은 문자열입니다. 무슨 문제가 있었 니? – CodeCaster

+0

어떻게 가는지 ... –

+0

당신은 요점을 놓치고 있습니다. 귀하의 질문에서 명확하게 도움이 필요한 부분이 무엇인지 명확하지 않습니다. 일반적으로 소켓을 사용하고 싶지는 않지만 HTTP와 같은 상위 레벨 구조를 사용합니다. – CodeCaster

답변

0

Json 직렬화는 객체를 객체의 문자열 표현으로 변환합니다. 기존 코드가 정상적으로 작동하면 모든 POCO를 문자열로 serialize하고 다시 사용할 수 있습니다.

C# 용 사실상 표준 json 직렬화 라이브러리는 일반적으로 Newtonsoft.json nuget 패키지를 통해 참조되는 Json.NET입니다.

관련 문제