Socket实现仿QQ聊天(可部署于广域网)附源码(1)-简介
1.前言
本次实现的这个聊天工具是我去年c#程序设计课程所写的Socket仿QQ聊天,由于当时候没有自己的服务器,只能在机房局域网内进行测试,最近在腾讯云上买了一台云主机(本人学生党,腾讯云有个学生专享活动一元一个月的云服务器,如果还是学生的可以试一下,地址http://www.qcloud.com/event/qcloudSchool),经过重新编码实现了广域网聊天的功能。下面开始介绍我的自制聊天软件啦!!!
2.功能
1. 聊天室服务器端的创建。
2. 聊天室客户端的创建。
3. 实现客户与服务器的连接通讯。
4. 实现客户之间的私聊(窗口抖动,一般信息,文件)。
5. 实现客户端的在线信息显示。
6. 实现服务器端当前在线客户信息。
7. 保存谈话记录。
8.实现客户端仿QQ的一般操作(注册,登录,修改密码,查找好友,更新个人信息,娱乐,切换头像)
3.技术
本程序是设计一个类似QQ的网络即时聊天工具,主要是采用WinForms+ADO.NET+Socket通信+thread+云服务器技术实现。软件功能主要包括用户注册、用户登录、用户间聊天、查找/添加好友、个人设置以及服务器的搭建等。客户端通过公共的SQLServer2008数据库交换信息,消息的发送和读取都是通过Socket通信技术和操作数据库来完成的。在程序中采用定时扫描数据库的方式来查找登录用户。以及Socket通信技术实现信息交换。
4.网络通信简介
博客园上有很多简介我简单引用一下
1、Socket还被称作“套接字”,应用程序通常通过套接字向网络发送请求或者应答网络请求。根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
2、端口:可以认为是计算机与外界通讯交流的出口。
3、Tcp: TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层通信协议。UDP是另一个重要的传输协议。
4、UDP:用户数据报协议,是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
本人觉得博主张龙豪的这篇Socket文章写得不错,大家可以参考一下。
聊天程序(基于Socket、Thread)
http://www.cnblogs.com/knowledgesea/archive/2012/11/26/2788669.html
这是一幅非常经典的图啊,相信看后大家对Socket就会有一定的了解。
5.简单实现Socket通信
服务器代码:
public Form1()
{
InitializeComponent();
//防止新线程调用主线程卡死
CheckForIllegalCrossThreadCalls = false;
}
Socket sck = null;
Thread thread = null;
//点击开启服务端监听
private void btnServer_Click(object sender, EventArgs e)
{
//创建一个Socket实例
//第一个参数表示使用ipv4
//第二个参数表示发送的是数据流
//第三个参数表示使用的协议是Tcp协议
sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//获取ip地址局域网使用 ipv4,广域网使用外网IP
IPAddress ip = IPAddress.Parse(txtIP.Text);
//创建一个网络通信节点,这个通信节点包含了ip地址,跟端口号。
//这里的端口我们设置为1029,这里设置大于1024,为什么自己查一下端口号范围使用说明。
IPEndPoint endPoint = new IPEndPoint(ip, int.Parse(txtPort.Text));
//Socket绑定网路通信节点
sck.Bind(endPoint);
//设置监听队列
sck.Listen();
ShowMsg("开启监听!"); //开启一个新线程,放入Socket服务监听
Thread thread = new Thread(JtSocket);
//设置为后台线程
thread.IsBackground = true;
thread.Start();
}
Socket accSck = null;
//Socket服务监听函数
void JtSocket()
{
while (true)//注意该循环,服务端要持续监听,要不然一个客户端链接过后就无法链接第二个客户端了。
{
//创建一个接收客户端通信的Socket
accSck = sck.Accept();
//如果监听到客户端有链接,则运行到下一部,提示,链接成功!
ShowMsg("链接成功!");
}
} //消息框里面数据
void ShowMsg(string str)
{
string Ystr = "";
if (txtChat.Text != "")
{
Ystr = txtChat.Text + "\r\n";
}
txtChat.Text = Ystr + str;
}
/// <summary>
/// 向客户端发消息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSend_Click(object sender, EventArgs e)
{
string SendMsg = txtMsg.Text;
if (SendMsg != "")
{
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(SendMsg); //将要发送的数据,生成字节数组。
accSck.Send(buffer);
ShowMsg("向客户端发送了:" + SendMsg);
}
}
客户端代码:
public Client()
{
InitializeComponent();
//防止新线程调用主线程卡死
TextBox.CheckForIllegalCrossThreadCalls = false;
}
Socket clientSocket = null;
Thread thread = null;
//通过IP地址与端口号与服务端建立链接
private void btnToServer_Click(object sender, EventArgs e)
{
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//这里的ip地址,端口号都是服务端绑定的相关数据。
IPAddress ip = IPAddress.Parse(txtIP.Text);
IPEndPoint endpoint = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));
clientSocket.Connect(endpoint);//链接有端口号与IP地址确定服务端. //客户端在接受服务端发送过来的数据是通过Socket 中的Receive方法,
//该方法会阻断线程,所以我们自己为该方法创建了一个线程
thread = new Thread(ReceMsg);
thread.IsBackground = true;//设置后台线程
thread.Start();
}
public void ReceMsg()
{
while (true)
{
byte[] buffer = new byte[ * * ];
clientSocket.Receive(buffer);//接收服务端发送过来的数据
string ReceiveMsg = System.Text.Encoding.UTF8.GetString(buffer);//把接收到的字节数组转成字符串显示在文本框中。
ShowMsg("接收到数据:" + ReceiveMsg);
}
} //消息框里面数据
void ShowMsg(string str)
{
string Ystr = "";
if (txtChat.Text != "")
{
Ystr = txtChat.Text + "\r\n";
}
txtChat.Text = Ystr + str;
}
运行效果
小练习源码地址:http://pan.baidu.com/s/1sld12Kt
5.小结
本次只是开了一个头,我们介绍了一下的Socket仿QQ聊天的基本实现思想,从下次博客开始我要开始写服务器如何监听多个客户端,并且如何实现端对端的通信,以及对通信协议的自定义,说了这么多,看一下我实现的效果吧。下次我们继续聊。
下面这幅图为客户端聊天是发送窗口抖动的效果,好吧有点鬼畜,(上面那个为服务器-*可部署于服务器*,下面为两个客户端)
6源码
下面这个源码基本上是我课程设计时所作,我把它命名为MyChatV1.0,后续的博客中我还会重构我的代码,大家可以先下载的看一下(写的可能比较挫),核心实现代码我还会在我后续的博客中介绍。(APP.config文件中的数据库地址是我使用阿里云免费的数据库,大家可以直接使用但注意只能用于交流,本地数据库文件我也会上传到源码当中)。
这个系列未完,待续。。。。。。。。。。。。。。。。。。。。。,期待您的关注
MyChatV1.0源码:http://pan.baidu.com/s/1pLnEUwV
Socket实现仿QQ聊天(可部署于广域网)附源码(1)-简介的更多相关文章
- Socket实现仿QQ聊天(可部署于广域网)附源码(4)-加入数据库系统搭建完成
1.前言 这是本系列的第四篇文章,上一篇我们讲到实现了客户端对客户端的抖屏与收发各种类型文件,本篇文章我们加入SQLServer数据库实现登录与好友的添加等功能,并对界面做了美化处理.向往常一样我会把 ...
- Socket实现仿QQ聊天(可部署于广域网)附源码(2)-服务器搭建
1.前言 这是本系列的第二篇文章,第一篇文章得到了很多朋友们的支持,在这里表示非常的感谢.对于这一系列文章需要补充的是这只是一篇入门级别的Socket通信文章,对于专业人员来说完全可以跳过.本文只介绍 ...
- iOS 未读消息角标 仿QQ拖拽 简单灵活 支持xib(源码)
一.效果 二.简单用法 超级简单,2行代码集成:xib可0代码集成,只需拖一个view关联LFBadge类即可 //一般view上加角标 _badge1 = [[LFBadge alloc] init ...
- android文件选择器、仿淘宝编辑页面、新手引导层等源码
Android精选源码 单片机和安卓应用,传感器 文件选择器 android滑动选择的尺子view源码 android视频录制 视频压缩的源码 仿今日头条顶部导航指示器源码 Android框架+常用控 ...
- JS简单仿QQ聊天工具的制作
刚接触JS,对其充满了好奇,利用刚学到的一点知识,写了一个简单的仿QQ聊天的东西,其中还有很多的不足之处,有待慢慢提高. 功能:1.在输入框中输入内容,点击发送,即可在上方显示所输入内容. 2.点击‘ ...
- 高仿qq聊天界面
高仿qq聊天界面,给有需要的人,界面效果如下: 真心觉得做界面非常痛苦,给有需要的朋友. chat.xml <?xml version="1.0" encoding=&quo ...
- Android特效专辑(六)——仿QQ聊天撒花特效,无形装逼,最为致命
Android特效专辑(六)--仿QQ聊天撒花特效,无形装逼,最为致命 我的关于特效的专辑已经在CSDN上申请了一个专栏--http://blog.csdn.net/column/details/li ...
- WPF仿QQ聊天框表情文字混排实现
原文:WPF仿QQ聊天框表情文字混排实现 二话不说.先上图 图中分别有文件.文本+表情.纯文本的展示,对于同一个list不同的展示形式,很明显,应该用多个DataTemplate,那么也就需要Data ...
- 仿QQ聊天程序(java)
仿QQ聊天程序 转载:牟尼的专栏 http://blog.csdn.net/u012027907 一.设计内容及要求 1.1综述 A.系统概述 我们要做的就是类似QQ这样的面向企业内部的聊天软件,基本 ...
随机推荐
- C++ std::map::erase用法及其陷阱
1.引入: STL的map中有一个erase方法用来从一个map中删除制定的节点 eg: map<string,string> mapTest; typedef map<string ...
- MySQL 升级详细步骤 (包括 Percona)
MySQL 升级步骤 MySQL 5.1.72 升级到 MySQL 5.5.36 鉴于我在升级的时候遇到的麻烦问题,我觉得有必要把一些细节说清楚,免得引起误解了.感觉官方文档上的升级步骤写的比较简单, ...
- PAT/简单模拟习题集(二)
B1018. 锤子剪刀布 (20) Discription: 大家应该都会玩"锤子剪刀布"的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统计双方的胜.平.负 ...
- 微软connect教程系列—EntityFramework7(三)
随着Asp.NET5的开源,以及跨平台,ORM框架EF7也与时俱进,支持asp.net core,也支持关系型数据库和非关系型数据库,以及在linux和mac上跨平台使用. 下面演示的即通过使用E ...
- Docker Registry搭建私有仓库
利用Registry镜像搭建Docker私有仓库遇到了很多坑,说来也是找到的资料都是杂而不精的东西,所以也没少走了弯路,现在回过头看去感觉好多坑还是别人给挖的··· 不过努力的最终结果还是好的,因为找 ...
- .NET跨平台实践:用C#开发Linux守护进程(转)
Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为L ...
- 我的ORM之五-- 事务
我的ORM索引 单库事务与分布式事务 单库事务: 性能更好,应用于一个数据库时的场景,当数据库发生变化,如拆分为多个服务器,代码需要修改. 分布式事务:性能相对较差,但有更大的适用场景.当数据库发生变 ...
- AJAX原理总结
AJAX全称 Asynchronous JavaScript and XML(异步的JavaScript 和XML) 同步和异步 异步传输是面向字符的传输,单位是字符 同步传输是面向比特,单位是帧,传 ...
- RCP:给GEF编辑器添加拖拽辅助线
当图形边缘碰触时,会产生一条帮助拖拽的辅助线 这里需要三个类: 1.SnapToGeomotry 2.SnapToGuide(非必须) 3.SnapFeedbackPolicy
- C#中的线程二(Cotrol.BeginInvoke和Control.Invoke)
C#中的线程二(Cotrol.BeginInvoke和Control.Invoke) 原文地址:http://www.cnblogs.com/whssunboy/archive/2007/06/07/ ...