C#聊天程序服务端与客户端完整实例代码

本文所述为基于C#实现的多人聊天程序服务端与客户端完整代码。本实例省略了结构定义部分,服务端主要是逻辑处理部分代码,因此使用时需要完善一些窗体按钮之类的。

先看服务端代码如下:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace 多人聊天程序Server端
{
 /// <summary>
 /// 应用程序的主入口点。
 /// </summary>
 [STAThread]
 static void Main()
 {
  Application.Run(new Form1());
 }
 // 启动服务按钮
 private void button2_Click(object sender, System.EventArgs e)
 {
  try
  {
  // 必须填写端口
  if(txtPort.Text == "")
  {
   MessageBox.Show("请先填写服务端口号!", "提示");
   return;
  }
  Int32 port = Int32.Parse(txtPort.Text); // 获得端口号
  // 创建侦听的Socket
  mainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  IPEndPoint localEP = new IPEndPoint(IPAddress.Any, port);
  // 将 Socket 绑定到本地的终结点上
  mainSocket.Bind(localEP);
  // 开始侦听,最大的连接数是 5
  mainSocket.Listen(5);
  // 开始一个异步操作接受客户的连接请求
  mainSocket.BeginAccept(new AsyncCallback(OnClientConnect), null);
  // 启动服务按钮不可用,停止服务按钮可用
  UpdateControls(true);
  }
  catch(SocketException se)
  {
  MessageBox.Show(se.Message, "提示");
  }
 }
 // 更新“启动服务按钮”和“停止服务”按钮的状态:是否可用;
 // 注意:两个按钮的状态是互斥的
 private void UpdateControls(bool onServe)
 {
  button2.Enabled = !onServe;
  button3.Enabled = onServe;
  if(onServe)
  {
  status.Text = "已启动服务";
  }
  else
  {
  status.Text = "未启动服务";
  }
 }
 // 回调函数,当客户连接上时,将会被调用
 public void OnClientConnect(IAsyncResult asyn)
 {
  try
  {
  // 调用EndAccept完成BeginAccept异步调用,返回一个新的Socket处理与客户的通信
  Socket workerSocket = mainSocket.EndAccept(asyn);
  // 增加客户数目
  Interlocked.Increment(ref clientNum);
  // 将 workerSocket Socket加入到 ArrayList 中
  workerSocketList.Add(workerSocket);
  // 发送欢迎信息给连接上服务器的客户
  string msg = "欢迎客户 " + clientNum + " 登录服务器\n";
  SendWelcomeToClient(msg, clientNum);
  // 在线客户数目改变,必须更新客户列表
  UpdateClientListControl();
  // 连接上的客户接收数据
  WaitForData(workerSocket, clientNum);
  // 主 Socket 返回,继续等待其它的连接请求
  mainSocket.BeginAccept(new AsyncCallback(OnClientConnect), null);
  }
  catch(ObjectDisposedException)
  {
  System.Diagnostics.Debugger.Log(0,"1","\n OnClientConnection: Socket已经关闭!\n");
  }
  catch(SocketException se)
  {
  MessageBox.Show(se.Message, "提示");
  }
 }
 // 发送欢迎信息给客户
 void SendWelcomeToClient(string msg, int clientNumber)
 {
  // 用UTF8格式来将string信息转化成byte数组形式
  byte[] byData = System.Text.Encoding.UTF8.GetBytes(msg);
  // 获得客户clientNumber对应的Socket
  Socket workerSocket = (Socket)workerSocketList[clientNumber - 1];
  // 将数据发给客户
  workerSocket.Send(byData);
 }
 // 该类保存当前的socket,它的客户号还有发送给服务器的数据
 public class SocketPacket
 {
  public System.Net.Sockets.Socket currentSocket; // 当前的Socket
  public int clientNumber; // 客户号
  public byte[] dataBuffer = new byte[1024]; // 发给服务器的数据
  // 构造函数
  public SocketPacket(System.Net.Sockets.Socket socket, int clientNumber)
  {
  currentSocket = socket;
  this.clientNumber = clientNumber;
  }
 }
 // 开始等待客户发送数据
 public void WaitForData(System.Net.Sockets.Socket socket, int clientNumber)
 {
  try
  {
  if(pfnWorkerCallBack == null)
  {
   // 当连接上的客户有写的操作的时候,调用回调函数
   pfnWorkerCallBack = new AsyncCallback(OnDataReceived);
  }
  SocketPacket socketPacket = new SocketPacket(socket, clientNumber);
  socket.BeginReceive(socketPacket.dataBuffer, 0, socketPacket.dataBuffer.Length,
            SocketFlags.None, pfnWorkerCallBack, socketPacket);
  }
  catch(SocketException se)
  {
  MessageBox.Show (se.Message, "提示");
  }
 }
 // 当客户写数据时,调用以下方法
 public void OnDataReceived(IAsyncResult asyn)
 {
  SocketPacket socketData = (SocketPacket)asyn.AsyncState ;
  try
  {
  // EndReceive完成BeginReceive异步调用,返回客户写入流的字节数
  int iRx = socketData.currentSocket.EndReceive(asyn);
  // 加 1 是因为字符串以 '\0' 作为结束标志符
  char[] chars = new char[iRx + 1];
  // 对客户发来的信息进行UTF8解码,存入chars字符数组中
  System.Text.Decoder decoder = System.Text.Encoding.UTF8.GetDecoder();
  int charLen = decoder.GetChars(socketData.dataBuffer, 0, iRx, chars, 0);
  System.String szData = new System.String(chars);
  string msg = "客户 " + socketData.clientNumber + " 发的信息:" + szData;
  // 将客户发的数据加入到信息列表中
  AppendToRichEditControl(msg);
  // 等待数据
  WaitForData(socketData.currentSocket, socketData.clientNumber);
  }
  catch (ObjectDisposedException )
  {
  System.Diagnostics.Debugger.Log(0,"1","\nOnDataReceived: Socket已经关闭!\n");
  }
  catch(SocketException se)
  {
  if(se.ErrorCode == 10054)
  {
   // 将客户断开连接的信息写入信息列表中
   string msg = "客户 " + socketData.clientNumber + " 已断开了连接!" + "\n";
   AppendToRichEditControl(msg);
   // 移走已关闭的socket
   workerSocketList[socketData.clientNumber - 1] = null;
   // 更新客户列表
   UpdateClientListControl();
  }
  else
  {
   MessageBox.Show (se.Message, "提示");
  }
  }
 }
 // 更新信息列表,该方法可由主线程或其他工作线程所调用
 private void AppendToRichEditControl(string msg)
 {
  // 测试看是哪个线程调用了该方法
  if (InvokeRequired)
  {
  // We cannot update the GUI on this thread.
  // All GUI controls are to be updated by the main (GUI) thread.
  // Hence we will use the invoke method on the control which will
  // be called when the Main thread is free
  // Do UI update on UI thread
  object[] pList = {msg};
  txtRecvMsg.BeginInvoke(new UpdateRichEditCallback(OnUpdateRichEdit), pList);
  }
  else
  {
  // 创建该控件的主线程直接更新信息列表
  OnUpdateRichEdit(msg);
  }
 }
 // 添加信息到 txtRecvMsg 中
 private void OnUpdateRichEdit(string msg)
 {
 // txtRecvMsg.AppendText(msg);
  txtRecvMsg.Text = txtRecvMsg.Text + msg;
 }
 // 更新客户列表
 private void UpdateClientListControl()
 {
  if (InvokeRequired) // Is this called from a thread other than the one created
  // the control
  {
  clientList.BeginInvoke(new UpdateClientListCallback(UpdateClientList), null);
  }
  else
  {
  // 创建该控件的主线程直接更新信息列表
  UpdateClientList();
  }
 }
 // 更新客户列表
 void UpdateClientList()
 {
  clientList.Items.Clear(); // 清空客户列表
  for(int i = 0; i < workerSocketList.Count; i++)
  {
  // 加1,是因为数组从下标0开始,而我们的客户标号是从1开始
  string clientKey = Convert.ToString(i + 1);
  Socket workerSocket = (Socket)workerSocketList[i];
  if(workerSocket != null)
  {
   // 将连接着服务器的客户添加到客户列表中
   if(workerSocket.Connected)
   {
   clientList.Items.Add(clientKey);
   }
  }
  }
 }
 // 停止服务按钮
 private void button3_Click(object sender, System.EventArgs e)
 {
  CloseSockets();
  UpdateControls(false);
  // 更新客户列表
  UpdateClientListControl();
 }
 // 发送信息按钮
 private void button1_Click(object sender, System.EventArgs e)
 {
  // 如果在线客户列表不为空,则允许发送信息
  if (clientList.Items.Count != 0 )
  {
  try
  {
   string msg = txtSendMsg.Text;
   msg = "服务器信息: " + msg + "\n";
   byte[] byData = System.Text.Encoding.UTF8.GetBytes(msg);
   Socket workerSocket = null;
   for(int i = 0; i < workerSocketList.Count; i++)
   {
   workerSocket = (Socket)workerSocketList[i];
   if(workerSocket!= null)
   {
    // 发给所有连接上服务器的客户
    if(workerSocket.Connected)
    {
    workerSocket.Send(byData);
    }
   }
   }
  }
  catch(SocketException se)
  {
   MessageBox.Show(se.Message, "提示");
  }
  }
  else
  {
  MessageBox.Show("没有在线客户,不能发送信息!", "提示");
  }
 }
 // 清空信息按钮
 private void button4_Click(object sender, System.EventArgs e)
 {
  txtRecvMsg.Clear(); // 清空从客户发来的信息
 }
 // 关闭窗体按钮
 private void button5_Click(object sender, System.EventArgs e)
 {
  CloseSockets();
  Close();
 }
 // 关闭Socket
 void CloseSockets()
 {
  // 关闭主Socket
  if(mainSocket != null)
  {
  mainSocket.Close();
  }
  Socket workerSocket = null;
  // 关闭客户 Socket 数组
  for(int i = 0; i < workerSocketList.Count; i++)
  {
  workerSocket = (Socket)workerSocketList[i];
  if(workerSocket != null)
  {
   workerSocket.Close();
   workerSocket = null;
  }
  }
 }
 private void Form1_Load(object sender, System.EventArgs e)
 {
  try
  {
  // 获得本机的IP地址
  txtIP.Text = Dns.Resolve(Dns.GetHostName()).AddressList[0].ToString();
  // 启动时,启动服务按钮可用,停止服务按钮不可用
  UpdateControls(false);
  }
  catch(Exception exc)
  {
  MessageBox.Show(exc.Message, "提示");
  }
 }
 }
}

客户端主要实现接收来自服务端返回的消息、实现发送消息的操作界面,创建Socket实例,得到服务器的IP地址,更新控件,连接和断开等,具体代码如下:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Net;
using System.Net.Sockets;
namespace 多人聊天程序Client端
{
 public class Form1 : System.Windows.Forms.Form
 {
 private System.Windows.Forms.Label label1;
 private System.Windows.Forms.TextBox txtIP;
 private System.Windows.Forms.Label label2;
 private System.Windows.Forms.Label label3;
 private System.Windows.Forms.RichTextBox txtSendMsg;
 private System.Windows.Forms.Label label4;
 private System.Windows.Forms.Button button1;
 private System.Windows.Forms.Button button2;
 private System.Windows.Forms.Button button3;
 private System.Windows.Forms.Button button4;
 private System.Windows.Forms.RichTextBox txtRecvMsg;
 private System.Windows.Forms.TextBox txtPort;
 private System.Windows.Forms.Button button5;
 private System.ComponentModel.Container components = null;
 byte[] m_dataBuffer = new byte[10];
 IAsyncResult result;
 public AsyncCallback pfnCallBack ;
 private System.Windows.Forms.Label status;
 private System.Windows.Forms.Label label5;
 public Socket clientSocket;
 public Form1()
 {
  InitializeComponent();
 }
 private void InitializeComponent()
 {
  this.label1 = new System.Windows.Forms.Label();
  this.txtIP = new System.Windows.Forms.TextBox();
  this.label2 = new System.Windows.Forms.Label();
  this.txtPort = new System.Windows.Forms.TextBox();
  this.label3 = new System.Windows.Forms.Label();
  this.txtSendMsg = new System.Windows.Forms.RichTextBox();
  this.label4 = new System.Windows.Forms.Label();
  this.status = new System.Windows.Forms.Label();
  this.txtRecvMsg = new System.Windows.Forms.RichTextBox();
  this.button1 = new System.Windows.Forms.Button();
  this.button2 = new System.Windows.Forms.Button();
  this.button3 = new System.Windows.Forms.Button();
  this.button4 = new System.Windows.Forms.Button();
  this.label5 = new System.Windows.Forms.Label();
  this.button5 = new System.Windows.Forms.Button();
  this.SuspendLayout();
  // label1
  this.label1.AutoSize = true;
  this.label1.Location = new System.Drawing.Point(16, 24);
  this.label1.Name = "label1";
  this.label1.Size = new System.Drawing.Size(60, 17);
  this.label1.TabIndex = 0;
  this.label1.Text = "服务器IP:";
  // txtIP
  this.txtIP.Location = new System.Drawing.Point(80, 24);
  this.txtIP.Name = "txtIP";
  this.txtIP.Size = new System.Drawing.Size(160, 21);
  this.txtIP.TabIndex = 1;
  this.txtIP.Text = "";
  // label2
  this.label2.AutoSize = true;
  this.label2.Location = new System.Drawing.Point(16, 56);
  this.label2.Name = "label2";
  this.label2.Size = new System.Drawing.Size(35, 17);
  this.label2.TabIndex = 2;
  this.label2.Text = "端口:";
  // txtPort
  this.txtPort.Location = new System.Drawing.Point(80, 56);
  this.txtPort.Name = "txtPort";
  this.txtPort.Size = new System.Drawing.Size(40, 21);
  this.txtPort.TabIndex = 3;
  this.txtPort.Text = "";
  // label3
  this.label3.AutoSize = true;
  this.label3.Location = new System.Drawing.Point(16, 96);
  this.label3.Name = "label3";
  this.label3.Size = new System.Drawing.Size(110, 17);
  this.label3.TabIndex = 4;
  this.label3.Text = "发送信息给服务器:";
  // txtSendMsg
  this.txtSendMsg.Location = new System.Drawing.Point(16, 120);
  this.txtSendMsg.Name = "txtSendMsg";
  this.txtSendMsg.Size = new System.Drawing.Size(224, 88);
  this.txtSendMsg.TabIndex = 5;
  this.txtSendMsg.Text = "";
  // label4
  this.label4.AutoSize = true;
  this.label4.Location = new System.Drawing.Point(16, 248);
  this.label4.Name = "label4";
  this.label4.Size = new System.Drawing.Size(60, 17);
  this.label4.TabIndex = 6;
  this.label4.Text = "连接状态:";
  // status
  this.status.Location = new System.Drawing.Point(80, 248);
  this.status.Name = "status";
  this.status.Size = new System.Drawing.Size(192, 23);
  this.status.TabIndex = 7;
  // txtRecvMsg
  this.txtRecvMsg.Location = new System.Drawing.Point(264, 80);
  this.txtRecvMsg.Name = "txtRecvMsg";
  this.txtRecvMsg.ReadOnly = true;
  this.txtRecvMsg.Size = new System.Drawing.Size(224, 144);
  this.txtRecvMsg.TabIndex = 8;
  this.txtRecvMsg.Text = "";
  // button1
  this.button1.Location = new System.Drawing.Point(280, 16);
  this.button1.Name = "button1";
  this.button1.Size = new System.Drawing.Size(88, 32);
  this.button1.TabIndex = 9;
  this.button1.Text = "连接";
  this.button1.Click += new System.EventHandler(this.button1_Click);
  // button2
  this.button2.Location = new System.Drawing.Point(384, 16);
  this.button2.Name = "button2";
  this.button2.Size = new System.Drawing.Size(88, 32);
  this.button2.TabIndex = 10;
  this.button2.Text = "断开";
  this.button2.Click += new System.EventHandler(this.button2_Click);
  // button3
  this.button3.Location = new System.Drawing.Point(280, 232);
  this.button3.Name = "button3";
  this.button3.Size = new System.Drawing.Size(88, 32);
  this.button3.TabIndex = 11;
  this.button3.Text = "清空信息";
  this.button3.Click += new System.EventHandler(this.button3_Click);
  // button4
  this.button4.Location = new System.Drawing.Point(384, 232);
  this.button4.Name = "button4";
  this.button4.Size = new System.Drawing.Size(88, 32);
  this.button4.TabIndex = 12;
  this.button4.Text = "关闭";
  this.button4.Click += new System.EventHandler(this.button4_Click);
  // label5
  this.label5.AutoSize = true;
  this.label5.Location = new System.Drawing.Point(264, 64);
  this.label5.Name = "label5";
  this.label5.Size = new System.Drawing.Size(134, 17);
  this.label5.TabIndex = 13;
  this.label5.Text = "收到服务器发来的信息:";
  // button5
  this.button5.Location = new System.Drawing.Point(16, 208);
  this.button5.Name = "button5";
  this.button5.Size = new System.Drawing.Size(224, 32);
  this.button5.TabIndex = 14;
  this.button5.Text = "发送信息";
  this.button5.Click += new System.EventHandler(this.button5_Click);
  // Form1
  this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
  this.ClientSize = new System.Drawing.Size(512, 277);
  this.Controls.Add(this.button5);
  this.Controls.Add(this.label5);
  this.Controls.Add(this.button4);
  this.Controls.Add(this.button3);
  this.Controls.Add(this.button2);
  this.Controls.Add(this.button1);
  this.Controls.Add(this.txtRecvMsg);
  this.Controls.Add(this.status);
  this.Controls.Add(this.label4);
  this.Controls.Add(this.txtSendMsg);
  this.Controls.Add(this.label3);
  this.Controls.Add(this.txtPort);
  this.Controls.Add(this.label2);
  this.Controls.Add(this.txtIP);
  this.Controls.Add(this.label1);
  this.Name = "Form1";
  this.Text = "多人聊天程序Client端";
  this.Load += new System.EventHandler(this.Form1_Load);
  this.ResumeLayout(false);
 }
 #endregion
 [STAThread]
 static void Main()
 {
  Application.Run(new Form1());
 }
 // 连接按钮
 private void button1_Click(object sender, System.EventArgs e)
 {
  // IP地址和端口号不能为空
  if(txtIP.Text == "" || txtPort.Text == "")
  {
  MessageBox.Show("请先完整填写服务器IP地址和端口号!", "提示");
  return;
  }
  try
  {
  // 创建Socket实例
  clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  // 得到服务器的IP地址
  IPAddress ipAddress = IPAddress.Parse(txtIP.Text);
  Int32 port = Int32.Parse(txtPort.Text);
  // 创建远程终结点
  IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);
  // 连接到远程服务器
  clientSocket.Connect(remoteEP);
  if(clientSocket.Connected)
  {
   UpdateControls(true);
   WaitForData(); // 异步等待数据
  }
  }
  catch(SocketException se)
  {
  MessageBox.Show (se.Message, "提示");
  UpdateControls(false);
  }
 }
 // 等待数据
 public void WaitForData()
 {
  try
  {
  if(pfnCallBack == null)
  {
   // 当连接上的客户有写的操作的时候,调用回调函数
   pfnCallBack = new AsyncCallback(OnDataReceived);
  }
  SocketPacket socketPacket = new SocketPacket();
  socketPacket.thisSocket = clientSocket;
  result = clientSocket.BeginReceive(socketPacket.dataBuffer, 0, socketPacket.dataBuffer.Length,
   SocketFlags.None, pfnCallBack, socketPacket);
  }
  catch(SocketException se)
  {
  MessageBox.Show(se.Message, "提示");
  }
 }
 // 该类保存Socket以及发送给服务器的数据
 public class SocketPacket
 {
  public System.Net.Sockets.Socket thisSocket;
  public byte[] dataBuffer = new byte[1024]; // 发给服务器的数据
 }
 // 接收数据
 public void OnDataReceived(IAsyncResult asyn)
 {
  try
  {
  SocketPacket theSockId = (SocketPacket)asyn.AsyncState ;
  // EndReceive完成BeginReceive异步调用,返回服务器写入流的字节数
  int iRx = theSockId.thisSocket.EndReceive(asyn);
  // 加 1 是因为字符串以 '\0' 作为结束标志符
  char[] chars = new char[iRx + 1];
  // 用UTF8格式来将string信息转化成byte数组形式
  System.Text.Decoder decoder = System.Text.Encoding.UTF8.GetDecoder();
  int charLen = decoder.GetChars(theSockId.dataBuffer, 0, iRx, chars, 0);
  System.String szData = new System.String(chars);
  // 将收到的信息显示在信息列表中
  txtRecvMsg.Text = txtRecvMsg.Text + szData;
  // 等待数据
  WaitForData();
  }
  catch (ObjectDisposedException)
  {
  System.Diagnostics.Debugger.Log(0,"1","\nOnDataReceived: Socket已经关闭!\n");
  }
  catch(SocketException se)
  {
  if(se.ErrorCode == 10054)
  {
   string msg = "服务器" + "停止服务!" + "\n";
   txtRecvMsg.Text = txtRecvMsg.Text + msg;
   clientSocket.Close();
   clientSocket = null;
   UpdateControls(false);
  }
  else
  {
   MessageBox.Show(se.Message, "提示");
  }
  }
 }
 // 更新控件。连接和断开(发送信息)按钮的状态是互斥的
 private void UpdateControls(bool connected)
 {
  button1.Enabled = !connected;
  button2.Enabled = connected;
  button5.Enabled = connected;
  if(connected)
  {
  status.Text = "已连接";
  }
  else
  {
  status.Text = "无连接";
  }
 }
 // 断开按钮
 private void button2_Click(object sender, System.EventArgs e)
 {
  // 关闭Socket
  if(clientSocket != null)
  {
  clientSocket.Close();
  clientSocket = null;
  UpdateControls(false);
  }
 }
 // 发送信息按钮
 private void button5_Click(object sender, System.EventArgs e)
 {
  try
  {
  // 如果客户与服务器有连接,则允许发送信息
  if(clientSocket.Connected)
  {
   string msg = txtSendMsg.Text + "\n";
   // 用UTF8格式来将string信息转化成byte数组形式
   byte[] byData = System.Text.Encoding.UTF8.GetBytes(msg);
   if(clientSocket != null)
   {
   // 发送数据
   clientSocket.Send(byData);
   }
  }
  }
  catch(Exception se)
  {
  MessageBox.Show(se.Message, "提示");
  }
 }
 // 清空按钮
 private void button3_Click(object sender, System.EventArgs e)
 {
  txtRecvMsg.Clear(); // 清空信息列表
 }
 // 关闭按钮
 private void button4_Click(object sender, System.EventArgs e)
 {
  // 关闭Socket
  if(clientSocket != null)
  {
  clientSocket.Close();
  clientSocket = null;
  }
  Close(); // 关闭窗体
 }
 private void Form1_Load(object sender, System.EventArgs e)
 {
  UpdateControls(false); // 初始化时,只有连接按钮可用
 }
 }
}
(0)

相关推荐

  • 基于c#用Socket做一个局域网聊天工具

    程序设计成为简单的服务端和客户端之间的通信, 但通过一些方法可以将这两者进行统一起来, 让服务端也成为客户端, 让客户端也成为服务端, 使它们之间可以互相随时不间断的通信. 考虑到实现最原始的服务端和客户端之间的通信所需要的步骤对于写这样的程序是很有帮助的. 作为服务端, 要声明一个Socket A并绑定(Bind)某一个IP+这个IP指定的通信端口, 比如这个是127.0.0.1:9050, 然后开始监听(Listen), Listen可以监听来自多个IP传过来的连接请求, 具体可以同时连接几

  • C#制作简单的多人在线即时交流聊天室

    实现网页版的在线聊天室的方法有很多,在没有来到HTML5之前,常见的有:定时轮询.长连接+长轮询.基于第三方插件(如FLASH的Socket),而如果是HTML5,则比较简单,可以直接使用WebSocket,当然HTML5目前在PC端并没有被所有浏览器支持,所以我的这个聊天室仍是基于长连接+长轮询+原生的JS及AJAX实现的多人在线即时交流聊天室,这个聊天室其实是我上周周末完成的,功能简单,可能有些不足,但可以满足在线即时聊天需求,分享也是给大家提供一个思路,大家可以基于此来实现更好的在线即时聊

  • c#多线程网络聊天程序代码分享(服务器端和客户端)

    XuLIeHua类库 复制代码 代码如下: using System;using System.Collections;  using System.Collections.Generic;using System.Threading;  using System.Runtime.Serialization;using System.Runtime.Serialization.Formatters.Binary;using System.Text;using System.IO;using Sy

  • c#实现多线程局域网聊天系统

    觉得好有点帮助就顶一下啦. socke编程,支持多客户端,多线程操作避免界面卡死. 开启socket private void button1_Click(object sender, EventArgs e) { try { int port = int.Parse(txt_port.Text); string host = txt_ip.Text; //创建终结点 IPAddress ip = IPAddress.Parse(host); IPEndPoint ipe = new IPEnd

  • C#基于UDP实现的P2P语音聊天工具

    语音获取 要想发送语音信息,首先得获取语音,这里有几种方法,一种是使用DirectX的DirectXsound来录音,我为了简便使用一个开源的插件NAudio来实现语音录取. 在项目中引用NAudio.dll //------------------录音相关----------------------------- private IWaveIn waveIn; private WaveFileWriter writer; private void LoadWasapiDevicesCombo(

  • C#实现简单聊天程序的方法

    本文实例讲述了C#简单聊天程序实现方法.分享给大家供大家参考.具体如下: 假如有服务器端程序,ChatServer和客户端程序ChatClient.实现客户端向服务器端发送信息的简单功能. 运行步骤, 1.先是服务器端start listen, 2.然后客户端connect. 3.客户端发送消息   只要服务器端start listen了,然后客户端也connect了.这样建立起连接后.接受发送信息就方便了,只要用writer,reader去操作NetworkStream   服务器ChatSe

  • C#基于Windows服务的聊天程序(1)

    本文将演示怎么通过C#开发部署一个Windows服务,该服务提供各客户端的信息通讯,适用于局域网.采用TCP协议,单一服务器连接模式为一对多:多台服务器的情况下,当客户端连接数超过预设值时可自动进行负载转移,当然也可手动切换服务器,这种场景在实际项目中应用广泛. 简单的消息则通过服务器转发,文件类的消息则让客户端自己建立连接进行传输.后续功能将慢慢完善. 自定义协议: 1.新建Windows服务项目 2.修改配置文件添加 <appSettings> <add key="maxQ

  • 分享一个C#编写简单的聊天程序(详细介绍)

    引言 这是一篇基于Socket进行网络编程的入门文章,我对于网络编程的学习并不够深入,这篇文章是对于自己知识的一个巩固,同时希望能为初学的朋友提供一点参考.文章大体分为四个部分:程序的分析与设计.C#网络编程基础(篇外篇).聊天程序的实现模式.程序实现. 程序的分析与设计 1.明确程序功能 如果大家现在已经参加了工作,你的经理或者老板告诉你,"小王,我需要你开发一个聊天程序".那么接下来该怎么做呢?你是不是在脑子里有个雏形,然后就直接打开VS2005开始设计窗体,编写代码了呢?在开始之

  • C#聊天程序服务端与客户端完整实例代码

    本文所述为基于C#实现的多人聊天程序服务端与客户端完整代码.本实例省略了结构定义部分,服务端主要是逻辑处理部分代码,因此使用时需要完善一些窗体按钮之类的. 先看服务端代码如下: using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Net; using

  • Golang实现的聊天程序服务端和客户端代码分享

    实现逻辑 1.Golang 版本  1.3 2.实现原理: 1.主进程建立TCP监听服务,并且初始化一个变量 talkChan := make(map[int]chan string) 2.当主进程ACCEPT连接请求后,利用go 启动一个协程A去维持和客户端的连接,把taokChan带入到协程里 3.和客户端建立连接的协程A,发送消息给客户端,使其发送自己的用户信息. 4.协程A在收到客户端发送的用户信息后,建立一个此用户对应的管道 talkChan[uid] = make(chan stri

  • Java实现断点下载服务端与客户端的示例代码

    目录 原理 扩展-大文件快速下载思路 代码 服务端 客户端 最近在研究断点下载(下载续传)的功能,此功能需要服务端和客户端进行对接编写,本篇也是记录一下关于贴上关于实现服务端(Spring Boot)与客户端(Android)是如何实现下载续传功能 断点下载功能(下载续传)解释: 客户端由于突然性网络中断等原因,导致的下载失败,这个时候重新下载,可以继续从上次的地方进行下载,而不是重新下载 原理 首先,我们先说明了断点续传的功能,实际上的原理比较简单 客户端和服务端规定好一个规则,客户端传递一个

  • 详解基于java的Socket聊天程序——服务端(附demo)

    写在前面: 昨天在博客记录自己抽空写的一个Socket聊天程序的初始设计,那是这个程序的整体设计,为了完整性,今天把服务端的设计细化记录一下,首页贴出Socket聊天程序的服务端大体设计图,如下图: 功能说明: 服务端主要有两个操作,一是阻塞接收客户端的socket并做响应处理,二是检测客户端的心跳,如果客户端一段时间内没有发送心跳则移除该客户端,由Server创建ServerSocket,然后启动两个线程池去处理这两件事(newFixedThreadPool,newScheduledThrea

  • Java基于socket实现的客户端和服务端通信功能完整实例

    本文实例讲述了Java基于socket实现的客户端和服务端通信功能.分享给大家供大家参考,具体如下: 以下代码参考马士兵的聊天项目,先运行ChatServer.java实现端口监听,然后再运行ChatClient.java 客户端实例 ChatClient.java package socketDemo; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; public class Ch

  • python如何创建TCP服务端和客户端

    本文实例为大家分享了python创建tcp服务端和客户端的具体代码,供大家参考,具体内容如下 1.服务端server from socket import * from time import ctime HOST = '' PORT = 9999 BUFSIZ = 1024 ADDR = (HOST, PORT) tcpSerSock = socket(AF_INET, SOCK_STREAM) #创建套接字 tcpSerSock.bind(ADDR) #绑定IP和端口 tcpSerSock.

  • Nodejs之TCP服务端与客户端聊天程序详解

    TCP是用来计算机之间进行通信的,通过编写客户端和服务端聊天的代码,对于服务器与客户端的工作步骤有了深刻的了解,在这里根据了不起的Node.js一书来总结一下. TCP聊天程序需要用到Nodejs中的net模块,net模块是对TCP的封装,用于创建TCP服务端与客户端的. 服务器端 count:连接的客户端个数: users:用于存储客户端用户昵称的对象,对象值都为该客户端的Socket,Socket是一个接口,用于服务端与客户端通信. net.createServer:是用来创建TCP服务器,

  • Linux UDP服务端和客户端程序的实现

    1. 源码 UDP服务端: /** * @brief UDP服务端 * @author Mculover666 * @date 2020/04/15 */ #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include

  • Java聊天室之实现聊天室服务端功能

    目录 一.题目描述 二.解题思路 三.代码详解 多学一个知识点 一.题目描述 题目实现:实现聊天室服务器端功能.运行程序,服务端等待客户端连接,并显示客户端的连接信息. 二.解题思路 创建一个服务类:ChatServerFrame,继承JFrame类 定义一个Hashtable对象,用于存储登录用户的用户名和套接字对象. 定义createSocket()方法,用于创建服务器套接字对象.获得连接到服务器的客户端套接字对象以及启动线程对象对客户端发送的信息进行处理. 定义内部线程类ServerThr

  • WIN7下ORACLE10g服务端和客户端的安装图文教程

    win7下安装oracle10g服务端和客户端方法如下所示: 如何卸载Oracle 10g 软件环境: 1.Windows XP + Oracle 10g 2.Oracle安装路径为:d:\Oracle 实现方法: 1.开始->设置->控制面板->管理工具->服务停止所有Oracle服务; 2.开始->程序->Oracle – OraDb10g_home1>Oracle Installation Products-> Universal Installer

随机推荐