我现在作了一个c/s模式的东西,要求能同时运行多个客户端,现在遇见一个问题,特别棘手,请指教!
private void Form1_Load(object sender, System.EventArgs e)
{
this.Visible = false;
 form_login = new Form_connect();
form_login.ShowDialog();
//退出确时处理
this.Visible = true;
try
{
tcpclient_socket = form_login.tcpclient_login;
stream = tcpclient_socket.GetStream();
  // 启动一个新的线程,用来响应从服务器发来的数据
Thread thread = new Thread(new ThreadStart(this.server_response));
thread.Start(); //客户端连接以后,首先给服务器发送一个CONN命令,以便服务器收到命令后将其加入,登录后及时地更新客户端的信息
string cmd = "CONN|";
    byte[] byte_conn = System.Text.Encoding.Unicode.GetBytes(cmd.ToCharArray());
stream.Write(byte_conn,0,byte_conn.Length);
}
catch(SocketException err)
{
MessageBox.Show(err.Message.ToString());
}
} }
private void Form1_Closed(object sender, System.EventArgs e)
{
string cmd = "EXIT|";
Byte[] outbyte= System.Text.Encoding.Unicode.GetBytes(cmd.ToCharArray());
stream.Write(outbyte,0,outbyte.Length);  // 如果在没有登录的情况下,关闭的时候就出错在这里,  未将对象引用设置到对象实例  我知道是因为 发出这条指令的时候,服务器就关闭了这个socket,但是不知道怎么改才能让关闭外面登录窗口的时候不出现这种错误。
                  }
   
请大家多多指教
private void Form_connect_Closed(object sender, System.EventArgs e)
{
this.Close();
}
private void button1_Click(object sender, System.EventArgs e)
{   //Form_connect的连接按钮
if(this.textBox1.Text.Trim().Length==0)
{
MessageBox.Show("请输入服务器地址!");
this.textBox1.Focus();
return;
}
try
{
this.tcpclient_login = new TcpClient();
tcpclient_login.Connect(IPAddress.Parse(this.textBox1.Text.Trim()),int.Parse(this.textBox2.Text.Trim()));
tcpconnected = true;
this.Close();
}
catch (SocketException ex)
{
if (ex.ErrorCode == 10060)
{
MessageBox.Show("操作超时,请重新连接。");
}
else
{
MessageBox.Show("服务器未启动或已关闭!");
}
}
}

解决方案 »

  1.   

    还有  服务器上监听和接收数据、发送数据的代码 //*********  以下是利用socket实现服务器和客户端通讯    ********************

    private void jianting()
    {
    try
    {
    IPHostEntry iphost = Dns.GetHostByName(Dns.GetHostName());
    IPAddress address = iphost.AddressList[0];
    ipend = new IPEndPoint(address,8000);
    socket = new Socket(ipend.AddressFamily,SocketType.Stream,ProtocolType.Tcp);
    listener = new TcpListener(ipend);

    listener.Start();
    string s =iphost.AddressList[0].ToString();
    thread = new Thread(new ThreadStart(starlisten));
    thread.Start();
    }
    catch
    {
    MessageBox.Show("启动服务器时产生错误");
    }
    }
    public void starlisten()
    { while(true)
    {
    try
    {
    Socket socket =listener.AcceptSocket();
    tmpsocket = socket;
    Thread thread = new Thread(new ThreadStart(accept));
    thread.Start();
    }
    catch
    {
    // MessageBox.Show(ex.Message.ToString(),"异常信息:");
    }
    }
    } //接收客户端的数据
    public void accept()
    {

    Socket clientsocket= tmpsocket;
    bool keepconnection = true;
    while(keepconnection)
    {   byte[] buff = new byte[1024];
    clientsocket.Receive(buff);
    string ipclient = clientsocket.RemoteEndPoint.ToString();
    Client _client = new Client(ipclient,clientsocket);
    string wendu = System.Text.Encoding.Unicode.GetString(buff);   // 接收客户端发送的温度值

    string[] wendu_jiexi = wendu.Split(new char[]{'|'});
    //判断用户的命令,如果是连接CONN,就将当前服务器温度值发送到该客户端,更新该客户端温度
    // 如果是退出 EXIT 命令,就将此客户端关闭掉,更新时候不发送命令
    if(wendu_jiexi[0] == "CONN")
    {
    allclients.Add(_client);
    SendToClient(_client,initial.ToString());
    }
    else if(wendu_jiexi[0] == "EXIT")
    {

    for (int i=0;i<allclients.Count;i++)
    {
    Client client_remove =(Client)allclients[i]; 
    if(client_remove.Name.CompareTo(ipclient.Trim())==0)
    {

    SendToClient(client_remove,"CLOSE|");
    allclients.RemoveAt(i);
    clientsocket.Close();
    }
    keepconnection = false;
    }
    }

    else
    {
    initial = float.Parse(wendu_jiexi[0].Trim());
    draw_shell(float.Parse(wendu_jiexi[0]));
    for(int i=0;i<allclients.Count;i++)
    {
    Client tmp= (Client)allclients[i];
    SendToClient(tmp,wendu_jiexi[0]);   // 将温度值发送给所有连接上的客户端
    }
    }
    }
    }
      

  2.   

    private void Form1_Closed(object sender, System.EventArgs e)这个时候,Form1和Form1的数据成员已经被Dispose()了]
    用Form1_Closing
      

  3.   

    也不行的,主要是没登陆时候关闭 Form_connect的时候也会触发form1的closing() 或closed()事件,触发以后就会给服务器发送信息,这时候发现没有了连接上,所以就会出现上述现象,但是我不知道怎么解决,昨天做到晚上12点也没搞定