我现在作了一个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("服务器未启动或已关闭!");
}
}
}
还有  服务器上监听和接收数据、发送数据的代码 //*********  以下是利用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]);   // 将温度值发送给所有连接上的客户端
用form1 的closing事件也不行的,主要是没登陆时候关闭 Form_connect的时候也会触发form1的closing() 或closed()事件,触发以后就会给服务器发送信息,这时候发现没有了连接上,所以就会出现上述现象,但是我不知道怎么解决,昨天做到晚上12点也没搞定,今天12点以前就下岗了