实现一个终端版的简易Linux聊天室。 实现的效果:服务器启动,监测客户端连接的个数,监测每个客户端的IP地址以及端口号,当每个客户端发送消息时,服务器上会有线程专门将每个客户端发送的信息记录在界面上,就类似平时使用QQ群聊一样。
一、代码如下1、客户端代码:
#include#include #include #include #include #include #include #include #include #include #include using namespace std; int main() { //定义sockfd int sock_cli = socket(AF_INET,SOCK_STREAM, 0); //定义sockaddr_in struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET;//TCP/IP协议族 servaddr.sin_port = htons(8023); //服务器端口 servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //服务器ip //连接服务器,成功返回0,错误返回-1 if (connect(sock_cli, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) { perror("connect"); exit(1); } cout<<"连接服务器成功!n"; char sendbuf[100]; char recvbuf[100]; while (1) { memset(sendbuf, 0, sizeof(sendbuf)); cin>>sendbuf; send(sock_cli, sendbuf, strlen(sendbuf),0); //发送 if(strcmp(sendbuf,"exit")==0) break; } close(sock_cli); return 0; }
2、服务端代码:
#include#include #include #include #include #include #include #include #include #include #include using namespace std; int main() { //定义sockfd int server_sockfd = socket(AF_INET,SOCK_STREAM, 0); //定义sockaddr_in struct sockaddr_in server_sockaddr; server_sockaddr.sin_family = AF_INET;//TCP/IP协议族 server_sockaddr.sin_port = htons(8023);//端口号 server_sockaddr.sin_addr.s_addr = inet_addr("127.0.0.1");//ip地址,127.0.0.1是环回地址,相当于本机ip //bind,成功返回0,出错返回-1 if(bind(server_sockfd,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr))==-1) { perror("bind");//输出错误原因 exit(1);//结束程序 } //listen,成功返回0,出错返回-1 if(listen(server_sockfd,20) == -1) { perror("listen");//输出错误原因 exit(1);//结束程序 } //客户端套接字 struct sockaddr_in client_addr; socklen_t length = sizeof(client_addr); //成功返回非负描述字,出错返回-1 int conn = accept(server_sockfd, (struct sockaddr*)&client_addr, &length); if(conn<0) { perror("connect");//输出错误原因 exit(1);//结束程序 } cout<<"客户端成功连接n"; //接收缓冲区 char buffer[1000]; //不断接收数据 while(1) { memset(buffer,0,sizeof(buffer)); int len = recv(conn, buffer, sizeof(buffer),0); //客户端发送exit或者异常结束时,退出 if(strcmp(buffer,"exit")==0 || len<=0) break; cout<<"收到客户端信息:"< 二、 在Linux下编译实现服务端与客户端通信 三、实验操作截图
- 1、新建一个文件夹,将代码放进去,然后进入终端,找到代码文件夹;
- 2、进入超级账户,用su或者su root进入超级账户,如果遇到鉴定故障问题,可以换用sudo su命令进入超级账户;
- 3、然后对服务端(server)进行编译操作连接客户端;
- 编译:g++ -o 代码文件夹 .cpp文件(g++ -o server server.cpp)
- 运行:./代码文件夹(./server)
- 4、新建一个终端,找到文件夹进入超级用户(和第2步一样);
- 5、对客户端(client)进行编译操作连接服务端;
- 6、连接成功后客户端对服务端进行发消息验证,服务端收到相关消息后即实验成功进行!
1、服务端
2、客户端
四、注意事项
***注意***
五、实验成功截图
- 1、如果遇到拒绝连接,可能是没有相关操作权限,需要进入到超级用户root权限下;如果不行的话试着升级一下Linux系统软件包;
- 2、如果遇到相应的端口被占用无法连接,可以试着改一下端口号,然后再进行相关操作;
- 修改端口号需要找到代码文件夹,利用vim命令进入后修改代码文件
- 3、操作过程中一定要使用正确的相关命令进行操作,不然很容易出现错误!



