局域网之间通讯有很多种方法,比如可以用数据库存储的方式实现,还可以用udp来实现,这里是用tcp来实现的,用tcp来通讯的话可以说是有点麻烦的,因为要保持各个用户与服务器之间的连接,连接一断便不能通讯了,所以个人觉得这个地方比较麻烦;
要实现Socket通讯的话首先可以把它分成两个项目来区别,一个是服务器项目(Server),一个是客户端项目(Client)。
服务器项目的实现可以大致的分成 部分,1:创建一个总连接点,这个连接点负责与客户端的连接,我们不能把连接和通讯都引用到一个连接上,这样服务器会崩溃的,而每个用户都是独立的,所以我们要利用线程来创建一个新的通讯实例,这个连接和通讯各个用户之间都是互不干扰的了,还有一个要注意的就是跨线程调用控件的话是不行的,所以我们又要利用委托存放要调用的功能在用this.Invoke()的方法来跨线程引用控件,接下来就是具体实现响应通讯了;
客户端相对来说要更容易些,创建一个客户端连接实例,与远程服务器连接起来,然后就是大致的通讯实现功能了。
下面是我个人的实现代码和实现的心得,附加了大致的注释,实现了群聊,私聊等功能。
通讯类(Communication)
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Server 8 { 9 [Serializable] 10 public class Communication//通讯 11 { 12 public string Name { get; set; } 13 public string Ip { get; set; }//Ip地址 14 public string Port { get; set; }//端口号 15 public string Message { get; set; }//发送的消息 16 public int Types { get; set; } 17 //1代表聊天信息 2代表客户端人物信息 18 public bool IsFistLogin { get; set; } 19 public string ToEndPoint { get; set; } 20 } 21 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Net.Sockets; 5 using System.Text; 6 using System.Threading.Tasks; 7 8 namespace Server 9 { 10 [Serializable] 11 public class ServerReturnInfo 12 { 13 public Communication comm { get; set; }//通讯类 14 public Socket client { get; set; } 15 } 16 }
服务器类(Server)
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.IO; 7 using System.Linq; 8 using System.Net; 9 using System.Net.Sockets; 10 using System.Runtime.Serialization.Formatters.Binary; 11 using System.Text; 12 using System.Threading; 13 using System.Threading.Tasks; 14 using System.Windows.Forms; 15 16 namespace Server 17 { 18 public partial class forServer : Form 19 { 20 public forServer() 21 { 22 InitializeComponent(); 23 } 24 25 private delegate void ListDelegate(Communication comm); 26 private ListDelegate listInfo = null;//添加成员 27 private delegate void MessageDelegate(Communication comm); 28 private MessageDelegate MessageInfo = null;//添加消息 29 private delegate void SendDelegate(ServerReturnInfo sri); 30 private SendDelegate SendInfo = null; 31 private delegate void EndDelegate(Communication commun); 32 private EndDelegate EndInfo = null; 33 private List<Socket> socketList = new List<Socket>();//成员集合 34 private Socket server = null; 35 private void 开启服务ToolStripMenuItem_Click(object sender, EventArgs e) 36 { 37 int port = 0; 38 server =