字符串解析和Socket简易聊天程序

字符串解析和Socket简易聊天程序,第1张

1.解析字符串

2.创建一个Request类,来解析字符串,并进行封装

3.在stringTools 类下,把原来public static void testString()更改为public static Request testString(String str) ,且加上request返回对象

Request:方法名——是一个有返回值的方法,返回的是Request类型的对象;之前的void是一个空的方法,是没有返回值的;

1)public static void testString()中的void改为Request,这时候发现testString()报错了,不要慌,看下报错信息(This method must return a result of type Request)——英文翻译过来就是大白话:此方法必须返回类型请求的结果。

2)选择"Add return statement"(百度翻译:添加返回语句)

1)request.setFangFa(fangFa)

2)request.setUrl(url)

3)request.setBanBen(banBen)

4)request.setProtocal(protocal)

5)request.setIp(ip)

6)request.setPort(port)

7)request.setPrjName(prjName)

8)request.setResource(resource)

9)request.setMap(map)

Day1210学习的内容

1.Tomcat

2.HTTPServlet

3.Response

4.Login

5.web.properties

6.TomcatTest

1.服务端

2.客户端

注意:启动时需要先启动服务端,再启动客户端

服务端:

客户端:

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<errno.h>

#include<sys/socket.h>

#include<arpa/inet.h>

#include<netinet/in.h>

#include<sys/types.h>

#include<unistd.h>

#include<sys/time.h>

#defineBUFLEN1024

#definePORT6666

#defineLISTNUM20

intmain()

{

intsockfd,newfd

structsockaddr_ins_addr,c_addr

charbuf[BUFLEN]

socklen_tlen

unsignedintport,listnum

fd_setrfds

structtimevaltv

intretval,maxfd

/*建立socket*/

if((sockfd=socket(PF_INET,SOCK_STREAM,0))==-1){

perror("socket")

exit(errno)

}else

printf("socketcreatesuccess!\n")

memset(&s_addr,0,sizeof(s_addr))

s_addr.sin_family=AF_INET

s_addr.sin_port=htons(PORT)

s_addr.sin_addr.s_addr=htons(INADDR_ANY)

/*把地址和端口帮定到套接字上*/

if((bind(sockfd,(structsockaddr*)&s_addr,sizeof(structsockaddr)))==-1){

perror("bind")

exit(errno)

}else

printf("bindsuccess!\n")

/*侦听本地端口*/

if(listen(sockfd,listnum)==-1){

perror("listen")

exit(errno)

}else

printf("theserverislistening!\n")

while(1){

printf("*****************聊天开始***************\n")

len=sizeof(structsockaddr)

if((newfd=accept(sockfd,(structsockaddr*)&c_addr,&len))==-1){

perror("accept")

exit(errno)

}else

printf("正在与您聊天的客户端是:%s:%d\n",inet_ntoa(c_addr.sin_addr),ntohs(c_addr.sin_port))

while(1){

FD_ZERO(&rfds)

FD_SET(0,&rfds)

maxfd=0

FD_SET(newfd,&rfds)

/*找出文件描述符集合中最大的文件描述符*/

if(maxfd<newfd)

maxfd=newfd

/*设置超时时间*/

tv.tv_sec=6

tv.tv_usec=0

/*等待聊天*/

retval=select(maxfd+1,&rfds,NULL,NULL,&tv)

if(retval==-1){

printf("select出错,与该客户端连接的程序将退出\n")

break

}elseif(retval==0){

printf("waiting...\n")

continue

}else{

/*用户输入信息了*/

if(FD_ISSET(0,&rfds)){

/******发送消息*******/

memset(buf,0,sizeof(buf))

/*fgets函数:从流中读取BUFLEN-1个字符*/

fgets(buf,BUFLEN,stdin)

/*打印发送的消息*/

//fputs(buf,stdout)

if(!strncasecmp(buf,"quit",4)){

printf("server请求终止聊天!\n")

break

}

len=send(newfd,buf,strlen(buf),0)

if(len>0)

printf("\t消息发送成功:%s\n",buf)

else{

printf("消息发送失败!\n")

break

}

}

/*客户端发来了消息*/

if(FD_ISSET(newfd,&rfds)){

/******接收消息*******/

memset(buf,0,sizeof(buf))

/*fgets函数:从流中读取BUFLEN-1个字符*/

len=recv(newfd,buf,BUFLEN,0)

if(len>0)

printf("客户端发来的信息是:%s\n",buf)

else{

if(len<0)

printf("接受消息失败!\n")

else

printf("客户端退出了,聊天终止!\n")

break

}

}

}

}

/*关闭聊天的套接字*/

close(newfd)

/*是否退出服务器*/

printf("服务器是否退出程序:y->是;n->否?")

bzero(buf,BUFLEN)

fgets(buf,BUFLEN,stdin)

if(!strncasecmp(buf,"y",1)){

printf("server退出!\n")

break

}

}

/*关闭服务器的套接字*/

close(sockfd)

return0

}

扩展资料

C语言编写一个简单的ATM系统

#include<stdio.h>

intchoice

intshow_menu()

doubleget_money()

voiddeposit(double)

voidwithdraw(double)

doubleaccount=0.0

intmain(intargc,constchar*argv[])

{

system("COLOR5f")

show_menu()

doubletemp

while(choice!=0)

{

system("cls")

switch(choice)

{

case1:

printf("您的当前余额为:%.2f\n",get_money())

break

case2:

printf("请输入您的存款金额:\n")

scanf("%lf",&temp)

deposit(temp)

printf("您的当前余额为:%.2f\n",get_money())

break

case3:

printf("您的当前余额为:%.2f\n",get_money())

printf("请输入您的取款金额:\n")

scanf("%lf",&temp)

withdraw(temp)

printf("您的当前余额为:%.2f\n",get_money())

break

default:

break

}

getchar()

choice=show_menu()

}

printf("欢迎您下次再来中国银行为您提供的服务,再见!\n")

return0

}

intshow_menu()

{

printf("*****欢迎使用中国银行行为为您提供的服务******\n")

printf("\n1.查询账户余额2.存款3.取款0.退出\n")

printf("\n请选择服务种类:")

scanf("%d",&choice)

returnchoice

}

doubleget_money()

{

returnaccount

}

voiddeposit(doublemoney)

{

account=account+money

}

voidwithdraw(doublemoney)

{

if(account<money)

printf("抱歉,余额不足,不能取%.2f这么多钱!\n",money)

else

account=account-money

}

我们将首先通过查看客户端代码。所有聊天互动都有HomeView处理,首先需要在 /public/js/models/main.js中定义HomeModel。

var HomeModel = Backbone.Model.extend({

 defaults: {

   // Backbone collection for users

   onlineUsers: new UserCollection(),

   // Backbone collection for user chats, 初始化一个预定义聊天模型

   userChats: new ChatCollection([

     new ChatModel({sender: '', message: 'Chat Server v.1'})

   ])

 },

 // 添加一个新用户到 onlineUsers collection

 addUser: function(username) {

   this.get('onlineUsers').add(new UserModel({name: username}))

 },

 // 从onlineUsers collection中移除一个用户

 removeUser: function(username) {

   var onlineUsers = this.get('onlineUsers')

   var u = onlineUsers.find(function(item) {

         return item.get('name') == username

       })

   if (u) {

     onlineUsers.remove(u)

   }

 },

 // 添加一个新的聊天到 userChats collection

 addChat: function(chat) {

   this.get('userChats').add(new ChatModel({sender: chat.sender, message: chat.message}))

 },

})

我们利用Backbone集合来侦听集合变化。这些集合的更新会直接由视图自动反映出来。接下来,需要在/public/index.html中定义home模板。

<script type="text/template" id="home-template">

 <div class="row">

   <div class="col-md-10">

     <div class="panel panel-default">

       <div class="panel-heading">Lobby</div>

       <div class="panel-body">

         <div class="nano">

           <div class="content">

             <div class="list-group" id="chatList"></div>

           </div>

         </div>

         <form>

           <input class="form-control" type="text" id="chatInput"></input>

         </form>

       </div>

     </div>

   </div>

   <div class="col-md-2">

     <div class="panel panel-default">

       <div class="panel-heading">

         <h3 class="panel-title">Online Users <span class="badge pull-right" id="userCount"></span></h3>

       </div>

       <div class="panel-body">

         <div class="nano">

           <div class="content">

             <div class="list-group" id="userList"></div>

           </div>

         </div>

       </div>

     </div>

   </div>

 </div>

</script>

聊天客户端

接下来, 让我们来定义 我们的 Socket.IO 聊天客户端 。 客户端 与服务器端的通信,主要通过发送消息和监听通知 来完成。 这些通知 触发事件 与所述控制器 进行通信。请参阅 下面 /public/ JS / socketclient.js的代码 。

var ChatClient = function(options) {

 // 避免冲突

 var self = this

 // app event bus

 self.vent = options.vent

 // server hostname replace with your server's hostname eg: http://localhost

 self.hostname = 'http://chatfree.herokuapp.com'

 // connects to the server

 self.connect = function() {

   // connect to the host

   self.socket = io.connect(self.hostname)

   // set responseListeners on the socket

   self.setResponseListeners(self.socket)

 }

 // send login message

 self.login = function(name) {

   self.socket.emit('login', name)

 }

 // send chat message

 self.chat = function(chat) {

   self.socket.emit('chat', chat)

 }

 self.setResponseListeners = function(socket) {

   // handle messages from the server

   socket.on('welcome', function(data) {

     // request server info

     socket.emit('onlineUsers')

     self.vent.trigger('loginDone', data)

   })

   socket.on('loginNameExists', function(data) {

     self.vent.trigger('loginNameExists', data)

   })

   socket.on('loginNameBad', function(data) {

     self.vent.trigger('loginNameBad', data)

   })

   socket.on('onlineUsers', function(data) {

     console.log(data)

     self.vent.trigger('usersInfo', data)

   })

   socket.on('userJoined', function(data) {

     self.vent.trigger('userJoined', data)

   })

   socket.on('userLeft', function(data) {

     self.vent.trigger('userLeft', data)

   })

   socket.on('chat', function(data) {

     self.vent.trigger('chatReceived', data)

   })

 }

}

使用Socket.IO可以非常简单的发送和接受通信数据,上面的代码中,使用了下面的两个方法

socket.emit(message, [callback])  向服务器端发送消息

socket.on(message, callback)      用于接收来自服务器的消息

让我们来看一下他们的通信协议

主控制器

客户端最后一步,主控制器,它控制了VIEW,MODEL和socket客户端,代码在/public/js/main.js中

var MainController = function() {

 var self = this

 // Event Bus for socket client

 self.appEventBus = _.extend({}, Backbone.Events)

 // Event Bus for Backbone Views

 self.viewEventBus = _.extend({}, Backbone.Events)

 // initialize function

 self.init = function() {

   // create a chat client and connect

   self.chatClient = new ChatClient({vent: self.appEventBus})

   self.chatClient.connect()

   // create our views, place login view inside container first.

   self.loginModel = new LoginModel()

   self.containerModel = new ContainerModel({

     viewState: new LoginView({

       vent: self.viewEventBus,

       model: self.loginModel

     })

   })

   self.containerView = new ContainerView({model: self.containerModel})

   self.containerView.render()

 }

 // View Event Bus Message Handlers

 self.viewEventBus.on('login', function(name) {

   // socketio login

   self.chatClient.login(name)

 })

 self.viewEventBus.on('chat', function(chat) {

   // socketio chat

   self.chatClient.chat(chat)

 })

 // Socket Client Event Bus Message Handlers

 // triggered when login success

 self.appEventBus.on('loginDone', function() {

   self.homeModel = new HomeModel()

   self.homeView  = new HomeView({vent: self.viewEventBus, model: self.homeModel})

   // set viewstate to homeview

   self.containerModel.set('viewState', self.homeView)

 })

 // triggered when login error due to bad name

 self.appEventBus.on('loginNameBad', function(name) {

   self.loginModel.set('error', 'Invalid Name')

 })

 // triggered when login error due to already existing name

 self.appEventBus.on('loginNameExists', function(name) {

   self.loginModel.set('error', 'Name already exists')

 })

 // triggered when client requests users info

 // responds with an array of online users.

 self.appEventBus.on('usersInfo', function(data) {

   var onlineUsers = self.homeModel.get('onlineUsers')

   var users = _.map(data, function(item) {

     return new UserModel({name: item})

   })

   onlineUsers.reset(users)

 })

 // triggered when a client joins the server

 self.appEventBus.on('userJoined', function(username) {

   self.homeModel.addUser(username)

   self.homeModel.addChat({sender: '', message: username + ' joined room.'})

 })

 // triggered when a client leaves the server

 self.appEventBus.on('userLeft', function(username) {

   self.homeModel.removeUser(username)

   self.homeModel.addChat({sender: '', message: username + ' left room.'})

 })

 // triggered when chat receieved

 self.appEventBus.on('chatReceived', function(chat) {

   self.homeModel.addChat(chat)

 })

}

最后,我们需要定义一个MainController入口,调用init方法,代码位于/public/js/main.js中

聊天服务器端

应用程序的最后一部分是聊天服务器。它主要负责维护在线用户列表,广播聊天消息。比如,首先,服务器会给一个新的客户的连接请求命名,然后通过刚刚建立的socket,连接事件handlers。socket handler处理如下事件:    socket.on(message, callback)  - 在收到新邮件时回调函数被调用。消息可以是任何类型的数据,这取决于发送的消息。    socket.on('disconnect', callback) - 当socket断开连接时候,回调函数被调用。    socket.emit(message, args) - 通过socket发送消息。     socket.broadcast.send(message, args)  - 广播信息到除发送者之外的所有socket。现在,我们已经看到了handler socket是如何工作的。首先,需要在/scripts/chatserver.js中定义一个用户模型 :

总结

我们已经看到了如何使用Backbone和Socket.IO构建一个简单的聊天应用程序。还有很多没有在本文中涉及的Socket.IO性能,例如rooms和namespaces。通过这篇文章,我们可以看出使用Socket.IO很容易的在客户端和服务器端交换消息。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11017330.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存