局域网有两个网关,一个是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?具体怎样实现?

解决方案 »

  1.   

    当然可以侦听两个IP了,多少个IP都可以侦听,关键看你代码如何写。
      

  2.   

    仅 供 参 考
    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
      

  3.   

    给你一个能运行的代码其中就包含了局域网通讯
    http://www.svnhost.cn/Project/Detail-299.shtml
      

  4.   


    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);
                }
            }
      

  5.   

    里边包含了三个项目,其中第二、三个项目为局域网聊天DEMO
    Tstring_Chess
    Tstring_Chess_Client
    Tstring_Chess_Server
      

  6.   

    kkun_3yue3 的代码也是侦听一个IP吧?