客户端界面:
//创建一个通信Socket
Socket socketSpeak = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
/// <summary>
/// 加载客户端
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{
//取消多线程检查
Control.CheckForIllegalCrossThreadCalls = false;
}
/// <summary>
/// 向聊天窗口显示信息
/// </summary>
/// <param name="str"></param>
private void ShowMsg(string str)
{
txtMsg.AppendText(str + "\r\n");
}
/// <summary>
/// 开始连接服务器
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnStart_Click(object sender, EventArgs e)
{
IPAddress IP;
IPEndPoint point;
try
{
//创建IP对像来存储服务器IP地址
IP = IPAddress.Parse(txtIP.Text);
}
catch
{
MessageBox.Show("请输入正确的IP地址");
return;
}
try
{
//创建一个网络端点对象来存储要连接的服务器网络端口与IP地址
point = new IPEndPoint(IP, Convert.ToInt32(txtDuan.Text));
}
catch
{
MessageBox.Show("请输入正确的网络端口");
return;
}
//连接服务器
socketSpeak.Connect(point);
ShowMsg("已连接上服务器...");
//添加新线程来接收信息
Thread resThread = new Thread(ResMsg);
resThread.IsBackground = true;
resThread.Start();
//清空IP端口信息
txtDuan.Text = "";
txtIP.Text = "";
}
/// <summary>
/// 开始不停的接收服务器发来的消息
/// </summary>
private void ResMsg()
{
while (true)
{
//创建一个缓冲区来接收服务器发来的消息
byte[] buffer = new byte[1024 * 1024 * 3];
int r = socketSpeak.Receive(buffer);
//获取第一位字节
int number = buffer[0];
if (number == 1)//对方发送的是文字信息
{
//将信息读取到聊天框中
ShowMsg(Encoding.Default.GetString(buffer, 1, r - 1)+"\r\n");
}
else if (number == 2)//对方发送的是文件
{
//打开保存对话框
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "文本类型|*.txt|图片类型|*.jpg|音乐类型|*.mp3|所有文件|*.*";
sfd.Title = "请选择要保存的位置";
sfd.ShowDialog(this);
//获取用户选择的保存地址
string path = sfd.FileName;
//创建一个流来将接收的文件写入指定地址
using (FileStream fsWrite=new FileStream (path,FileMode.OpenOrCreate,FileAccess.Write))
{
fsWrite.Write(buffer, 0, r - 1);
MessageBox.Show("保存成功!");
}
}
else if (number == 3)//对方发送的是震动
{
ZD();
ShowMsg("对方给你发送了一个抖屏"+"\r\n");
}
else if (number==0)//发送过来的是对方客户端的IP地址
{
//将IP地址提取出来
string fridentIP = Encoding.Default.GetString(buffer, 1, r - 1);
//在聊天窗口将对方IP地址展示出来
ShowMsg(fridentIP + ":");
//检查当前列表中有没有该IP地址
if (lbxHaoYou.Items.Contains(fridentIP ))//有
{
}
else//没有,添加进去
{
//将IP地址添加到列表中
lbxHaoYou.Items.Add(fridentIP);
//将当期选中的聊天对象选为当前IP
lbxHaoYou.SelectedItem = fridentIP;
}
}
}
}
/// <summary>
/// 添加好友
/// 自定义协议,发送好友IP地址在字节前加0
/// 发送文字信息在字节前加1
/// 发送文件在字节前加2
/// 发送震动在字节前加3
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button4_Click(object sender, EventArgs e)
{
//获取用户要添加的好友客户端Ip地址
IPAddress IP;
IPEndPoint point;
try
{
//创建IP对像来存储好友IP地址
IP = IPAddress.Parse(txtIP.Text);
}
catch
{
MessageBox.Show("请输入正确的IP地址");
return;
}
try
{
//创建一个网络端点对象来存储要添加的好友网络端口与IP地址
point = new IPEndPoint(IP, Convert.ToInt32(txtDuan.Text));
}
catch
{
MessageBox.Show("请输入正确的网络端口");
return;
}
if (lbxHaoYou.Items.Contains(point))
{
ShowMsg("你已经添加了该好友,不能重复添加");
return;
}
else
{
//将IP地址添加标签
byte[] buffer = Encoding.Default.GetBytes(point.ToString());
byte[] newBuffer = AddNum(buffer, 0);
//发送IP地址
socketSpeak.Send(newBuffer);
//将该客户端好友IP地址信息添加到列表中
lbxHaoYou.Items.Add(point.ToString());
lbxHaoYou.Text = point.ToString();
//清空添加好友文本框
txtDuan.Text = "";
txtIP.Text = "";
//显示添加好友成功
ShowMsg("添加好友成功,现在你可以双击列表进行聊天哦");
}
}
/// <summary>
/// 将一个字节数组前面添加表示数字
/// </summary>
/// <param name="buffer">要添加标签的数组</param>
/// <param name="number">标签</param>
/// <returns></returns>
private byte[] AddNum(byte[] buffer, byte number)
{
List<byte> list = new List<byte>();
list.Add(number);
list.AddRange(buffer);
byte[] newBuffer = list.ToArray();
return newBuffer;
}
/// <summary>
/// 发送文字信息
/// 标签为1
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSendWord_Click(object sender, EventArgs e)
{
try
{
//获取用户选择的要聊天的客户端
string name = lbxHaoYou.SelectedItem.ToString();
if (txtOut.Text == "")
{
ShowMsg("你不能发送空信息,请输入后发送!");
}
else
{
//添加标签
byte[] buffer = Encoding.Default.GetBytes(txtOut.Text);
byte[] newBuffer = AddNum(buffer, 1);
//发送输入框中的信息
socketSpeak.Send(newBuffer);
ShowMsg("自己:");
ShowMsg(txtOut.Text + "\r\n");
//清空输入框
txtOut.Text = "";
}
}
catch
{
ShowMsg("你并没有选择任何好友进行聊天");
}
}
/// <summary>
/// 选择要聊天的好友,发送IP地址给客户端
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void lbxHaoYou_DoubleClick(object sender, EventArgs e)
{
string IP = null;
try
{
//获取要聊天的客户端IP地址
IP = lbxHaoYou.SelectedItem.ToString();
}
catch
{
ShowMsg("你没点中任何好友哦!");
return;
}
//将IP地址添加标签
byte[] buffer = Encoding.Default.GetBytes(IP);
byte[] newBuffer = AddNum(buffer, 0);
//发送IP地址给客户端
socketSpeak.Send(newBuffer);
}
/// <summary>
/// 选择要发送的文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnFile_Click(object sender, EventArgs e)
{
//创建一个打开窗口
OpenFileDialog ofd = new OpenFileDialog();
ofd.Title = "请选择你要发送的文件";
ofd.Filter = "文件类型|*.txt|图片类型|*.jpg|音乐类型|*.mp3|所有文件|*.*";
ofd.Multiselect = false;
ofd.ShowDialog();
//获取用户选择的文件地址
string path = ofd.FileName;
//将文件地址显示到txtFilePath文本框中
txtFilePath.Text = path;
}
/// <summary>
/// 震动方法
/// </summary>
private void ZD()
{
//获取当前窗口的坐标
Point pointNow = this.Location;
for (int i = 0; i < 2000; i++)
{
//当前X坐标各加10
this.Location = new Point(pointNow.X + 10, pointNow.Y);
//当前坐标各加10
this.Location = new Point(pointNow.X + 10, pointNow.Y + 10);
//当前X坐标恢复
this.Location = new Point(pointNow.X, pointNow.Y + 10);
//当前坐标恢复
this.Location = new Point(pointNow.X, pointNow.Y);
}
}
/// <summary>
/// 发送文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
//读取要发送文件的地址
string path = txtFilePath.Text;
try
{
//创建一个流文件来读取要发送的文件
using (FileStream fsRead = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Read))
{
//读取要发送的文件到缓冲区中
byte[] buffer = new byte[1024 * 1024 * 3];
int r = fsRead.Read(buffer, 0, buffer.Length);
//将字节数组转为字符串
string file = Encoding.Default.GetString(buffer, 0, r);
//将字符串转为字节数组
byte[] buffer1 = Encoding.Default.GetBytes(file);
//将要发送的字节数组加上标签
byte[] newBuffer = AddNum(buffer1, 1);
//发送该字节数组
socketSpeak.Send(newBuffer);
//发送完成
ShowMsg("文件发送成功");
//清空文件地址框
txtFilePath.Text = "";
ShowMsg("自己:");
ShowMsg("发送文件成功!"+"\r\n");
}
}
catch
{
ShowMsg("你并没有选择要发送的文件");
}
}
/// <summary>
/// 发送抖屏
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
//震动的标示符为3,我们直接发送3即可
byte[] buffer = new byte[1];
buffer[0] = 3;
try
{
socketSpeak.Send(buffer);
ShowMsg("自己:");
ShowMsg("你向对方发送了震动" + "\r\n");
}
catch
{
ShowMsg("你还没有连接上服务器!");
}
}
这样就写好了客户端,大家可以将服务器端与客户端都打开,来尝试连接对话。
打开一个服务器,两个客户端。服务器端打开后输入本机IP地址点击开始监听开始监听接入在客户端输入服务器的IP地址及端口号,点击“点我开始”接入服务器。这时两个客户端都接入了服务器,再让两个客户端其中一个输入对方的IP地址及端口号,点击“添加好友”添加对方客户端,这个时候两个客户端已经连接上了,(此时有个小问题,被加好友的客户端好友列表中有对方的IP地址,但是默认选中其实是无效的,因为此时该客户端并没有发送对方IP地址给服务器,大家可以自己想想解决这个问题)。我们双击选择好友后就可以两个客户端互相聊天了,简单的聊天软件就做好了!谢谢大家!