1.
客户端连接服务器(登陆,上传相应的数据(起码有聊天室编号))
2.
客户端发生消息给服务器(消息+聊天室编号)
3.
服务器根据客户端上传的聊天室编号广播消息
4.
客户端接受服务器传来的消息
用到的技术就是socket编程(应该有其他的现成的框架,不过我用得比较多的是java,不清楚c的),如果还想做个界面的话,可以用qt做,或者MFC,应该还有其他可选方式,不过我不知道~~~。
上面只是简单的,你要做完备的还有很多问题需要考虑,比如说加密数据,优化使其能容纳较多的用户,服务器崩溃时的处理方案等等。
创建c++控制器文件项目,获取聊天窗口的句柄,向聊天窗口出入聊天消息,模拟发送。c++使用方法:下载安装并打开c++点击左上角文件——新建——源代码(也可使用Ctrl+N快速完成新建)在文本框编写你所需要的程序点击编译(快捷键F9)点击运行即可查看自己所编写的程序(快捷键F10在编完程序后可直接点击编译运行查看自己的程序(快捷键F11)。
using Systemusing System.Collections.Generic
using System.Net
using System.Net.Sockets
using System.Threading
using System.Text
using System.IO
class Server
{
Socket _listenSocket
Dictionary<string, ClientProcess> _clients
public Server(int port)
{
_clients = new Dictionary<string, ClientProcess>()
_listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
IPEndPoint lep = new IPEndPoint(IPAddress.Any, port)
_listenSocket.Bind(lep)
}
public void Start()
{
_listenSocket.Listen(5)
for ( )
{
Socket client = _listenSocket.Accept()
ClientProcess cp = new ClientProcess(this, client)
ThreadStart ts = new ThreadStart(cp.Process)
Thread t = new Thread(ts)
t.Start()
}
}
public void AddClient(string email, ClientProcess c)
{
lock (_clients)
{
if (!_clients.ContainsKey(email))
_clients.Add(email, c)
}
}
public void RemoveClient(string email)
{
lock (_clients)
{
if (_clients.ContainsKey(email))
_clients.Remove(email)
}
}
public void SendTo(string from, string email, string msg)
{
ClientProcess cp
lock(_clients) {
_clients.TryGetValue(email, out cp)
}
if (cp != null)
{
cp.Send(from, msg)
}
}
}
class ClientProcess
{
Server _serv
Socket _s
TcpClient _tc
StreamReader _sr
StreamWriter _sw
string email
public ClientProcess(Server serv, Socket s)
{
_serv = serv
_s = s
_tc = new TcpClient()
_tc.Client = _s
_sr = new StreamReader(_tc.GetStream())
_sw = new StreamWriter(_tc.GetStream())
}
public void Process()
{
try
{
email = _sr.ReadLine()
_serv.AddClient(email, this)
for ( )
{
string l = _sr.ReadLine()
int i = l.IndexOf(':')
if(i == -1)
continue
string em = l.Substring(0, i)
string msg = l.Substring(i + 1)
_serv.SendTo(email, em, msg)
}
}
catch
{
_serv.RemoveClient(email)
}
}
public void Send(string email, string msg)
{
_sw.WriteLine("{0}:{1}", email, msg)
_sw.Flush()
}
}
class Program
{
static void Main(string[] args)
{
Server s = new Server(12345)
s.Start()
}
}
协议是这样的:
1、发送和接收都是以行为单位的
2、客户端连接后发送的第一行数据是自己的邮箱
3、客户端之后发送的格式是: 对方邮箱 冒号 要发送的消息。冒号是英文半角冒号,邮箱和冒号间没有空格
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)