socket2

lunar0113 2007-09-06 12:26:15
using System;
using System.Collections;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Net.Sockets;
using System.Windows.Forms;
using System.Threading;
using System.Runtime.Serialization;
using System.Runtime.InteropServices;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Media;

namespace EasyChat
{
public partial class chat_frm : Form
{

#region 私有字段

/// <summary>
/// 当前用户名
/// </summary>
private string _username = null;

/// <summary>
/// 数据缓冲区大小
/// </summary>
private int _maxPacket = 2048;

/// <summary>
/// 用于接受消息的线程
/// </summary>
private Thread _receiveThread = null;

/// <summary>
/// 用于接受和发送的网络流,从登录窗体得到
/// </summary>
private NetworkStream _nws = null;

/// <summary>
/// 服务器套接字的字符串形式,从登录窗体得到
/// </summary>
private string _svrskt = null;

/// <summary>
/// 播放消息提示的播放器
/// </summary>
private SoundPlayer _sp1 = new SoundPlayer(Properties.Resources.msg);
private SoundPlayer _sp2 = new SoundPlayer(Properties.Resources.nudge);
/// <summary>
/// 指示是否最小化到托盘
/// </summary>
private bool _hideFlag = false;

#endregion


#region 聊天窗体构造函数

/// <summary>
/// 构造函数,得到登录窗体的一些信息
/// </summary>
/// <param name="userName">当前用户名</param>
/// <param name="nws">接受和发送消息的网络流</param>
/// <param name="svrskt">服务器套接字的字符串形式</param>
public chat_frm(string userName, NetworkStream nws, string svrskt)
{
InitializeComponent();
_username = userName;
_nws = nws;
_svrskt = svrskt;
}

#endregion


#region 聊天窗体的私有方法

/// <summary>
/// 保存聊天记录
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void save_btn_Click(object sender, EventArgs e)
{
DialogResult ret;
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "文本文件(*.txt)|*.txt";
sfd.AddExtension = true;
if ((ret = sfd.ShowDialog()) == DialogResult.OK)
{
chatrcd_rtb.SaveFile(sfd.FileName, RichTextBoxStreamType.PlainText);
}
}

/// <summary>
/// 清除聊天记录
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void clear_btn_Click(object sender, EventArgs e)
{
DialogResult ret;
ret = MessageBox.Show("确定清除吗?清除后不可恢复。",
"提示",
MessageBoxButtons.OKCancel,
MessageBoxIcon.Question,
MessageBoxDefaultButton.Button2);

if (ret == DialogResult.OK)
{
chatrcd_rtb.Clear();
}
}

/// <summary>
/// 向服务器发送离线请求,结束接受消息线程,清理资源并关闭父窗体和自身窗体
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void close_btn_Click(object sender, EventArgs e)
{
DialogResult ret;
ret = MessageBox.Show("确定与服务器断开连接吗?",
"退出",
MessageBoxButtons.OKCancel,
MessageBoxIcon.Question,
MessageBoxDefaultButton.Button2);

if (ret == DialogResult.OK)
{
//向服务器发送离线请求
_nws.Write(new byte[] { 0, 1 }, 0, 2);
//结束接受消息的线程
if (_receiveThread != null)
{
_receiveThread.Abort();
}
//关闭网络流
_nws.Close();
//关闭父窗口及自身
this.Owner.Close();
this.Close();
}
}

/// <summary>
/// 提取命令
/// 格式为两个一位整数拼接成的字符串。
/// 第一位为0表示客户机向服务器发送的命令,为1表示服务器向客户机发送的命令。
/// 第二位表示命令的含义,具体如下:
/// "11"-服务器要求客户机更新在线列表
/// "12"-服务器要求客户机做闪屏振动
/// default-接受用户消息或者系统消息的正文
/// </summary>
/// <param name="s">要解析的包含命令的byte数组,只提取前两个字节</param>
/// <returns>拼接成的命令</returns>
private string DecodingBytes(byte[] s)
{
return string.Concat(s[0].ToString(), s[1].ToString());
}

/// <summary>
/// 接受消息的线程执行体
/// </summary>
private void ReceiveMsg()
{
while (true)
{
byte[] packet = new byte[_maxPacket];
_nws.Read(packet, 0, packet.Length);
string _cmd = DecodingBytes(packet);

switch (_cmd)
{
/// "11"-服务器要求客户机更新在线列表
/// "12"-服务器要求客户机做闪屏振动
/// default-接受用户消息或者系统消息的正文
case "11":
{
byte[] onlineBuff = new byte[_maxPacket];
int byteCnt = _nws.Read(onlineBuff, 0, onlineBuff.Length);
IFormatter format = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
stream.Write(onlineBuff, 0, byteCnt);
stream.Position = 0;
StringCollection onlineList = (StringCollection)format.Deserialize(stream);
online_cb.Items.Clear();
foreach (string onliner in onlineList)
{
if (!onliner.Equals(_username))
{
online_cb.Items.Add(onliner);
}
}
break;
}
case "12":
{
Nudge();
break;
}
default:
{
string displaytxt = Encoding.Unicode.GetString(packet);
chatrcd_rtb.AppendText(displaytxt);
_sp1.Play();
break;
}
}
}
}
...全文
126 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuangfeiwan 2008-11-23
  • 打赏
  • 举报
回复
学习中~
sjm2003 2008-06-11
  • 打赏
  • 举报
回复
为什么看上去不是JAVA是C#啊,眼睛花了,那么像
sy_liuqian 2008-05-08
  • 打赏
  • 举报
回复
up
angelababa~ 2008-05-04
  • 打赏
  • 举报
回复
J#,C#,JAVA他们有什么不同啊
angelababa~ 2008-05-04
  • 打赏
  • 举报
回复
找是什么东西?难道这就是传说中的J#???
zhongguoren666 2007-10-17
  • 打赏
  • 举报
回复
你要干什么,出问题了?
277894613 2007-09-17
  • 打赏
  • 举报
回复
看过了
panzi667 2007-09-15
  • 打赏
  • 举报
回复
学习中~

1,979

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 其他语言讨论
社区管理员
  • 其他语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧