2012-04-23 11 views
0

Я сделал это приложение чата с розеткой: сервера создать сокет и ждать сообщения от любого клиента для сервера:чат по розетке и C#

  using System; 
      using System.Collections.Generic; 
      using System.ComponentModel; 
      using System.Data; 
      using System.Drawing; 
      using System.Linq; 
      using System.Text; 
      using System.Windows.Forms; 
      using System.Xml; 
      using System.Net.Sockets; 
      using System.Net; 
      using System.Threading; 
      using System.IO; 
      namespace server 
     { 
     public partial class Form1 : Form 
{ 
    public static byte[] data; 
    public static byte[] data1; 
    public static Socket sock; 
    public delegate void operation(string s); 
    public delegate void operation2(); 
    public delegate bool verifier(); 
    public Form1() 
    { 
     InitializeComponent(); 
     sock = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); 

     IPAddress adress = IPAddress.Parse("127.0.0.1"); 
     IPEndPoint iep = new IPEndPoint(adress, 4000); 
     EndPoint ep = (EndPoint)iep; 
     sock.Bind(iep); 
     sock.Listen(10); 
     sock = sock.Accept(); 
     data1 = new byte[1024]; 
     data = new byte[1024]; 
     Thread.Sleep(2000); 
     this.Show(); 
     if (sock.Receive(data) > 0) 
     { 

      Thread t = new Thread(new ThreadStart(aller)); 
      t.Start(); 

     } 




    } 

    private void effectuer(String s) 
    { 
     textBox1.Text += "serveur: " + s + "\r\n"; 

     message.Text = ""; 
    } 
    private void effectuer4(String s) 
    { 
     textBox1.Text += "Client: " + s + "\r\n"; 

     message.Text = ""; 
    } 

    private void aller() { 


     String s = ASCIIEncoding.ASCII.GetString(data); 

     if (this.InvokeRequired) Invoke((operation)effectuer4, s); 
     else effectuer4(s); 
     //Thread.Sleep(2000); 
     byte[] data2 = new byte[1024]; 

      if (sock.Receive(data2) > 0 && data2 != data) 
      { 
       data = data2; 
       Thread t = new Thread(new ThreadStart(aller)); 
       t.Start(); 
      } 

     } 


    private void buttonDisconnect_Click(object sender, EventArgs e) 
    { 
     sock.Close(); 
     Application.Exit(); 
    } 

    private void buttonSend_Click(object sender, EventArgs e) 
    { 

     String s = message.Text ; 
     data1 = System.Text.Encoding.ASCII.GetBytes(s); 

     sock.Send(data1); 

     Invoke((operation)effectuer, s); 


    } 
    } 

} 

Для клиента: он отправить пустое сообщение сервер и ждать ответа сервера

using System; 
    using System.Collections.Generic; 
    using System.ComponentModel; 
    using System.Data; 
    using System.Drawing; 
    using System.Linq; 
    using System.Text; 
    using System.Windows.Forms; 
    using System.Net.Sockets; 
    using System.IO; 
    using System.Diagnostics; 
    using System.Threading; 
    using System.Net; 
    using System.Xml; 


    namespace client 
    { 
     public partial class Form1 : Form 
    { 
    public static TcpClient SocketPourClient = null; 
    public static string ClientMessage; 
    public static string ServerMessage; 
    Socket sock; 
    public static byte[] data; 
    public static byte[] data1; 
    public delegate void operation(String s); 
    public delegate void lancer(); 
    public delegate bool verifier(); 

    public Form1(string ip, int port) 
    { 
     InitializeComponent(); 
       IPAddress adress = IPAddress.Parse("127.0.0.1"); 
       IPEndPoint ipEnd = new IPEndPoint(adress, 4000); 
       sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
       try 
       { 
        sock.Connect(ipEnd); 
       } 
       catch (SocketException e) 
       { 
        MessageBox.Show(e.ToString()); 
        sock.Close(); 

       } 
       Thread t1 = new Thread(envoi); 
        t1.Start(); 
        data = new byte[1024]; 
        if (sock.Receive(data) > 0) 
       { 

        Thread t=new Thread(new ThreadStart(aller)); 
        t.Start(); 
       } 

    } 

    private void aller() 
    { 

     String s = ASCIIEncoding.ASCII.GetString(data); 

      if(this.InvokeRequired) Invoke((operation)effectuer4, s); 
     else effectuer4(s); 
      // Thread.Sleep(2000); 
      byte[] data2 = new byte[1024]; 

       if (sock.Receive(data2) > 0 && data2 != data) 
       { 
        data = data2; 
        Thread t = new Thread(new ThreadStart(aller)); 
        t.Start(); 
       } 
     } 

    private void envoi() 
    { 
     String s = message.Text ; 
     data1 = System.Text.Encoding.ASCII.GetBytes(s); 
     sock.Send(data1); 
     effectuer(s); 


    } 



private void effectuer(String s) 
{ 
    textBox1.Text += "client: " + s + "\r\n"; 

    message.Text = ""; 
} 

private void effectuer4(String s) 
{ 
    textBox1.Text += "Server: " + s + "\r\n"; 

    message.Text = ""; 

} 

private void buttonDisconnect_Click(object sender, EventArgs e) 
{ 
    sock.Close(); 
    Application.Exit(); 
} 

private void buttonSend_Click_1(object sender, EventArgs e) 
{ 
    String s = message.Text ; 
    data1 = System.Text.Encoding.ASCII.GetBytes(s); 
    sock.Send(data1); 
    Invoke((operation)effectuer, s); 


    } 



} 

}

мои проблемы являются: я не буду, что сервер или клиент не будут обязаны инициализировать приложение, но в два раза сделать это +, когда я делал сервер в качестве консольного приложения, которое он работает, но когда я меняю сервер на winforms, как будто приложение заблокировано !!!!!! Так что мне нужна помощь

ответ

0

Не запускайте цикл прослушивания/приема в Form1 ctor !!

Запустите прослушивание/прием в отдельной прослушивающей нити.

+0

i add this code: Thread lis = new Thread (listenning); lis.Start(); и я делаю прослушивание/принятие в этом потоке, но появляется исключение для неуравновешенности отправки, когда сокет отключается. –

+0

благодарит Мартина, что я решил эту проблему с потоками. Мне нужно теперь, как сделать свое приложение интерактивным: например, вы видели, как клиент должен инициализировать чат, я не буду, чтобы сервер и клиент могли инициализировать приложение, как обычный чат –

+0

любые предложения ????? –

Смежные вопросы