实例介绍
【实例简介】
可以内外网通讯,公网放置服务器端,两个内网放置客户端就可以使两个内网聊天,可发送文件,发送震动
【实例截图】
【核心代码】
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace Client
{
public partial class Client : Form
{
//客户端通信套接字
private Socket clientSocket;
//新线程
private Thread thread;
//当前登录的用户
private string userName = "";
private string friend;
private string filePath;
public Client()
{
InitializeComponent();
//防止新线程调用主线程卡死
CheckForIllegalCrossThreadCalls = false;
}
//通过IP地址与端口号与服务端建立链接
private void btnToServer_Click(object sender, EventArgs e)
{
//连接服务器前先选择用户
if (cmbUser.SelectedItem == null)
{
MessageBox.Show("请选择登录用户");
return;
}
userName = cmbUser.SelectedItem.ToString();
Text = "当前用户:" userName;
//登录后禁止切换用户
cmbUser.Enabled = false;
//加载好友列表
foreach (object item in cmbUser.Items)
{
if (item != cmbUser.SelectedItem)
{
lbFriends.Items.Add(item);
}
}
//新建通信套接字
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//这里的ip地址,端口号都是服务端绑定的相关数据。
IPAddress ip = IPAddress.Parse(txtIP.Text);
var endpoint = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));
try
{
clientSocket.Connect(endpoint); //链接有端口号与IP地址确定服务端.
//登录时给服务器发送登录消息
string str = userName "|" " ";
byte[] buffer = Encoding.UTF8.GetBytes(str);
var list = new List<byte>();
list.Add(0);
list.AddRange(buffer);
byte[] newbuffer = list.ToArray();
clientSocket.Send(newbuffer);
}
catch
{
MessageBox.Show("与服务器连接失败");
lbFriends.Items.Clear();
}
//客户端在接受服务端发送过来的数据是通过Socket 中的Receive方法,
//该方法会阻断线程,所以我们自己为该方法创建了一个线程
thread = new Thread(ReceMsg);
thread.IsBackground = true; //设置后台线程
thread.Start();
}
public void ReceMsg()
{
while (true)
{
try
{
var buffer = new byte[1024*1024*5];
int dateLength = clientSocket.Receive(buffer); //接收服务端发送过来的数据
//一般消息
if (buffer[0] == (byte) MsgTypeEnum.String)
{
//不解析第一位标识符
HandleStr(buffer, dateLength);
}
//抖屏消息
else if (buffer[0] == (byte) MsgTypeEnum.Shake)
{
HandleShake(buffer, dateLength);
}
//文件消息
else if (buffer[0] == (byte) MsgTypeEnum.File)
{
HandleFile(buffer, dateLength);
}
else
{
MessageBox.Show("接收文件解析失败");
}
}
catch
{
}
}
}
private void btnSend_Click(object sender, EventArgs e)
{
if (!IsSelectFriend())
{
return;
}
friend = lbFriends.SelectedItem.ToString();
try
{
//界面显示消息
string newstr = "我" ":" friend "\r\n" txtMsg.Text.Trim() " ____[" DateTime.Now
"]" "\r\n" "\r\n";
ShowSmsg(newstr);
SendStr(txtMsg.Text.Trim());
}
catch
{
MessageBox.Show("与服务器连接失败");
}
}
//展示消息
private void ShowSmsg(string newStr)
{
txtChat.AppendText(newStr);
}
private void btnCloseSer_Click(object sender, EventArgs e)
{
clientSocket.Close();
}
private void btnShake_Click(object sender, EventArgs e)
{
if (!IsSelectFriend())
{
return;
}
friend = lbFriends.SelectedItem.ToString();
try
{
//界面显示消息
string newstr = "我" ":" friend "\r\n" "\"发送了一个抖屏\"" " ____[" DateTime.Now
"]" "\r\n" "\r\n";
ShowSmsg(newstr);
SendShake();
}
catch
{
MessageBox.Show("与服务器连接失败");
}
}
private void btnSelFile_Click(object sender, EventArgs e)
{
using (OpenFileDialog ofd = new OpenFileDialog())
{
ofd.Multiselect = false;
ofd.Title = "选择要发送的文件";
if (ofd.ShowDialog() == DialogResult.OK)
{
filePath = ofd.FileName;
txtMsg.Text = filePath;
}
}
}
private void btnSendFile_Click(object sender, EventArgs e)
{
if (!IsSelectFriend()||filePath=="")
{
MessageBox.Show("选择好友与文件");
return;
}
friend = lbFriends.SelectedItem.ToString();
try
{
//界面显示消息
string newstr = "我" ":" friend "\r\n" "\"发送了一个文件\"" " ____[" DateTime.Now
"]" "\r\n" "\r\n";
ShowSmsg(newstr);
SendFile();
filePath = "";
}
catch
{
MessageBox.Show("与服务器连接失败");
}
}
public void HandleStr(byte[] buffer, int dateLength)
{
//不解析第一位标识符
string ReceiveMsg = Encoding.UTF8.GetString(buffer, 1, dateLength - 1);
string[] msgTxt = ReceiveMsg.Split('|');
string newstr = " " msgTxt[0] ":我" "\r\n" " " msgTxt[2] " ____["
DateTime.Now "]" "\r\n" "\r\n";
//把接收到的字节数组转成字符串显示在文本框中。
ShowSmsg(newstr);
}
public void HandleShake(byte[] buffer, int dateLength)
{
//不解析第一位标识符
string ReceiveMsg = Encoding.UTF8.GetString(buffer, 1, dateLength - 1);
string[] msgTxt = ReceiveMsg.Split('|');
string newstr = " " msgTxt[0] ":我" "\r\n" " " "\"发送了一个抖屏\"" " ____["
DateTime.Now "]" "\r\n" "\r\n";
//把接收到消息显示在文本框中。
ShowSmsg(newstr);
//震动
ShakeBody();
}
public void HandleFile(byte[] buffer, int dateLength)
{
//不解析第一位标识符
string ReceiveMsg = Encoding.UTF8.GetString(buffer, 1, dateLength - 1);
string[] msgTxt = ReceiveMsg.Split('|');
//获得收到的标识字节个数
int count = msgTxt[0].Length msgTxt[0].Length msgTxt[0].Length 3;
string newstr = " " msgTxt[0] ":我" "\r\n" " " "\"发送了一个文件\"" " ____["
DateTime.Now "]" "\r\n" "\r\n";
ShowSmsg(newstr);
if (MessageBox.Show("好友" msgTxt[0] "发来一个文件是否接收", "收到文件", MessageBoxButtons.YesNo) ==
DialogResult.Yes)
{
var sfd = new SaveFileDialog();
sfd.Title = "保存文件";
string fileType = "默认文件格式|*" msgTxt[2];
sfd.Filter = fileType;
sfd.ShowDialog(this);
using (var fs = new FileStream(sfd.FileName, FileMode.OpenOrCreate, FileAccess.Write))
{
fs.Write(buffer, 1, dateLength - count);
}
MessageBox.Show("保存成功");
//把接收到的消息显示在文本框中。
string resultstr1 = " " msgTxt[0] ":我" "\r\n" " " "\"文件接收成功\"" " ____["
DateTime.Now "]" "\r\n" "\r\n";
ShowSmsg(resultstr1);
}
else
{
//把接收到的消息显示在文本框中。
string resultstr = " " msgTxt[0] ":我" "\r\n" " " "\"文件接收取消\"" " ____["
DateTime.Now "]" "\r\n" "\r\n";
ShowSmsg(resultstr);
}
}
private bool IsSelectFriend()
{
if (lbFriends.SelectedItems.Count != 1)
{
MessageBox.Show("请选择好友");
return false;
}
else
{
return true ;
}
}
private void SendStr(string MsgStr)
{
//发往服务器的消息 格式为 (发送者|接收者|信息)
MyMessage msg = new MyMessage(MsgStr);
//消息转字节
byte[] buffer = msg.ToByteData();
//添加标识符 发送者|接收者|
byte[] sendbuffer= msg.MakeNewArrWithFlag(buffer,userName,friend);
clientSocket.Send(sendbuffer);
txtMsg.Text = "";
}
private void SendShake()
{
//发往服务器的消息 格式为 (发送者|接收者|信息)
MyMessage msg = new MyMessage(MsgTypeEnum.Shake);
//消息转字节
byte[] buffer = msg.ToByteData();
//添加标识符 发送者|接收者|
byte[] sendbuffer = msg.MakeNewArrWithFlag(buffer, userName, friend);
clientSocket.Send(sendbuffer);
txtMsg.Text = "";
}
private void SendFile()
{
//发往服务器的消息 格式为 (发送者|接收者|信息)
MyMessage msg = new MyMessage(filePath,MsgTypeEnum.File);
//消息转字节
byte[] buffer = msg.ToByteData();
//添加标识符 发送者|接收者|
byte[] sendbuffer = msg.MakeNewArrWithFlag(buffer, userName, friend);
clientSocket.Send(sendbuffer);
txtMsg.Text = "";
}
Random randObj = new Random();
private void ShakeBody()
{
//1.获取窗体当前坐标
Point oldPoint = this.Location;
//2.循环改变 窗体 坐标
for (int i = 0; i < 15; i )
{
//3.设置新的随机坐标
this.Location = new Point(oldPoint.X randObj.Next(30), oldPoint.Y randObj.Next(30));
System.Threading.Thread.Sleep(50);
//4.还原坐标
this.Location = oldPoint;
System.Threading.Thread.Sleep(50);
}
}
}
}
相关软件
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


支持(0) 盖楼(回复)
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)