Tcp聊天室, TcpListener 监听两个IP

liulangonline 2008-06-03 04:50:44
局域网有两个网关,一个是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.2

Tcp聊天室的服务端放就放在这台服务器上.

问题来了,怎样才能使得局域网中不同网关的客户端进行通信?

TcpListener能否监听两个IP?

具体怎样实现?

...全文
322 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
liulangonline 2008-06-04
  • 打赏
  • 举报
回复
你那个象棋项目要加入的,不知怎么才可以看到代码
liulangonline 2008-06-04
  • 打赏
  • 举报
回复
你4楼的代码哦
kkun_3yue3 2008-06-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 liulangonline 的回复:]
kkun_3yue3 的代码也是侦听一个IP吧?
[/Quote]

liulangonline 2008-06-04
  • 打赏
  • 举报
回复
有没有其它解决方法啊?
liulangonline 2008-06-04
  • 打赏
  • 举报
回复
kkun_3yue3 的代码也是侦听一个IP吧?
qustwmt 2008-06-04
  • 打赏
  • 举报
回复
up
kkun_3yue3 2008-06-04
  • 打赏
  • 举报
回复
开源的,可能下载需要先注册网站会员吧,那是网站的设置,我只是该网站的一个使用者而已
sxmonsy 2008-06-04
  • 打赏
  • 举报
回复
过来学习下
liulangonline 2008-06-04
  • 打赏
  • 举报
回复
asdf
kkun_3yue3 2008-06-03
  • 打赏
  • 举报
回复
里边包含了三个项目,其中第二、三个项目为局域网聊天DEMO
Tstring_Chess
Tstring_Chess_Client
Tstring_Chess_Server
liulangonline 2008-06-03
  • 打赏
  • 举报
回复

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

kkun_3yue3 2008-06-03
  • 打赏
  • 举报
回复
给你一个能运行的代码。。。其中就包含了局域网通讯
http://www.svnhost.cn/Project/Detail-299.shtml
kkun_3yue3 2008-06-03
  • 打赏
  • 举报
回复
仅 供 参 考
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
liulangonline 2008-06-03
  • 打赏
  • 举报
回复
但问题是怎样实现啊,光说"当然可以"对我是没用的,因为我还是不知怎样侦听,能写上几行代码吗?
kkun_3yue3 2008-06-03
  • 打赏
  • 举报
回复
当然可以侦听两个IP了,多少个IP都可以侦听,关键看你代码如何写。
E_Sorl 2008-06-03
  • 打赏
  • 举报
回复
Mark

111,131

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧