欢迎光临
我们一直在努力

C#.NET比较好用的tcp通信模板(服务器端篇)

好,下一步。这里是服务器端,每一个客户端连到服务器,都对应一个类的对象,然后把它们搞到一个列表里面。这样就方便进行操作了。在这个基础上,给客户端

发信息,或者转发一个客户端的信息给另一个或多个客户端,都是小case了。

下面就是客户端对应的类了。

public class InConnectuser
{
public TcpClient client { get; set; }
public BinaryReader br { get; set; }
public BinaryWriter bw { get; set; }

public Guid InUseID { get; set; }
public bool IfUserLogin=false;

public Entity.FeeRules obj_enFeeRules = new Entity.FeeRules();
public Entity.InUse obj_enInUse = new Entity.InUse();
public Entity.Computer obj_enComputer = new Entity.Computer();
public Entity.User obj_enUser = new Entity.User();

public InConnectUser(TcpClient client)
{
this.client = client;
NetworkStream networkstream
= client.GetStream();
br
= new BinaryReader(networkstream);
bw
= new BinaryWriter(networkstream);
}
public void Close()
{
br.Close();
bw.Close();
client.Close();
}
}

我这里是和网吧管理相关的,所以加了很多逻辑方面的东西在里面就不贴出来占篇幅了。大家如果把代码copy过去发现出错,就注释掉吧。

话不多,看到关键的地方都写在下面的注释里面。

//在线用户列表
private List<TcpHelper.InConnectUser> onlineUserList = new List<TcpHelper.InConnectUser>();
IPAddress localAddress;
private const int port = 51888;
private TcpListener myListener;

//开启服务器的按钮
private void button_StartServer_Click(object sender, EventArgs e)
{
myListener
= new TcpListener(localAddress, port);
myListener.Start();
label_status.Text
= "开启";

Thread myThread
= new Thread(ListenClientConnect);
myThread.Start();
//timer1.Enabled = true;
button_StartServer.Visible = false;
button_StopServer.Visible
= true;
}
//关闭服务器的按钮
private void button_StopServer_Click(object sender, EventArgs e)
{
label_status.Text
= "关闭";
//关闭服务器,移除list的用户。
//for (int i = onlineUserList.Count - 1; i >= 0; i--)
//{
// RemoveOnlineUser(onlineUserList[i]);
//}
myListener.Stop();
button_StartServer.Visible
= true;
button_StopServer.Visible
= false;
}

/// <summary>
/// 监听连接
/// </summary>
private void ListenClientConnect()
{
TcpClient newClient
= null;
while (true)
{
try
{
//停在此处监听连接,如果有新客户端连接就运行下去
newClient = myListener.AcceptTcpClient();
}
catch (Exception)
{

break;
}
InConnectUser user
= new InConnectUser(newClient);
Thread threadReceive
= new Thread(ReceiveData);
threadReceive.Start(user);
onlineUserList.Add(user);

}

}



/// <summary>
/// 收消息
/// </summary>
/// <param name="UserState"></param>
private void ReceiveData(object UserState)
{
InConnectUser user
= (InConnectUser)UserState;
TcpClient client
= user.client;
MessageInfo receiveObject;

while (true)
{
try
{
byte[] bytes = new byte[999];
//停在此处,networkstream流中有新数据则读出
int i = user.br.Read(bytes, 0, 999);
MemoryStream memory
= new MemoryStream(bytes);
BinaryFormatter format
= new BinaryFormatter();
receiveObject
= (MessageInfo)format.Deserialize(memory);
}
catch (Exception)
{
return;
}
switch (receiveObject.CommandsTypes)
{
case CommandsTypes.RequestHowLong:
//这里是我处理各种命令的方法,和这个博客的主题无关,就不贴出来了。
//处理好之后,就在这个方法里面发送回应给对应的客户端,所以一定要有参数user
// ManagerHowLong(user);
break;
case CommandsTypes.RequestUserLogin:
// ManagerUserLogin(user, receiveObject);
break;
case CommandsTypes.RequestUserlogout:
// ManagerUserLogout(user);
break;
case CommandsTypes.RequestLogout:
//注意这里是return,本意是如果客户端的连接要关闭, 就用跳出循环
//但是我的是网吧管理,不考虑这种情况,所以就未做处理
return;
case CommandsTypes.RequestModPWD:
// ManagerModPWD(user, receiveObject);
break;
case CommandsTypes.RequestMachineLogin:
// ManagerMachineLogin(user, receiveObject);
break;

case CommandsTypes.RequestTalk:
// ManagerTalk(receiveObject);
break;

default:
break;
}

}

}

/// <summary>
/// 发消息
/// </summary>
/// <param name="user">发给谁</param>
/// <param name="userSend">发送内容</param>
private void SendToClient(TcpHelper.InConnectUser user, MessageInfo userSend)
{
try
{
MemoryStream memory
= new MemoryStream();
BinaryFormatter format
= new BinaryFormatter();
format.Serialize(memory, userSend);
byte[] bytes = memory.ToArray();

user.bw.Write(bytes);
user.bw.Flush();

}
catch (Exception)
{
//发送失败
}
}

代码不多,但是也要花点小时间去看看条理才会清晰。

龙弟弟奉献,转载请注明出处谢谢。

另外我这里有根据这个做成的小聊天程序,大家如果有需要可以找我。

  • 海报
海报图正在生成中...
赞(0) 打赏
声明:
1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。
2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。
3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。
4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。
文章名称:《C#.NET比较好用的tcp通信模板(服务器端篇)》
文章链接:https://www.456zj.com/5606.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址