我想知道的是,服务器和客户端建立连接以后传输晚数据,就要把TCP连接关闭,
那么服务器怎么才能知道客户端是不是在线那。还有就是实时连接的程序是不是也要关闭连接,后在很短的时间里面在进行连接。
下便是我的代码,大家看看
欢迎批评。
using System;
using System.IO;
using System.Text;  
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Net;  
namespace xuliehua
{
[Serializable]  
public struct NetMsg
{
public IPAddress  Fip;
public int        port;
public string   msg;
public IPAddress  JieIP;
}
[Serializable]  
public struct MsgSize
{
public int  Size;
}
public class XuLie
{
/// <summary>
/// 序列化
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static byte[] ObjToByte(object obj)
{
byte[] tmp = null;
MemoryStream   fs   =   new   MemoryStream();   
try
{
BinaryFormatter Xu = new BinaryFormatter(); 
Xu.Serialize(fs,obj);
tmp = fs.ToArray(); 
}
catch(Exception err)
{
throw err;
}
finally
{
fs.Close();
}
return tmp;
}
/// <summary>
/// 反列化
/// </summary>
/// <param name="tmp"></param>
/// <returns></returns>
public static object ByteToObj(byte[] tmp)
{
MemoryStream fs = null;
object obj = null;
try
{
fs = new MemoryStream(tmp);
fs.Position = 0;
BinaryFormatter Xu = new BinaryFormatter();
obj = Xu.Deserialize(fs);  
}
catch(Exception err)
{
throw err;
}
finally
{
fs.Close();
}
return obj;
}
public XuLie()
{

}
}
}

解决方案 »

  1.   

    protected System.Windows.Forms.Timer timer1;
    private TcpListener Clint;
    private System.Windows.Forms.TextBox textBox1;
    private System.Windows.Forms.ListBox listBox1;
    private ArrayList IpArr;
    private void Form1_Load(object sender, System.EventArgs e)
    {
    try
    {
    IpArr = new ArrayList(); 
    IPHostEntry TIP     = Dns.Resolve("192.168.110.75");
    IPAddress  pointIP  = TIP.AddressList[0];
           Clint   = new TcpListener(pointIP,9000);
    Clint.Start();
    timer1.Enabled = true; 
    }
    catch(Exception err)
    {
    MessageBox.Show(err.Message);   
    }
    }
    private void JieShou()
    {
    try
    {
    TcpClient Ke   = Clint.AcceptTcpClient();
    NetworkStream stream = Ke.GetStream();

    ArrayList arr = new ArrayList(); 
    byte[] tmp  = new byte[1024];
    MemoryStream money = new MemoryStream();
    if (stream.DataAvailable == true)
    {
    int Len = stream.Read(tmp,0,tmp.Length);
    while(Len > 0)
    {
    money.Write(tmp,0,Len);
    tmp = new byte[1024];
    Len = 0;
    if (stream.DataAvailable == true)
    {
    Len = stream.Read(tmp,0,tmp.Length);
    }
    }
    listBox1.Items.Add("接收到大小为:"+money.Length+" 的封包");   
    object obj = XuLie.ByteToObj(money.ToArray());  
    NetMsg msg =(NetMsg)obj;
    TcpClient Ke1 = new TcpClient(); 
    try
    {
    Ke1.Connect(msg.JieIP,msg.port);
    stream = Ke1.GetStream();
    tmp = money.ToArray();
    stream.Write(tmp,0,tmp.Length);    
    }
    catch(SocketException)
    {
    listBox1.Items.Add("不在线");  
    msg.msg = "对方不在线"; 
    tmp = null;
    tmp = XuLie.ObjToByte(msg);
    stream = Ke.GetStream();   
    stream.Write(tmp,0,tmp.Length);
    stream.Close();
    Ke1.Close();  
    Ke.Close();  
    return;
    }
    Ke1.Close();
    }
    stream.Close();

    Ke.Close(); 
    }
    catch(Exception err)
    {
    listBox1.Items.Add("错误描述:"+err.Message+"   "+ err.Source);
    }
    } private void timer1_Tick(object sender, System.EventArgs e)
    {
    try
    {
    if (Clint.Pending() == true)
    {
    Thread th = new Thread(new ThreadStart(JieShou));
    th.Start(); 
    }
    if (listBox1.Items.Count == 20)
    {
    listBox1.Items.Clear();   
    }
    }
    catch
    {
    }
    }
    }
    }
      

  2.   

    客户端private TcpListener server;
    private void Form1_Load(object sender, System.EventArgs e)
    {
    Thread th = new Thread(new ThreadStart(jie));
    th.Start(); 
    } private void button1_Click(object sender, System.EventArgs e)
    {

    }
    private void jie()
    {
    try
    {
    server = new TcpListener(Dns.Resolve(Dns.GetHostName()).AddressList[0],10000);
    server.Start(); 
    while(server != null)
    {
    if (server.Pending() ==true)
    {
    TcpClient col =  server.AcceptTcpClient();
    NetworkStream network = col.GetStream();
    MemoryStream money = new MemoryStream();
    byte[] tmp = new byte[1024];
    if (network.DataAvailable == true)
    {
    while(network.Read(tmp,0,tmp.Length)!=0)
    {
    money.Write(tmp,0,tmp.Length);  
    }

    xuliehua.NetMsg obj = (xuliehua.NetMsg)XuLie.ByteToObj(money.ToArray());  
    listBox1.Items.Add("发送者:"+obj.Fip.ToString());
    listBox1.Items.Add("内容:"+obj.msg);
    }
    network.Close();  
    col.Close(); 
    GC.Collect();
    }
    Thread.Sleep(200);  
    }
       
    }
    catch(Exception err)
    {
    MessageBox.Show(err.Message);   
    }
    }
    private void button2_Click(object sender, System.EventArgs e)
    {
    try
    {
    if (textBox1.Text == ""){return;}
    if (textBox2.Text == ""){textBox2.Text ="输入聊天内容";return;}
    if (textBox3.Text == ""){return;}
    IPHostEntry tip = Dns.Resolve(textBox1.Text);
    TcpClient cl = new TcpClient();
    cl.Connect(tip.AddressList[0],9000);
     
    NetworkStream stream = cl.GetStream(); NetMsg msg = new NetMsg();
    msg.Fip  = Dns.Resolve(Dns.GetHostName()).AddressList[0];  //自己的ip    
    msg.port = 10000;
    msg.msg  = textBox2.Text;  
    msg.JieIP = Dns.Resolve(textBox3.Text).AddressList[0];
    byte[] tmp = XuLie.ObjToByte(msg); 
    stream.Write(tmp,0,tmp.Length);
    Thread.Sleep(200);  
    cl.Close(); 
    }
    catch(Exception err)
    {
    MessageBox.Show(err.Message);  
    }
    } private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
    try
    {
    server = null;
    }
    catch
    {}
    } private void listBox1_DoubleClick(object sender, System.EventArgs e)
    {
    try
    {
    string ip = listBox1.SelectedItem.ToString();
    if (ip.Substring(0,4) == "发送者:")
    {
    textBox3.Text = ip.Substring(4,ip.Length-4);   
    }
    }
    catch
    { }
    }
    }
    }
      

  3.   

    fangbuge(窗外的雨) 
    能具体一点吗?》
      

  4.   

    TCP连接的话,建议长连接;若用短连接,不如用UDP。
      

  5.   

    TO:LZ
    这样的例子,在网上没有一万也有八千。
      

  6.   

    zhijun123(小海)   你首先得理解socket,他本身就可以实现长链接啊,你连接上不要断开,不就是长链接么。然后你所有的通讯都通过这个发,没有通讯的时候过半分钟就发一次心跳消息。
      

  7.   

    zhijun123(小海):
      你这个是最基本的Socket应用,首先1和2都要连接到服务端,这样服务端就可以给1和发送消息了。
      

  8.   

    为什么要找那个线程?直接找那个Socket对象发送不就完了!
      

  9.   

    那个SOCKET的对象有什么好方法保存下来
      

  10.   

    你加我QQ,我和你说:
    我的QQ是:6570858。
    不过我得先出去一下,接老婆下班!
    呵呵………………
    呆会儿再见!
      

  11.   

    我们先定义一个Hashtable,如果是2.0的就定义一个Dictionary<T, T>。
    然后我们要给每个Socket一个键值。再把Socket存到Hashtable里面。需要的时候就可以以键值取出我们要的Socket。
    如:public static Dictionary<int, Socket> s_socketList;Socket info=Listener.Accept();
    int id=GetId();//这个自己去写
    Public.s_userList.Add(id, info);在需要的时候就可以这样取出来:Socket info=s_socketList[id];
      

  12.   

    TcpClient.GetStream(),这个方法在别处调用了以后,是否还能在另外的地方调用。