二话不说,大家先看一下我服务端添加的引用

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using commands;


注意一下,这里的最后一个引用commands,与客户端的commands必须是同一个dll,同样的代码编译出来的文件都不行。这是为什么

捏。试想一下,你用一个规则去序列化一个对象,然后用另一个规则进行反序列化,得到的对象不会是原来的对象了吧。

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

发信息,或者转发一个客户端的信息给另一个或多个客户端,都是小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)
{
//发送失败
}
}

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

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

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

http://files.cnblogs.com/salty/tcp.rar



转载于:https://www.cnblogs.com/salty/archive/2011/04/01/2001798.html

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

  1. TCP通信的服务器端代码实现

    package com.learn.demo01.TCP;import java.io.IOException; import java.io.InputStream; import java.io. ...

  2. qt:tcp通信工具(Client篇)

    1.说明 使用qt写一个类似网上常见的网络调试工具.此篇为Client端.下一遍再写Server端. 2.基本流程 Client端相对简单:创建QTcpSocket对象,为对象的readyRead,e ...

  3. python写tcp通信程序_一个简单的基于TCP通信的服务器端与客户端程序

    一,概述 1,客户端: 创建客户端套接字对象 和服务端套接字建立连接 发送数据 接收数据 关闭客户端套接字 2,服务器端: 创建服务端端套接字对象 绑定端口号 设置监听 等待接受客户端的连接请求 接收 ...

  4. Java基础-9(缓冲流,转换流,序列化,打印流,TCP通信程序)

    51.缓冲流 概述 缓冲流,也叫高效流,是对4个基本的FileXxx 流的增强,所以也是4个流,按照数据类型分类: 字节缓冲流:BufferedInputStream,BufferedOutputSt ...

  5. 网络编程 UDP通信的过程 TCP通信过程 多线程文件上传

    网络概述 协议 在网络之间传出数据时需要按照指定的标准来传输,标准中规定了数据的格式.大小.传输的方式.传输速率.形成统一规范->按照规范开发的代码->协议(应用层.传输层.网络层.链路层 ...

  6. pyqt tcp通信_实验十 基于PyQt界面的TCP通信程序(一).doc_学小易找答案

    [简答题]请同学们找一个目前已学的知识点,出一个题目上传,不能是上课讲的程序和上机的题目 [简答题]请拍照模块五完成情况 [简答题]请拍照模块六完成情况 [计算题]书本80页,3-7;3-8;3-9; ...

  7. JAVA SE学习day_08:TCP通信、多线程(并联)

    为了解决在程序中不同客户端在同一服务端中都可以进行数据发送的情况,要使用多线程将其进行并联操作 一.多线程 线程可以并发执行多个代码片段,使得这些代码片段直接运行是互不干涉的: 创建线程有两种方式, ...

  8. JAVA SE学习day_07:异常处理、TCP通信

    一.异常中常见的方法 public static void main(String[] args) {System.out.println("程序开始了");try {String ...

  9. java tcp client断开重连_ESP8266_12 ESP8266客户端模式下的TCP通信

    上一节说了UDP,这一节就聊聊TCP,毕竟它俩经常同时出现.优缺点上一节也提了一下:安全性好,速度慢. 除了这两点,还有就是: TCP通信之前是需要建立连接的,如同打电话之前先拨号一样,而UDP无连接 ...

最新文章

  1. MongoDB数据库(二:高级操作)
  2. java swing 串口_ComTest 接收串口数据,并显示在文本框内,通过JavaSwing实现 Develop 265万源代码下载- www.pudn.com...
  3. 后勤管理系统_还在用人工进行宿舍后勤管理?超级适用的宿舍管理系统推荐
  4. linux内核工程导论,Linux内核工程导论——内存管理(3)
  5. 【操作系统/OS笔记11】并发执行的必要性,产生的问题,原子操作,为什么引入锁机制,面包购买的类比
  6. DEV控件ASPxTextBox设置ClientEnabled=false之后出现的问题
  7. 商城项目(一) -- 项目简介、基础搭建及前端部分
  8. mqtt客户端c语言开发
  9. UBNT设置AP模式注意事项
  10. Unity与UE4引擎源码内使用到的第三方库的比较
  11. 电子手轮控制步进电机程序手轮控制步进电机的頻率,脉冲数,内容包括欧姆龙plc程序,mcgs程序
  12. win7和win10哪个好用
  13. deepin更新linux内核,修改deepin启动内核
  14. Win7和Win10操作系统优劣对比,看完你就懂了!
  15. 线性代数学习-矩阵在电流计算中的应用
  16. 我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推。
  17. Qt通过QAxWidget来使用flash控件的问题
  18. math.pi java 是多少_math.pi 180 多少
  19. 大数据在地理信息系统的应用
  20. 三款telegram中群搜索机器人推荐

热门文章

  1. java class修改_【原创】Java基础之简单修改jar包中的class
  2. 没有流程的项目管理,都是无用功!
  3. 函数计算是如何工作的?
  4. java进出栈_JVM函数调用:Java出入栈
  5. mysql派生数据,在数据库中,应该何时存储派生数据?
  6. 用电脑发短信_丢掉你的手机数据线吧!用这个软件轻松在任何设备互传文件
  7. Charles之过滤信息
  8. 导购提成怎么算_only导购工资提成怎么算标准
  9. 固定上栏目html div,CSS_固定定位div(示例代码)
  10. java 注释 连接,java – 如何使用JPA注释创建连接表?