我想知道的是,服务器和客户端建立连接以后传输晚数据,就要把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()
{
}
}
}
那么服务器怎么才能知道客户端是不是在线那。还有就是实时连接的程序是不是也要关闭连接,后在很短的时间里面在进行连接。
下便是我的代码,大家看看
欢迎批评。
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()
{
}
}
}
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
{
}
}
}
}
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
{ }
}
}
}
能具体一点吗?》
这样的例子,在网上没有一万也有八千。
你这个是最基本的Socket应用,首先1和2都要连接到服务端,这样服务端就可以给1和发送消息了。
我的QQ是:6570858。
不过我得先出去一下,接老婆下班!
呵呵………………
呆会儿再见!
然后我们要给每个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];