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很容易的在客户端和服务器端交换消息。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)