聊天项目----界面完整版

发布时间:2020-08-04 23:06:39 作者:小止1995
来源:网络 阅读:431
//main_client.cpp
#include"udp_client.h"
udp_client _cl;
udp_data ud;
string _name;
string _school;
void* draw_header(void* arg)
{
    chat_window* _win=(chat_window*)arg;
    _win->create_header();
    string _line="HELLO WORLD";
    int _max_y;
    int _max_x;
    getmaxyx(_win->header,_max_y,_max_x);

    int _y=_max_y/2;
    int _x=1;
    while(1)
    {
        _win->put_str_to_win(_win->header,_y,_x,_line);
        _win->fflush_win(_win->header);
        usleep(10000);
        _x++;
        _x%=_max_x;
        _win->clear_win_line(_win->header,_y,2);
        _win->fflush_win(_win->header);
        usleep(10000);
    }

}
void* draw_output(void* arg)
{
    chat_window* _win=(chat_window*)arg;
    _win->create_output();
    _win->create_friends_list();

    int _max_y;
    int _max_x;
    getmaxyx(_win->output,_max_y,_max_x);
    int _y=1;
    int _x=3;//col
    string outmsg;//send msg:jsoncpp msg
    string show_msg;//output :reseralized msg
    string _name;
    string _msg;
    string _school;
    string _cmd;
    
    
    int _max_fly;//friends_list
    int _max_flx;
    getmaxyx(_win->friends_list,_max_fly,_max_flx);
    int _fly=1;
    int _flx=2;
    string list;//friends list

    while(1)
    {
        usleep(10000);
        _win->fflush_win(_win->output);
        _win->fflush_win(_win->friends_list);

        _cl.recv_data(outmsg);
        ud.data_to_value(_name,_msg,_school,_cmd,outmsg);

        
        show_msg=_name+"_"+_school+":"+_msg;
        list=_name+"-"+_school;
        
        _cl.add_fri_list(list);
        if(_cmd=="QUIT")
        {
            _cl.del_fri_list(list);
        }
        _win->put_str_to_win(_win->output,_y,_x,show_msg);
        _y++;
        if(_y==_max_y)
        {
            _win->clear_win_line(_win->output,1,_max_y-1);
            _y=1;
        }


    
        vector<string>::iterator _iter=_cl.fri_list.begin();
        for(;_iter!=_cl.fri_list.end()&&_fly<_max_fly;++_iter)
        {
            _win->put_str_to_win(_win->friends_list,_fly++,_flx,*_iter);
        }
        _fly=1;

        usleep(10000);
        _win->fflush_win(_win->output);
        _win->fflush_win(_win->friends_list);
    }
}
//void* draw_friends_list(void* arg)
//{
//    chat_window* _win=(chat_window*)arg;
//    _win->create_friends_list();
//
//    int _max_y;
//    int _max_x;
//    getmaxyx(_win->header,_max_y,_max_x);
//
//    int _y=1;
//    int _x=1;
//    while(1)
//    {
//        usleep(1000000);
//        _y=1;
//        _win->fflush_win(_win->friends_list);
//
//        _win->clear_win_line(_win->friends_list,1,_y);
//    }
//}
void* draw_input(void* arg)
{
    chat_window* _win=(chat_window*)arg;
    _win->create_input();
    string _line="please input#";
    int _max_y;
    int _max_x;
    getmaxyx(_win->input,_max_y,_max_x);
    
    string _msg;
    string _cmd=ud.cmd;
    string _out;//send msg jsoncpp
    string list;
    while(1)
    {
        usleep(1000000);
        _win->put_str_to_win(_win->input,1,1,_line);
        _win->fflush_win(_win->input);
        _msg=_win->get_str_from_win(_win->input);
        if(_msg=="quit"||_msg=="q")
        {
            _cmd="QUIT";
            ud.data_to_string(_name,_msg,_school,_cmd,_out);
            _cl.send_data(_out);
            exit(0);//ending proc
        }
        ud.data_to_string(_name,_msg,_school,_cmd,_out);
        _cl.send_data(_out);
        
        _win->clear_win_line(_win->input,1,2);
        usleep(1000);
        _win->put_str_to_win(_win->input,1,1,_line);
        _win->fflush_win(_win->input);
    }
}
//int main()
//{
//    chat_window _wi;
//    pthread_t th,to,tf,ti;
//    pthread_create(&th,NULL,draw_header,(void*)&_wi);
//    pthread_create(&to,NULL,draw_output,(void*)&_wi);
//    pthread_create(&tf,NULL,draw_friends_list,(void*)&_wi);
//    pthread_create(&ti,NULL,draw_input,(void*)&_wi);
//    pthread_join(th,NULL);
//    pthread_join(to,NULL);
//    pthread_join(tf,NULL);
//    pthread_join(ti,NULL);
//    return 0;
//}


int main()
{
    _cl.init();
    cout<<"please input name: ";
    cin>>_name;
    cout<<"please input school: ";
    cin>>_school;

//    _name="rz";
    chat_window _wi;
//    pthread_t th,to,tf,ti;
    pthread_t th,to,ti;
    pthread_create(&th,NULL,draw_header,(void*)&_wi);
    pthread_create(&to,NULL,draw_output,(void*)&_wi);
//    pthread_create(&tf,NULL,draw_friends_list,(void*)&_wi);
    pthread_create(&ti,NULL,draw_input,(void*)&_wi);
    pthread_join(th,NULL);
    pthread_join(to,NULL);
//    pthread_join(tf,NULL);
    pthread_join(ti,NULL);
//    _name="";

}
//int main()
//{
//    udp_client _cl;
//    _cl.init();
//    udp_data ud;
//    string _name;
//    cout<<"please input name: ";
//    cin>>_name;
//    string _msg;
//    cout<<"please input msg: ";
//    cin>>_msg;
//    string _school;
//    cout<<"please input school: ";
//    cin>>_school;
//    string _cmd;
//    cout<<"please input cmd: ";
//    cin>>_cmd;
//    string _out;
////    _name="rz";
//    ud.data_to_string(_name,_msg,_school,_cmd,_out);
//    _cl.send_data(_out);
////    _name="";
////    ud.data_to_value(_name,_msg,_school,_cmd,_out);
////    cout<<_out<<endl;
////    cout<<_name;
//    _out="";
//    _cl.recv_data(_out);
//    cout<<_out<<endl;
//    ud.data_to_value(_name,_msg,_school,_cmd,_out);
//    
//    cout<<"name: "<<_name<<endl;
//    cout<<"msg: "<<_msg<<endl;
//    cout<<"school: "<<_school<<endl;
//      cout<<"cmd: "<<_cmd<<endl;
//    while(1)
//    {
//        cout<<"please input msg";
//        cin>>_msg;
//        ud.data_to_string(_name,_msg,_school,_cmd,_out);
//
//        _cl.send_data(_out);
//        _out="";
//        _cl.recv_data(_out);
//        ud.data_to_value(_name,_msg,_school,_cmd,_out);
//
//        cout<<"name: "<<_name<<endl;
//        cout<<"msg: "<<_msg<<endl;
//        cout<<"school: "<<_school<<endl;
//        cout<<"cmd: "<<_cmd<<endl;
//    }
//}

//main_server.cpp
#include"udp_server.h"
void Usage(const char* proc)
{
    cout<<"Usage: "<<proc<<" [ip] [port]"<<endl;
}
void* recv(void* arg)
{
    udp_server* _ser=(udp_server*)arg;
    while(1)
    {
        _ser->recv_data();
    }
    return NULL;
}
void* broad_cast(void* arg)
{
    udp_server* _ser=(udp_server*)arg;
    while(1)
    {
        _ser->broadcast();
    }
    return NULL;
}
int main(int argc,char* argv[])
{
    if(argc!=3)
    {
        Usage(argv[0]);
        exit(0);
    }
    string ip=argv[1];
    short port=atoi(argv[2]);
    udp_server _se(ip,port);
    _se.init();

//    daemon(0,0);
        
    pthread_t tid1;
    pthread_t tid2;
    pthread_create(&tid1,NULL,recv,(void*)&_se);
    pthread_create(&tid2,NULL,broad_cast,(void*)&_se);
    
    pthread_join(tid1,NULL);
    pthread_join(tid2,NULL);
    //while(1)
    //{
    //    if(_se.recv_data()>0)
    //    {
    //        _se.broadcast();
    //    }
    //}
    return 0;
}

//window目录下
//chat_window.h
#pragma once
#include<iostream>
#include<string.h>
#include<string>
#include<ncurses.h>
#include<pthread.h>
#include<unistd.h>
#include"comm.h"
//#define _SIZE_ 1024
using namespace std;
class chat_window
{
    public:
        chat_window();
        void put_str_to_win(WINDOW* _win,int _y,int _x,const string& msg);
        string get_str_from_win(WINDOW* _win);

        void create_header();
        void create_output();
        void create_friends_list();
        void create_input();
        ~chat_window();
//        WINDOW* create_newwin(int _h,int _w,int _y,int _x);
        void fflush_win(WINDOW* _win);
        void clear_win_line(WINDOW* _win,int begin,int num);
    public:
        WINDOW* header;
        WINDOW* output;
        WINDOW* friends_list;
        WINDOW* input;
        pthread_mutex_t mutex;
};
//chat_window.cpp
#include"chat_window.h"
chat_window::chat_window()
{
    pthread_mutex_init(&mutex,NULL);
    initscr();//init screen
    curs_set(0);//hide mouse pointer
}
void chat_window::put_str_to_win(WINDOW* _win,int _y,int _x,const string& msg)
{
    mvwaddstr(_win,_y,_x,msg.c_str());//mv window  add str :C function
}
string chat_window::get_str_from_win(WINDOW* _win)
{
    char buf[_SIZE_];
    memset(buf,'\0',sizeof(buf));
    wgetnstr(_win,buf,sizeof(buf)-1);
    return buf;
}
void chat_window::create_header()
{
    int _y=0;//row
    int _x=0;//col
    int _h=LINES/5;
    int _w=COLS;
    header=newwin(_h,_w,_y,_x);//create new window
}
void chat_window::create_output()
{
    int _y=LINES/5;//row
    int _x=0;//col
    int _h=(LINES*3)/5;
    int _w=(COLS*4)/5;
    output=newwin(_h,_w,_y,_x);//create new window
}
void chat_window::create_friends_list()
{
    int _y=LINES/5;//row
    int _x=(COLS*4)/5;//col
    int _h=(LINES*3)/5;
    int _w=COLS/5;
    friends_list=newwin(_h,_w,_y,_x);//create new window
}
void chat_window::create_input()
{
    int _y=(LINES*4)/5;//row
    int _x=0;//col
    int _h=LINES/5;
    int _w=COLS;
    input=newwin(_h,_w,_y,_x);//create new window
}
chat_window::~chat_window()
{
    pthread_mutex_destroy(&mutex);
    delwin(header);//destroy window
    delwin(output);//destroy window
    delwin(friends_list);//destroy window
    delwin(input);//destroy window
    endwin();
}
//WINDOW* chat_window::create_newwin(int _h,int _w,int _y,int _x)
//{
//    WINDOW* _win=newwin(_h,_w,_y,_x);
//    box(_win,0,0u);
//    return _win;
//}
void chat_window::fflush_win(WINDOW* _win)
{
    pthread_mutex_lock(&mutex);
    box(_win,0,0);
    wrefresh(_win);
    pthread_mutex_unlock(&mutex);
}
void chat_window::clear_win_line(WINDOW* _win,int begin,int num)
{
    while(num-- > 0)
    {
        wmove(_win,begin++,0);//0 is col
        wclrtoeol(_win);//window clear to eof last
    }
}
//void* draw_header(void* arg)
//{
//    chat_window* _win=(chat_window*)arg;
//    _win->create_header();
//    string _line="HELLO WORLD";
//    int _max_y;
//    int _max_x;
//    getmaxyx(_win->header,_max_y,_max_x);
//
//    int _y=_max_y/2;
//    int _x=1;
//    while(1)
//    {
//        _win->put_str_to_win(_win->header,_y,_x,_line);
//        _win->fflush_win(_win->header);
//        usleep(10000);
//        _x++;
//        _x%=_max_x;
//        _win->clear_win_line(_win->header,_y,2);
//        _win->fflush_win(_win->header);
//        usleep(10000);
//    }
//
//}
//void* draw_output(void* arg)
//{
//    chat_window* _win=(chat_window*)arg;
//    _win->create_output();
//    while(1)
//    {
//        usleep(1000000);
//        _win->fflush_win(_win->output);
//    }
//}
//void* draw_friends_list(void* arg)
//{
//    chat_window* _win=(chat_window*)arg;
//    _win->create_friends_list();
//    while(1)
//    {
//        usleep(1000000);
//        _win->fflush_win(_win->friends_list);
//    }
//}
//void* draw_input(void* arg)
//{
//    chat_window* _win=(chat_window*)arg;
//    _win->create_input();
//    string _line="please input#";
//    int _max_y;
//    int _max_x;
//    getmaxyx(_win->input,_max_y,_max_x);
//    string _msg;
//    while(1)
//    {
//        usleep(1000000);
//        _win->put_str_to_win(_win->input,1,1,_line);
//        _win->fflush_win(_win->input);
//        _msg=_win->get_str_from_win(_win->input);
//        _win->clear_win_line(_win->input,1,1);
//        usleep(1000);
//        _win->put_str_to_win(_win->input,1,1,_line);
//        _win->fflush_win(_win->input);
//    }
//}
//int main()
//{
//    chat_window _wi;
//    pthread_t th,to,tf,ti;
//    pthread_create(&th,NULL,draw_header,(void*)&_wi);
//    pthread_create(&to,NULL,draw_output,(void*)&_wi);
//    pthread_create(&tf,NULL,draw_friends_list,(void*)&_wi);
//    pthread_create(&ti,NULL,draw_input,(void*)&_wi);
//    pthread_join(th,NULL);
//    pthread_join(to,NULL);
//    pthread_join(tf,NULL);
//    pthread_join(ti,NULL);
//    return 0;
//}
//Makefile
chat_window:chat_window.cpp
    g++ -o $@ $^ -lncurses -lpthread


.PHONY:clean
clean:
    rm -f chat_window


推荐阅读:
  1. 聊天界面中ListView使用
  2. react+redux仿微信聊天界面

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

window chat 整版

上一篇:Git基础入门(三)Git基本操作

下一篇:GaussDB 100 OLTP 单机在 Centos7.6 上的安装系列一

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》