编写一段Socket服务端程序,监听端口8888,接受到Client的消息“nihao”后,将“nihao”写回到客户端,关闭socket。

Java Socket编程实例解析
本文通过一个具体的Java代码示例,详细介绍了如何使用Socket进行网络通信。包括创建ServerSocket监听特定端口,接受客户端连接请求,并实现简单的文本消息收发功能。此外,还探讨了Socket与SocketChannel的基本区别。

 

2. Socket 和SocketChannel的区别?

等待答案

实现聊天室,以及私聊功能 一个服务端和多个客户端服务端监听stdin,需要处理客户端退出逻辑 基本思路:多个客户端从stdin向服务端消息,也recv服务端发来的消息,服务端只是一边读一边转发给其他人 //读取字段,约定字段: //第一位1表示群聊,2表示私聊;第二位至第五位表示对谁私聊; //比如1000-1hello,表示群聊;20002nihao,表示对2号私聊:nihao 我的代码如下,这是服务端的代码。比如1对2私聊,在2号客户端显示消息,格式为:1user:message,这个怎么实现,尽量少改动我的代码。 int main(int argc,char *argv[]) { ARGS_CHECK(argc,3); //1.创建一个通信socket int sockfd=socket(AF_INET,SOCK_STREAM,0); ERROR_CHECK(sockfd,-1,"socket"); //2.绑定到socket上,分配一个本机协议地址(ip地址+端口号) struct sockaddr_in addr; addr.sin_family=AF_INET; addr.sin_port=htons(atoi(argv[2])); addr.sin_addr.s_addr=inet_addr(argv[1]); bind(sockfd,(struct sockaddr*)&addr,sizeof(addr)); //3.listen,监听,通信socket变为监听socket listen(sockfd,50); char sendBuf[4096]; char toUserID[5]; char fromUserID[5]; fd_set monitorset;//监视集合 fd_set readyset;//就绪集合 int netfd[PEOPLENUM]; for(int i=0;i<1024;i++){ netfd[i]=-1;//-1表示netfd[i]无效 } FD_ZERO(&monitorset); FD_SET(sockfd,&monitorset); int i=0; while(1){ memcpy(&readyset,&monitorset,sizeof(fd_set)); select(1024,&readyset,NULL,NULL,NULL); if(FD_ISSET(sockfd,&readyset)){ //说明来连接了 netfd[i]=accept(sockfd,NULL,NULL); printf("neftd[%d] connected\n",i); FD_SET(netfd[i],&monitorset); ++i; continue; } for(int j=0;j<i;j++){ if(FD_ISSET(netfd[j],&readyset)){ //netfd[j]来消息了或断开了 bzero(sendBuf,sizeof(sendBuf)); ssize_t sret=recv(netfd[j],sendBuf,sizeof(sendBuf),0); ERROR_CHECK(sret,-1,"recv"); if(sret==0){ //netfd[j]断开连接了 printf("netfd[%d] disconnected\n",j); netfd[j]=-1; FD_CLR(netfd[j],&monitorset); close(netfd[j]); continue; } if(sendBuf[0]==&#39;1&#39;){//群聊,就不关心用户ID了 for(int k=0;k<i;k++){ if(netfd[k]!=-1 && j!=k){//将消息转发给其他连接有效的用户 send(netfd[k],sendBuf,strlen(sendBuf),0); } } } if(sendBuf[0]==&#39;2&#39;) {//私聊,提取用户id strncpy(toUserID,sendBuf+1,4); int toUser=atoi(toUserID); //改掉ID字段,改为发来的用户 /* sprintf(fromUserID,"%s",j); */ /* printf("fromUserID=%s\n",fromUserID); */ /* for(int k=1,l=0;k<5;k++,l++){ */ /* sendBuf[i]=fromUserID[l]; */ /* } */ if(netfd[toUser] !=-1 ){//连接有效 send(netfd[toUser],sendBuf,strlen(sendBuf),0); } } } } } return 0; }
最新发布
05-29
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值