基于C#Winform的简易聊天程序服务器端代码
using System.Threading;
using System.Net.Sockets;
using System.Net;
using System.IO;
public partial class FServer : Form
{
public FServer()
{
InitializeComponent();
//关闭对文本框的非法线程操作检查
TextBox.CheckForIllegalCrossThreadCalls = false;
}
//分别创建一个监听客户端的线程和套接字
Thread threadWatch = null;
Socket socketWatch = null;
private void btnServerConn_Click(object sender, EventArgs e)
{
//定义一个套接字用于监听客户端发来的信息 包含3个参数(IP4寻址协议,流式连接,TCP协议)
socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//发送信息 需要1个IP地址和端口号
IPAddress ipaddress = IPAddress.Parse(txtIP.Text); //获取文本框输入的IP地址
//将IP地址和端口号绑定到网络节点endpoint上
IPEndPoint endpoint = new IPEndPoint(ipaddress, int.Parse(txtPORT.Text)); //获取文本框上输入的端口号
//套接字点听绑定网络端点
socketWatch.Bind(endpoint);
//将套接字的监听队列长度设置为20
socketWatch.Listen(20);
//创建一个负责监听客户端的线程
threadWatch = new Thread(WatchConnecting);
//将窗体线程设置为与后台同步
threadWatch.IsBackground = true;
//启动线程
threadWatch.Start();
txtMsg.AppendText("服务器已经启动,开始监听客户端传来的信息!" + "\r\n");
}
//创建与客户端建立连接的套接字
Socket socConnection = null;
/// <summary>
/// 持续不断监听客户端发来的请求, 用于不断获取客户端发送过来的连续数据信息
/// </summary>
private void WatchConnecting()
{
while (true)
{
try
{
socConnection = socketWatch.Accept();
}
catch (Exception ex)
{
txtMsg.AppendText(ex.Message); //提示套接字监听异常
break;
}
txtMsg.AppendText("客户端连接成功,两端可以开始通信了...\r\n");
//创建通信线程
ParameterizedThreadStart pts = new ParameterizedThreadStart(ServerRecMsg);
Thread thr = new Thread(pts);
thr.IsBackground = true;
//启动线程
thr.Start(socConnection);
}
}
/// <summary>
/// 发送信息到客户端的方法
/// </summary>
/// <param name="sendMsg">发送的字符串信息</param>
private void ServerSendMsg(string sendMsg)
{
//将输入的字符串转换成 机器可以识别的字节数组
byte[] arrSendMsg = Encoding.UTF8.GetBytes(sendMsg);
//通过Socket的send方法将 字节数组发送出去
socConnection.Send(arrSendMsg);
txtMsg.AppendText("天之涯:" + GetCurrentTime() + "\r\n" + sendMsg + "\r\n");
}
string strSRecMsg = null;
/// <summary>
/// 接收客户端发来的信息
/// </summary>
/// <param name="socketClientPara">客户端套接字的委托对象</param>
private void ServerRecMsg(object socketClientPara)
{
Socket socketServer = socketClientPara as Socket;
while (true)
{
int length = 0;
//创建一个接收用的内存缓冲区 大小为10M字节数组
byte[] arrServerRecMsg = new byte[10 * 1024 * 1024];
try
{
//获取接收的数据,并存入内存缓冲区 返回一个字节数组的长度
length = socketServer.Receive(arrServerRecMsg);
}
catch (Exception ex)
{
txtMsg.AppendText("系统异常消息:" + ex.Message);
break;
}
//判断发送过来的数据是文件还是普通文字信息
if (arrServerRecMsg[0] == 0) //0为文字信息
{
//将字节数组 转换为人可以读懂的字符串
strSRecMsg = Encoding.UTF8.GetString(arrServerRecMsg, 1, length - 1);//真实有用的文本信息要比接收到的少1(标识符)
//将接收到的信息附加到文本框txtMsg上
txtMsg.AppendText("SoFlash:" + GetCurrentTime() + "\r\n" + strSRecMsg + "\r\n");
}
//如果发送过来的数据是文件
if (arrServerRecMsg[0] == 1)
{
SaveFile(arrServerRecMsg, length - 1);//同样实际文件长度需要-1(减去标识符)
}
}
}
//将信息发送到到客户端
private void btnSendMsg_Click(object sender, EventArgs e)
{
//调用发送信息的方法 并检查发送是否成功
ServerSendMsg(txtSendMsg.Text);
}
//快捷键 Enter 发送信息
private void txtSendMsg_KeyDown(object sender, KeyEventArgs e)
{
当光标位于输入文本框上的情况下 发送信息的热键为回车键Enter
if (e.KeyCode == Keys.Enter)
{
//则调用 服务器向客户端发送信息的方法
ServerSendMsg(txtSendMsg.Text);
}
}
/// <summary>
/// 保存接收文件的方法 包含一个字节数组参数 和 文件的长度
/// </summary>
/// <param name="arrFile">字节数组参数</param>
/// <param name="fileLength">文件的长度</param>
private void SaveFile(byte[] arrFile, int fileLength)
{
SaveFileDialog sfDialog = new SaveFileDialog();
//创建一个用于保存文件的对话框
sfDialog = new SaveFileDialog();
//获取文件名的后缀 比如文本文件后缀 .txt
string fileNameSuffix = strSRecMsg.Substring(strSRecMsg.LastIndexOf("."));
sfDialog.Filter = "(*" + fileNameSuffix + ")|*" + fileNameSuffix + ""; //文件类型
sfDialog.FileName = strSRecMsg; //文件名
//如果点击了对话框中的保存文件按钮
if (sfDialog.ShowDialog(this) == DialogResult.OK)
{
string savePath = sfDialog.FileName; //获取文件的全路径
//保存文件
FileStream fs = new FileStream(savePath, FileMode.Create);
//Write()方法需要传入3个参数,文件的字节数组,开始写入字节的索引位置以及字节数组的长度
fs.Write(arrFile, 1, fileLength);
string fName = savePath.Substring(savePath.LastIndexOf("\\") + 1); //文件名 不带路径
string fPath = savePath.Substring(0, savePath.LastIndexOf("\\")); //文件路径 不带文件名
txtMsg.AppendText("天之涯:" + GetCurrentTime() + "\r\n您成功接收了文件" + fName + "\r\n保存路径为:" + fPath + "\r\n");
}
}
/// <summary>
/// 获取当前系统时间
/// </summary>
/// <returns>当前系统时间</returns>
public DateTime GetCurrentTime()
{
DateTime currentTime = new DateTime();
currentTime = DateTime.Now;
return currentTime;
}
}
}
基于C#Winform的简易聊天程序服务器端(2)
最新推荐文章于 2023-02-17 13:27:23 发布