linux——服务器与客户端实现聊天功能

先联想一下聊天的场景,假设甲和乙在聊天,他们每个人都能够发送给对方一句话甚至多句话,也能接收到对方发来的一句或多句话,也就是说,甲在发送一句话给乙的时候,同时也能接收到乙发来的信息,而且甲还能连续发多条信息,对于乙来说也是一样。这也就是说程序当中必须要有两个执行流,一个用于发信息,一个用于接受信息。

在这里插入图片描述

服务器

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>
#include <arpa/inet.h>pthread_t r_tid=0,w_tid=0;void *do_read(void *client_sockid_)
{int client_sockid=*((int *)client_sockid_);char send[100]={0};while(1){fgets(send,sizeof(send),stdin);if(strcmp(send,"NULL\n")==0){printf("您已下线\n");break;}write(client_sockid,send,sizeof(send));memset(send,0,strlen(send));}pthread_cancel(w_tid);//结束发送操作线程
}void *do_write(void *client_sockid_)
{int client_sockid=*((int *)client_sockid_);char receive[100]={0};while(1){if(!read(client_sockid,receive,sizeof(receive))){printf("对方已下线,已退出\n");break;}printf("\t\t\t");fputs(receive,stdout);memset(receive,0,sizeof(receive));}pthread_cancel(r_tid);//结束接收操作线程
}int internet()
{struct sockaddr_in sockaddr;sockaddr.sin_family=AF_INET;sockaddr.sin_port=htons(5188);sockaddr.sin_addr.s_addr=htonl(INADDR_ANY);int sockid=socket(AF_INET,SOCK_STREAM,0);const int on=1;if(setsockopt(sockid,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on))<0){printf("setsockopt\n");return 0;}if(bind(sockid,(struct sockaddr *)&sockaddr,sizeof(sockaddr))<0){printf("bind\n");return 0;}if(listen(sockid,SOMAXCONN)<0){printf("listen\n");return 0;}struct sockaddr_in other_sock_addr;socklen_t other_sock_addr_len=sizeof(other_sock_addr);pid_t pid=0;int client_sockid=0;client_sockid=accept(sockid,(struct sockaddr *)&other_sock_addr,&other_sock_addr_len);printf("ip=%s,port=%d\n",inet_ntoa(other_sock_addr.sin_addr),ntohs(other_sock_addr.sin_port));if(client_sockid<0){printf("accept\n");return 0;}pthread_create(&r_tid,NULL,do_read,(void *)&client_sockid);pthread_create(&w_tid,NULL,do_write,(void *)&client_sockid);pthread_join(r_tid,NULL);pthread_join(w_tid,NULL);close(sockid);close(client_sockid);
}int main()
{internet();return 0;
}

客户端

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>pthread_t r_tid=0,w_tid=0;void *do_read(void *sockid_)
{int sockid=*((int *)sockid_);char send[100]={0};while(1){fgets(send,sizeof(send),stdin);if(strcmp(send,"NULL\n")==0){printf("您已下线\n");break;}write(sockid,send,sizeof(send));memset(send,0,strlen(send));}pthread_cancel(w_tid);//结束发送操作线程
}void *do_write(void *sockid_)
{int sockid=*((int *)sockid_);char receive[100]={0};while(1){if(!read(sockid,receive,sizeof(receive))){printf("对方已下线,即将退出\n");break;}printf("\t\t\t");fputs(receive,stdout);memset(receive,0,sizeof(receive));}pthread_cancel(r_tid);//结束接收操作进程
}int internet()
{struct sockaddr_in addr;addr.sin_family=AF_INET;addr.sin_port=htons(5188);addr.sin_addr.s_addr=inet_addr("127.0.0.1");int sockid=socket(AF_INET,SOCK_STREAM,0);socklen_t addrlen=sizeof(addr);if(connect(sockid,(struct sockaddr *)&addr,addrlen)<0){printf("connect\n");return 0;}pthread_create(&r_tid,NULL,do_read,(void *)&sockid);pthread_create(&w_tid,NULL,do_write,(void *)&sockid);pthread_join(r_tid,NULL);pthread_join(w_tid,NULL);close(sockid);return 0;
}int main()
{internet();return 0;
}

以上程序只能在局域网内通信。实现跨局域网聊天请点击

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/545735.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有关链表的小技巧,我都给你总结好了

链表链表是数据结构里一个很基础但是又很爱考的线性结构&#xff0c;链表的操作相对来说比较简单&#xff0c;但是非常适合考察面试者写代码的能力&#xff0c;以及对 corner case 的处理&#xff0c;还有指针的应用很容易引起 NPE (null pointer exception)。综合以上原因&…

long类型20位示例_Java Long类numberOfTrailingZeros()方法及示例

long类型20位示例长类numberOfTrailingZeros()方法 (Long class numberOfTrailingZeros() method) numberOfTrailingZeros() method is available in java.lang package. 在java.lang包中提供了numberOfTrailingZeros()方法 。 numberOfTrailingZeros() method is used to retu…

ActiveReports 9实战教程(1): 手把手搭建环境Visual Studio 2013 社区版

ActiveReports 9刚刚发布3天&#xff0c;微软就发布了 Visual Studio Community 2013 开发环境。Visual Studio Community 2013 提供完整功能的 IDE &#xff0c;可开发 Windows、Android 和 iOS 应用。支持&#xff1a;C, Python, HTML5, JavaScript, 和 C#,VB, F# 语言的开发…

第 1-1 课:Java 程序是如何执行的?

了解任何一门语言的精髓都是先俯览其全貌&#xff0c;从宏观的视角把握全局&#xff0c;然后再深入每个知识点逐个击破&#xff0c;这样就可以深入而快速的掌握一项技能。同样学习 Java 也是如此&#xff0c;本节就让我们先从整体来看一下 Java 中的精髓。 Java 介绍 Java 诞…

linux——两个客户端之间实现聊天(TCP、单线程)

两个客户端实现聊天功能&#xff0c;那么服务器作转发信息的作用&#xff0c;客户端A先将信息发送到服务器&#xff0c;在由服务器将信息发送到客户端B&#xff0c;客户端B也是一样。客户端与服务器都应该有两个执行流&#xff0c;服务器的一个执行流不断的接收客户端A的信息并…

Java ClassLoader getSystemClassLoader()方法与示例

ClassLoader类getSystemClassLoader()方法 (ClassLoader Class getSystemClassLoader() method) getSystemClassLoader() method is available in java.lang package. getSystemClassLoader()方法在java.lang包中可用。 getSystemClassLoader() method is used to find the Sys…

zabbix邮件通知,短信通知配置详解

一、使用邮件发送报警1、前提条件是zabbix我们已经安装完成2、在官网我们下载msmtp的文件http://sourceforge.net/projects/msmtp/files/msmtp/1.4.32/msmtp-1.4.32.tar.bz2/download tar xf msmtp-1.4.32.tar.bz2 cd msmtp-1.4.32 ./configure--prefix/usr/local/msmtp make m…

关于怎么获取jsp的web站点的目录问题

发布了自己的web站点之后&#xff0c;想要访问站点文件夹下的某个文本文件&#xff0c;但是却不知道怎么找到文件根目录&#xff0c;一直尝试总是找不到文件……好不容易在网上翻了堆代码找到两句我现在急用的……so//根目录路径的获取System.out.println(request.getSession()…

开篇词:如何轻松获得 Offer

你好,我是王磊,某上市公司技术研发经理,前奇虎 360 员工,有着 10 余年的编程工作经验,目前主要负责新员工技术面试和构建企业技术架构的相关事宜。随着面试过的人数增加,我发现面试者们暴露出了技术方面的很多问题,为了让更多面试者少走一些弯路,也为了让企业能招到合适…

Java类类getGenericSuperclass()方法及示例

类类getGenericSuperclass()方法 (Class class getGenericSuperclass() method) getGenericSuperclass() method is available in java.lang package. getGenericSuperclass()方法在java.lang包中可用。 getGenericSuperclass() method is used to return the Type denoting th…

linux——客户端服务器文件传输

实现文件传输并不难&#xff0c;只需用fopen、fread、fwrite、fclose这几个函数对文件操作即可。文本文件就不说了&#xff0c;我们就已下图为例。 我们先来看看这个图片文件里装的是什么&#xff0c;我们以notpad打开这个图片&#xff0c;结果如下&#xff0c;是一堆乱码。 …

Android第二十五期 - 猜歌小游戏

代码已经整理好了&#xff0c;如下效果图&#xff1a;地址&#xff1a;http://yunpan.cn/cArkdixh5NbpQ 提取码 9300转载于:https://blog.51cto.com/liangxiao/1579433

第 1-2 课:你不知道的基础数据类型和包装类 + 面试题

基本数据类型 Java 基础数据按类型可以分为四大类&#xff1a;布尔型、整数型、浮点型、字符型&#xff0c;这四大类包含 8 种基础数据类型。 布尔型&#xff1a;boolean整数型&#xff1a;byte、short、int、long浮点型&#xff1a;float、double字符型&#xff1a;char 八种…

TomCat JDK环境变量

TomCat安装之前要安装JDK&#xff0c;安装完之后添加环境变量&#xff1b;变量名&#xff1a;Java_Home 变量值&#xff1a; D:\jdk 1.6 变量名&#xff1a;Classpath 变量值&#xff1a; D:\jdk 1.6\jre\lib\rt.jar;.; 变量名&#xff1a;Path 变量值&#xff1a; D:\jdk 1.6\…

网络编程C/S模型怎样才能实现真正的聊天功能

学完socket编成后&#xff0c;就迫不及待地写一个简单的聊天程序&#xff0c;好在同学面前装装逼&#xff0c;毕竟外行看热闹。然而在自己的电脑上运行是毫无差错&#xff0c;发送接收都没有问题&#xff0c;然而将客户端的exe文件打包后发送给其他电脑上运行时程序死在了conne…

c++重载++运算符_C ++运算符重载| 查找输出程序| 套装3

c重载运算符Program 1: 程序1&#xff1a; #include <iostream>using namespace std;class Test {public:int A;Test(){A 0;}Test(int a){A a;}void print(){cout << A << " ";}};Test operator*(Test T1, Test T2){Test temp;temp.A T1.A * T…

将数据库表导入到solr索引

将数据库表导入到solr索引 编辑solrcofnig.xml添加处理器 <requestHandler name"/dataimport" class"org.apache.solr.handler.dataimport.DataImportHandler"><lst name"defaults"><str name"config">data-config…

第 1-4 课:Java 中的运算符和流程控制 + 面试题

算术运算符 Java 中的算法运算符,包括以下几种: 算术运算符名称举例+加法1+2=3-减法2-1=1*乘法2*3=6/除法24/8=3%求余24%7=3++自增1int i=1;i++--自减1int i=1;i--我们本文要重点讲的是 “++” 和 “--”,其他的算术运算符相对比较简单直观,本文就不花精力去讲解了,之所以…

p标题/p能设置字体的大小和颜色

添加style <p style"color:red;font-size:16px;">标题</p>方法2&#xff1a;引入CSS<style type"text/css">.title{color:red;font-size:16px;}</style><body><p class"title">标题</p></body>…

scala中创建时间序列_如何从Scala中的序列中提取唯一元素?

scala中创建时间序列While storing data elements to a data structure or extracting raw data duplicate data might be included and this data decreases the efficiency of the code. So, eliminating duplicate data or extracting unique elements is important. 在将数…