局域网有两个网关,一个是192.168.0.1 , 一个是192.168.0.2
有一台服务器,这台服务器有两张网卡,一张网卡的IP是192.168.0.101 , 网关是192.168.0.1
另一张网卡的IP是192.168.0.102 , 网关是192.168.0.2Tcp聊天室的服务端放就放在这台服务器上.问题来了,怎样才能使得局域网中不同网关的客户端进行通信?TcpListener能否监听两个IP?具体怎样实现?
有一台服务器,这台服务器有两张网卡,一张网卡的IP是192.168.0.101 , 网关是192.168.0.1
另一张网卡的IP是192.168.0.102 , 网关是192.168.0.2Tcp聊天室的服务端放就放在这台服务器上.问题来了,怎样才能使得局域网中不同网关的客户端进行通信?TcpListener能否监听两个IP?具体怎样实现?
byte[] msgBuff = new byte[64];
Collection<UserInfo> collect = new Collection<UserInfo>(); public Chess_Server() {
InitializeComponent();
} #region 开启服务 //获取本机IP
private IPEndPoint GetIP() {
IPHostEntry ipHost = Dns.GetHostEntry(Dns.GetHostName());
IPAddress ipAddr = ipHost.AddressList[0];
return new IPEndPoint(ipAddr,8989);
}
#endregion #region 关闭服务
private void btnEndService_Click(object sender, EventArgs e) {
this.Close();
}
#endregion #region 开启服务
private void btnBeginService_Click(object sender, EventArgs e) {
try {
Socket listen = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//this.lbInfo.Items.Add(GetIP());
listen.Bind(GetIP());
listen.Listen(2);
listen.BeginAccept(new AsyncCallback(OnConnectRequest), listen);
}
catch(Exception){
return;
}
}
#endregion #region 侦听是否有新消息
Socket client;
public void OnConnectRequest(IAsyncResult ar) {
Socket listener = (Socket)ar.AsyncState;
client = listener.EndAccept(ar); //显示登录消息
this.Invoke(new Action(delegate { this.lbMessage.Items.Add(string.Format("Client {0}, joined", client.RemoteEndPoint)); }));
//添加到列表
this.Invoke(new Action(delegate { lbBlack.Items.Add(client.RemoteEndPoint); })); UserInfo info = new UserInfo();
info.UserSocket = client;
info.Ip = client.RemoteEndPoint.ToString();
if (collect.Count <= 2) {
collect.Add(info);
} client.BeginReceive(msgBuff, 0, msgBuff.Length, SocketFlags.None, new AsyncCallback(OnRecievedData), info);
DateTime now = DateTime.Now;
string strDateLine = now.ToString(); Byte[] byteDateLine = System.Text.Encoding.ASCII.GetBytes(strDateLine.ToCharArray());
client.Send(byteDateLine, byteDateLine.Length, 0);
listener.BeginAccept(new AsyncCallback(OnConnectRequest), listener);
}
#endregion #region 接收消息
public void OnRecievedData(IAsyncResult ar) {
UserInfo info = (UserInfo)ar.AsyncState;
Socket sock = info.UserSocket;
try {
int nBytesRec = sock.EndReceive(ar);
if (nBytesRec > 0) {
string sRecieved = Encoding.ASCII.GetString(msgBuff, 0, nBytesRec);
ProcessMessage(info, sRecieved);
SetupRecieveCallback(info);
} else {
this.Invoke(new Action(delegate { lbMessage.Items.Add(string.Format("disconnect from server {0}", sock.RemoteEndPoint)); }));
sock.Shutdown(SocketShutdown.Both);
sock.Close();
}
} catch (Exception exp) { //显示消息
this.Invoke(new Action(delegate { lbMessage.Items.Add(sock.RemoteEndPoint + "退出登录"); }));
this.Invoke(new Action(delegate { lbMessage.Items.Add(exp); })); //从列表删除
this.Invoke(new Action(delegate { lbBlack.Items.Remove(sock.RemoteEndPoint); })); //关闭连接
sock.Shutdown(SocketShutdown.Both);
sock.Close();
}
}
#endregion #region 注册消息接收回调
public void SetupRecieveCallback(UserInfo info) {
try {
AsyncCallback recieveData = new AsyncCallback(OnRecievedData);
info.UserSocket.BeginReceive(msgBuff, 0, msgBuff.Length, SocketFlags.None, recieveData, info);
} catch (Exception ex) {
this.Invoke(new Action(delegate { lbMessage.Items.Add(string.Format("Recieve callback setup failed! {0}", ex.Message)); }));
}
}
#endregion #region 处理消息
/// <summary>
/// UserName | black | X | Y | X | Y
/// </summary>
/// <param name="sock"></param>
/// <param name="msg"></param>
public void ProcessMessage(UserInfo info, string msg) {
string[] str = msg.Split('|');
if (str.Length >= 2) {
switch (str[1]) {
case "0":
this.Invoke(new Action(delegate {
if (!lbRed.Items.Contains(info.UserSocket.ToString())) {
this.lbRed.Items.Add(info.UserSocket.RemoteEndPoint.ToString());
}
}));
break;
case "1":
this.Invoke(new Action(delegate {
if (!this.lbBlack.Items.Contains(info.UserSocket.ToString())) {
this.lbBlack.Items.Add(info.UserSocket.RemoteEndPoint.ToString());
}
}));
break;
default:
break;
}
//info.UserName = str[0];//用户名
//info.Type = str[1];//用户角色
this.Invoke(new Action(delegate { this.lbMessage.Items.Add(msg); }));
this.Invoke(new Action(delegate { this.lbIp.Text = msg; })); string comm = msg;
byte[] b_comm = Encoding.Default.GetBytes(comm); foreach (UserInfo item in collect) {
item.UserSocket.Send(b_comm, b_comm.Length, SocketFlags.None);
}
}
} public void SendMessage(UserInfo info, string msg) {
string comm = msg;
byte[] b_comm = Encoding.Default.GetBytes(comm);
this.Invoke(new Action(delegate { lbMessage.Items.Add(comm); }));
foreach (UserInfo item in collect) {
if(item.UserSocket!=null
&& item.UserSocket != info.UserSocket
&& item.UserSocket.Connected) {
item.UserSocket.Send(b_comm, b_comm.Length, SocketFlags.None);
}
}
} #endregion
http://www.svnhost.cn/Project/Detail-299.shtml
IPAddress ipAddress=Dns.GetHostAddresses(Dns.GetHostName())[0];//IP
int port=1394;//端口
TcpListener tcpListener=new TcpListener(ipAddress,port);//TcpListener
tcpListener.Start();//开始监听System.Threading.Thread myThread = new System.Threading.Thread(new System.Threading.ThreadStart(SocketListen));
myThread.IsBackground = true;
this.bt_Start.Enabled = false;
myThread.Start();
private void SocketListen()
{
IsStart = true;
while (IsStart)
{
if (tcpServer.Pending())
{
mySocket = tcpServer.AcceptSocket();
ConnectClient con = new ConnectClient(this, mySocket);
//为每一个用户开启一个线程
System.Threading.Thread clientThread = new System.Threading.Thread(new System.Threading.ThreadStart(con.Client));
clientThread.IsBackground = true;
clientThread.Start();
}
System.Threading.Thread.Sleep(100);
}
}
Tstring_Chess
Tstring_Chess_Client
Tstring_Chess_Server