-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathclient.cpp
182 lines (169 loc) · 5.62 KB
/
client.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
#include "client.h"
client::client(int port,string ip):server_port(port),server_ip(ip){}
client::~client(){
close(sock);
}
void client::run(){
//定义sockfd
sock = socket(AF_INET,SOCK_STREAM, 0);
//定义sockaddr_in
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(server_port); //服务器端口
servaddr.sin_addr.s_addr = inet_addr(server_ip.c_str()); //服务器ip
//连接服务器,成功返回0,错误返回-1
if (connect(sock, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
{
perror("connect");
exit(1);
}
cout<<"连接服务器成功\n";
HandleClient(sock);
return;
}//注意,前面不用加static!
void client::SendMsg(int conn){
while (1)
{
string str;
cin>>str;
if(conn>0){
str="content:"+str;
}
else if(conn<0){
str="gr_message:"+str;
}
int ret=send(abs(conn), str.c_str(), str.length(),0); //发送
//输入exit或者对端关闭时结束
if(str=="content:exit"||ret<=0)
break;
}
}
//注意,前面不用加static!
void client::RecvMsg(int conn){
//接收缓冲区
char buffer[1000];
//不断接收数据
while(1)
{
memset(buffer,0,sizeof(buffer));
int len = recv(conn, buffer, sizeof(buffer),0);
//recv返回值小于等于0,退出
if(len<=0)
break;
cout<<buffer<<endl;
}
}
void client::HandleClient(int conn){
int choice;
string name,pass,pass1;
bool if_login=false;//记录是否登录成功
string login_name;
cout<<" ------------------\n";
cout<<"| |\n";
cout<<"| 请输入你要的选项:|\n";
cout<<"| 0:退出 |\n";
cout<<"| 1:登录 |\n";
cout<<"| 2:注册 |\n";
cout<<"| |\n";
cout<<" ------------------ \n\n";
//开始处理各种事务
while(1){
if(if_login)
break;
cin>>choice;
if(choice==0)
break;
//注册
else if(choice==2){
cout<<"注册的用户名:";
cin>>name;
while(1){
cout<<"密码:";
cin>>pass;
cout<<"确认密码:";
cin>>pass1;
if(pass==pass1)
break;
else
cout<<"两次密码不一致!\n\n";
}
name="name:"+name;
pass="pass:"+pass;
string str=name+pass;
send(conn,str.c_str(),str.length(),0);
cout<<"注册成功!\n";
cout<<"\n继续输入你要的选项:";
}
else if(choice == 1&&!if_login){
while(1){
cout<<"用户名:";
cin>>name;
cout<<"密码:";
cin>>pass;
//格式化
string str="login"+name;
str+="pass:";
str+=pass;
send(conn,str.c_str(),str.length(),0);//发送登录信息
char buffer[1000];
memset(buffer,0,sizeof(buffer));
recv(conn,buffer,sizeof(buffer),0);//接收响应
string recv_str(buffer);
//登录成功
if(recv_str.substr(0,2)=="ok"){
if_login=true;
login_name=name;
cout<<"登录成功\n\n";
break;
}
//登录失败
else
cout<<"密码或用户名错误!\n\n";
}
}
}
while(if_login&&1){
if(if_login){
system("clear");
cout<<" 欢迎回来,"<<login_name<<endl;
cout<<" -------------------------------------------\n";
cout<<"| |\n";
cout<<"| 请选择你要的选项: |\n";
cout<<"| 0:退出 |\n";
cout<<"| 1:发起单独聊天 |\n";
cout<<"| 2:发起群聊 |\n";
cout<<"| |\n";
cout<<" ------------------------------------------- \n\n";
}
cin>>choice;
if(choice==0)
break;
//私聊
if(choice==1){
cout<<"请输入对方的用户名:";
string target_name,content;
cin>>target_name;
string sendstr("target:"+target_name+"from:"+login_name);//标识目标用户+源用户
send(sock,sendstr.c_str(),sendstr.length(),0);//先向服务器发送目标用户、源用户
cout<<"请输入你想说的话(输入exit退出): \n";
thread t1(client::SendMsg,conn); //创建发送线程
thread t2(client::RecvMsg,conn);//创建接收线程
t1.join();
t2.join();
}
else if(choice==2){
cout<<"请输入群号:";
int num;
cin>>num;
string sendstr("group:"+to_string(num));
send(sock,sendstr.c_str(),sendstr.length(),0);
cout<<"请输入你想说的话(输入exit退出):\n";
thread t1(client::SendMsg,-conn); //创建发送线程,传入负数,和私聊区分开
thread t2(client::RecvMsg,conn);//创建接收线程
t1.join();
t2.join();
}
}
close(conn);
}