打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C#局域网通信
C#局域网通信

最近做了个局域网通信软件,主要是利用socket通信是基于TCP/IP的。主要功能是服务器可以向所有客户端发送消息,客户端也可以向服务器端发送消息。当然客户端也可向客户端发送消息,不过在这里因软件没有要求做,也没有添加该功能。如果实现该功能只需添加以下他们之间通信的协议即可。

服务器界面:

客户端界面:

服务器端主要代码:

服务器界面代码:

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
}
server s = new server();
IPAddress ip = null;
private void Form1_Load(object sender, EventArgs e)
{
ip = Dns.Resolve(Dns.GetHostName()).AddressList[0];
this.txtIP.Text = ip.ToString();
this.s.Started += new EventHandler(s_Started);
this.s.Logged += new EventHandler<UserLoggedEventArgs>(s_Logged);
this.s.PChated += new EventHandler<PublicChatEventArgs>(s_PChated);
}

//向所有客户端发送消息
private void btnSend_Click(object sender, EventArgs e)
{
string msg= "CHAT|服务器消息:|"+DateTime.Now.ToLongTimeString() + "|" +this.rtxtMsg.Text;
this.s.SendMessage(msg);
this.rtxt.AppendText("服务器消息:在" + Convert.ToDateTime(DateTime.Now.ToLongTimeString()) + " 通知:\n" + this.rtxtMsg.Text + "\n");
this.rtxtMsg.Text = "";
}

void s_PChated(object sender, PublicChatEventArgs e)
{
this.rtxt.AppendText(e.UserName+" 在"+e.Time+"说: \n"+e.Msg+"\n");
}

void s_Started(object sender, EventArgs e)
{
this.rtxt.AppendText("******************服务器已启动******************\n");
}

void s_Logged(object sender, UserLoggedEventArgs e)
{
this.rtxt.AppendText("客户端【 "+e.UserName + "】 已启动!\n");
this.lbxUserList.Items.Clear();
foreach (string item in e.UserList)
{
this.lbxUserList.Items.Add(item);
}
}

//开启服务
private void btnStart_Click(object sender, EventArgs e)
{

this.s.ip = ip;
this.s.port = int.Parse(this.txtPort.Text);
this.s.Start();
this.btnStart.Enabled = false;
}

private void rtxt_TextChanged(object sender, EventArgs e)
{
this.rtxt.Focus();
this.rtxtMsg.Focus();
}
}

服务器类

namespace Server
{
public class server
{
public event EventHandler Started;
public event EventHandler<UserLoggedEventArgs> Logged;
public event EventHandler<PublicChatEventArgs> PChated;

public server() { }

#region 字段定义
public IPAddress ip { get; set; }
public int port { get; set; }
Thread thread = null;
private TcpListener listener;
private Dictionary<string, Socket> userlist = new Dictionary<string, Socket>();
#endregion

//开启服务
public void Start()
{
this.thread = new Thread(new ThreadStart(this.Work));
this.listener = new TcpListener(this.ip, this.port);
this.listener.Start();
this.thread.Start();
if (this.Started != null)
{
this.Started(this, new EventArgs());
}
}

public void Work()
{
while (true)
{
Socket soket = this.listener.AcceptSocket();
Thread userThread = new Thread(
delegate()
{
ResponseClient(soket);
}
);
userThread.Start();
}

}

private void ResponseClient(Socket soket)
{
while (true)
{
byte[] buffer=new byte[1024*10];
soket.Receive(buffer);

string msg = Encoding.Unicode.GetString(buffer).TrimEnd('\0');
string[] tokens = msg.Split('|');
if (tokens[0]=="CONN")
{
if (this.userlist.ContainsKey(tokens[0]))
{
break;
}
else
{
this.userlist.Add(tokens[1], soket);
}
UserLoggedEventArgs e1 = new UserLoggedEventArgs();
e1.UserName = tokens[1];
e1.UserList = this.GetUserList();
//通知服务器界面
if (this.Logged!=null)
{
this.Logged(this,e1);
}
}

if (tokens[0]=="TS")
{
PublicChatEventArgs e1 = new PublicChatEventArgs();
e1.UserName = tokens[1];
e1.Time =Convert.ToDateTime(tokens[2]);
string message = "";
for (int i =3; i < tokens.Length; i++)
{
message += tokens[i];
}
e1.Msg = message;
if (this.PChated!=null)
{
this.PChated(this, e1);
}
}
}
}

//获取客户列表
private List<string> GetUserList()
{
List<string> list = new List<string>();
foreach (KeyValuePair<string,Socket> item in userlist)
{
list.Add(item.Key);
}
return list;
}

public void SendMessage( string message)
{
foreach (KeyValuePair<string,Socket> item in userlist)
{
byte[] buffer = Encoding.Unicode.GetBytes(message.ToCharArray());
item.Value.Send(buffer);
}
}
}
}

服务器端事件参数的定义:

namespace Server
{
public class UserLoggedEventArgs : EventArgs
{
public string UserName { get; set; }
public List<string> UserList { get; set; }
}

public class PublicChatEventArgs : EventArgs
{
public string UserName { get; set; }
public string Msg { get; set; }
public DateTime Time { get; set; }
public string Font { get; set; }
public string FontColor { get; set; }
public string FontSize { get; set; }

}
}

客户端主要代码:

客户端类

namespace ClientUI
{
public class ClientUI
{
public ClientUI() { }

public event EventHandler Started;
public event EventHandler<LoggedEventArgs> Logged;
public event EventHandler<PublciChatEventArgs> PChated;

public string clientName { get; set; }
public string msg { get; set; }
public IPAddress ip { get; set; }
public int port { get; set; }
TcpClient client = new TcpClient();
Stream stream;
Thread mainThread = null;

//连接服务器
public void Connect()
{
this.client.Connect(this.ip, this.port);
this.stream = this.client.GetStream();
this.clientName=Guid.NewGuid().ToString().Substring(0,10);
string message = "CONN|" + this.clientName;
this.SendMessage(message);

this.mainThread = new Thread(new ThreadStart(this.ResponseServer));
this.mainThread.Start();

if (this.Started!=null)
{
this.Started(this, new EventArgs());
}
}

public void ResponseServer()
{
while (true)
{
byte[] buffer = new byte[1024 * 10];
this.stream.Read(buffer, 0, buffer.Length);
string message = Encoding.Unicode.GetString(buffer).TrimEnd('\0');
string[] tokens = message.Split('|');

if (tokens[0] == "CHAT")
{
PublciChatEventArgs e1 = new PublciChatEventArgs();
e1.UserName = tokens[1];
e1.Time = Convert.ToDateTime(tokens[2]);
string msg = "";
for (int i = 3; i < tokens.Length; i++)
{
msg += tokens[i];
}
e1.Msg = msg;
if (this.PChated!=null)
{
this.PChated(this,e1);
}
}
}
}

public void ChartS(string message)
{
this.msg="TS|"+this.clientName+"|"+DateTime.Now.ToLongTimeString()+"|"+message;
this.SendMessage(msg);

}

private void SendMessage(string message)
{
byte[] buffer = Encoding.Unicode.GetBytes(message.ToCharArray());
this.stream.Write(buffer, 0, buffer.Length);
}




}
}

客户端参数的定义和服务器端一样。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
多线程Demo
asp.net控件开发基础(3)
使用C#轻松编写.Net组件
进一步接触C#委托与事件 - 51CTO.COM
C# 事件浅析
c# 事件 EventHandler
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服