2012-04-16 7 views
12

サーバーとクライアントの間で単純な文字列を送受信するアプリケーションを作成するための宿題があります。私は接続を確立する方法を知っているが、文字列の送受信方法を知らない。これは私のコードです:サーバークライアントはシンプルなテキストを送受信します

public partial class Form1 : Form 
{ 
    private Thread n_server; 
    private Thread n_client; 
    private Thread n_send_server; 
    private TcpClient client; 
    private TcpListener listener; 
    private int port = 2222; 
    private string IP = " "; 
    private Socket socket; 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void exitToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     Application.Exit(); 
    } 

    public void Server() 
    { 
     listener = new TcpListener(IPAddress.Any, port); 
     listener.Start(); 
     try 
     { 
      socket = listener.AcceptSocket(); 
      if (socket.Connected) 
      { 
       textBox2.Invoke((MethodInvoker)delegate { textBox2.Text = "Client : " + socket.RemoteEndPoint.ToString(); }); 
      } 
     } 
     catch 
     { 
     } 
    } 

    public void Client() 
    { 
     IP = "localhost"; 
     client = new TcpClient(); 
     try 
     { 
      client.Connect(IP, port); 
     } 

     catch (Exception ex) 
     { 
      MessageBox.Show("Error : " + ex.Message); 
     } 

     if (client.Connected) 
     { 
      textBox3.Invoke((MethodInvoker)delegate { textBox3.Text = "Connected..."; }); 

     } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     n_server = new Thread(new ThreadStart(Server)); 
     n_server.IsBackground = true; 
     n_server.Start(); 
     textBox1.Text = "Server up"; 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     n_client = new Thread(new ThreadStart(Client)); 
     n_client.IsBackground = true; 
     n_client.Start(); 
    } 

    private void send() 
    { 
     // I want to use this method for both buttons : "send button" on server side and "send button" 
     // on client side. First I read text from textbox2 on server side or textbox3 
     // on client side than accept and write the string to label2(s) or label3(c). 
     // 
    } 


    private void button3_Click(object sender, EventArgs e) 
    { 
     n_send_server = new Thread(new ThreadStart(send)); 
     n_send_server.IsBackground = true; 
     n_send_server.Start(); 
    } 
} 

答えて

46

次のコードセンドから、サーバに現在の日付と時刻を受け取る

//次のコードは、サーバアプリケーションのためにある:

namespace Server 
{ 
    class Program 
    { 
     const int PORT_NO = 5000; 
     const string SERVER_IP = "127.0.0.1"; 

     static void Main(string[] args) 
     { 
      //---listen at the specified IP and port no.--- 
      IPAddress localAdd = IPAddress.Parse(SERVER_IP); 
      TcpListener listener = new TcpListener(localAdd, PORT_NO); 
      Console.WriteLine("Listening..."); 
      listener.Start(); 

      //---incoming client connected--- 
      TcpClient client = listener.AcceptTcpClient(); 

      //---get the incoming data through a network stream--- 
      NetworkStream nwStream = client.GetStream(); 
      byte[] buffer = new byte[client.ReceiveBufferSize]; 

      //---read incoming stream--- 
      int bytesRead = nwStream.Read(buffer, 0, client.ReceiveBufferSize); 

      //---convert the data received into a string--- 
      string dataReceived = Encoding.ASCII.GetString(buffer, 0, bytesRead); 
      Console.WriteLine("Received : " + dataReceived); 

      //---write back the text to the client--- 
      Console.WriteLine("Sending back : " + dataReceived); 
      nwStream.Write(buffer, 0, bytesRead); 
      client.Close(); 
      listener.Stop(); 
      Console.ReadLine(); 
     } 
    } 
} 

//これはクライアントのコードです

namespace Client 
{ 
    class Program 
    { 
     const int PORT_NO = 5000; 
     const string SERVER_IP = "127.0.0.1"; 
     static void Main(string[] args) 
     { 
      //---data to send to the server--- 
      string textToSend = DateTime.Now.ToString(); 

      //---create a TCPClient object at the IP and port no.--- 
      TcpClient client = new TcpClient(SERVER_IP, PORT_NO); 
      NetworkStream nwStream = client.GetStream(); 
      byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes(textToSend); 

      //---send the text--- 
      Console.WriteLine("Sending : " + textToSend); 
      nwStream.Write(bytesToSend, 0, bytesToSend.Length); 

      //---read back the text--- 
      byte[] bytesToRead = new byte[client.ReceiveBufferSize]; 
      int bytesRead = nwStream.Read(bytesToRead, 0, client.ReceiveBufferSize); 
      Console.WriteLine("Received : " + Encoding.ASCII.GetString(bytesToRead, 0, bytesRead)); 
      Console.ReadLine(); 
      client.Close(); 
     } 
    } 
} 
+1

このコードは動作していますか、テストされていますか? – SANDEEP

+4

こんにちは@SANDEEPコードは魅力のように動作します。私はそれを提出する前にテストしました。 –

+0

なぜサーバーから返された最初のメッセージのみを読み取ることができますか?次回に_nwStream.Read_を呼び出すと、値は返されません。デバッグポイントを設定すると、次の行に移動することはできません。例外はスローされません。 – Hp93

-2

クライアント

名前空間SocketKlient

{クラスプログラム

{ 
    static Socket Klient; 
    static IPEndPoint endPoint; 
    static void Main(string[] args) 
    { 
     Klient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     string command; 
     Console.WriteLine("Write IP address"); 
     command = Console.ReadLine(); 
     IPAddress Address; 
     while(!IPAddress.TryParse(command, out Address)) 
     { 
      Console.WriteLine("wrong IP format"); 
      command = Console.ReadLine(); 
     } 
     Console.WriteLine("Write port"); 
     command = Console.ReadLine(); 

     int port; 
     while (!int.TryParse(command, out port) && port > 0) 
     { 
      Console.WriteLine("Wrong port number"); 
      command = Console.ReadLine(); 
     } 
     endPoint = new IPEndPoint(Address, port); 
     ConnectC(Address, port); 
     while(Klient.Connected) 
     { 
      Console.ReadLine(); 
      Odesli(); 
     } 
    } 

    public static void ConnectC(IPAddress ip, int port) 
    { 
     IPEndPoint endPoint = new IPEndPoint(ip, port); 
     Console.WriteLine("Connecting..."); 
     try 
     { 
      Klient.Connect(endPoint); 
      Console.WriteLine("Connected!"); 
     } 
     catch 
     { 
      Console.WriteLine("Connection fail!"); 
      return; 
     } 
     Task t = new Task(WaitForMessages); 
     t.Start(); 
    } 

    public static void SendM() 
    { 
     string message = "Actualy date is " + DateTime.Now; 
     byte[] buffer = Encoding.UTF8.GetBytes(message); 
     Console.WriteLine("Sending: " + message); 
     Klient.Send(buffer); 
    } 

    public static void WaitForMessages() 
    { 
     try 
     { 
      while (true) 
      { 
       byte[] buffer = new byte[64]; 
       Console.WriteLine("Waiting for answer"); 
       Klient.Receive(buffer, 0, buffer.Length, 0); 

       string message = Encoding.UTF8.GetString(buffer); 
       Console.WriteLine("Answer: " + message); 
      } 
     } 
     catch 
     { 
      Console.WriteLine("Disconnected"); 
     } 
    } 
} 

}

+2

コードのみの回答を投稿しないでください。あなたは答えがなぜそれが働くのかについての説明を含めるべきです。 – Milk

+1

また、クライアントコードとサーバーコードの両方を1つの回答に含める必要があります。 2つではありません。 –

-2

SERVER

名前空間SocketServer

{クラスプログラム

{ 
    static Socket klient; 
    static void Main(string[] args) 
    { 
     Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 8888); 
     server.Bind(endPoint); 
     server.Listen(20); 
     while(true) 
     { 
      Console.WriteLine("Waiting..."); 
      klient = server.Accept(); 

      Console.WriteLine("Client connected"); 
      Task t = new Task(ServisClient); 
      t.Start(); 
     } 
    } 

    static void ServisClient() 
    { 
     try 
     { 
      while (true) 
      { 
       byte[] buffer = new byte[64]; 
       Console.WriteLine("Waiting for answer..."); 
       klient.Receive(buffer, 0, buffer.Length, 0); 
       string message = Encoding.UTF8.GetString(buffer); 
       Console.WriteLine("Answer: " + message); 

       string answer = "Actualy date is " + DateTime.Now; 
       buffer = Encoding.UTF8.GetBytes(answer); 
       Console.WriteLine("Sending {0}", answer); 
       klient.Send(buffer); 
      } 
     } 
     catch 
     { 
      Console.WriteLine("Disconnected"); 
     } 
    } 
} 

}

関連する問題