2016-03-15 18:18:40 sevenquan 阅读数 1339

code4app中看到的仿战旗 TV app的Demo,值得收藏。

 战旗 TV app (可以播放视频),可以学习到其中视图的布局处理技巧。


  代码源:http://www.code4app.com/ios/仿照战旗TV-app-持续更新中-可以播放视频/25b6718c-e455-11e5-82b2-00163e0606f4


iOS广州、深圳群496146057

0
2016-03-21 15:04:32 yangmeng13930719363 阅读数 2197

仿百思不得姐app


首先感谢李明杰MJ老师,(@M了个J)。

项目截图

目前只完成了一些简单的界面,使用cocoaPods管理代码,用到了一些常用的第三方库,包括AFNetworking,DACircularProgress,M13ProgressSuite,MJExtension,MJRefresh,pop,SDWebImage,SVProgressHUD。

后面还会继续更新。

代码以及更新地址:

github地址


下面是记录编码过程中的一些记录:

UITabBarController.h

通过appearance统一设置tabbarItem的样式;
后面带有UI_APPEARANCE_SELECTOR的方法,都可以通过appearance对象来统一设置。

NSMutableDictionary *attrs = [NSMutableDictionary dictionary];
    attrs[NSForegroundColorAttributeName] = [UIColor grayColor];
    NSMutableDictionary *selectedAttrs = [NSMutableDictionary dictionary];
    selectedAttrs[NSForegroundColorAttributeName] = [UIColor blackColor];
    //通过appearance统一设置tabbarItem的样式
    UITabBarItem *item = [UITabBarItem appearance];
    [item setTitleTextAttributes:attrs forState:UIControlStateNormal];
    [item setTitleTextAttributes:selectedAttrs forState:UIControlStateSelected];

设置tabbarItem的图片不进行渲染(默认进行渲染)。

方法一:

image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
//设置选中图片不进行渲染
vc1.tabBarItem.selectedImage = image;

方法二:

在Assets.xcassets中选择需要设置的图片:

只读属性可以通过KVC来改变

vc.title = title;

等价于下面的代码:

vc.navigationItem.title = title;
vc.tabBarItem.title = title;

分类

在分类中声明@property,只会生成方法的声明,不会生成方法的实现和带有_下划线的成员变量。

在xib或storyboard中,输入的文字如果想换行,可以按住option,然后回车,即可实现换行。

使用Xcode安装pods的时候,可能会出现下面的情况:

Updating local specs repositories
````

解决办法使用终端,切换到项目目录,执行下面命令:





<div class="se-preview-section-delimiter"></div>

pod install 换成pod install –verbose –no-repo-update这个命令






<div class="se-preview-section-delimiter"></div>

## 在UITableViewCell中,设置selection为None之后,即使cell被选中,内部的子控件也不会进入高亮状态。

解决办法:





<div class="se-preview-section-delimiter"></div>

/*
* 可以在这个方法中监听cell的选中和取消选中
*/
-(void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
//在这里重新设置选中状态的属性
}






<div class="se-preview-section-delimiter"></div>

## 修改占位文字的颜色

方法一:





<div class="se-preview-section-delimiter"></div>

NSMutableDictionary *attrs = [NSMutableDictionary dictionary];
attrs[NSForegroundColorAttributeName] = [UIColor grayColor];
//带有属性的文字(富文本)
NSMutableAttributedString *placeholder = [[NSMutableAttributedString alloc] initWithString:@”手机号” attributes:attrs];
self.phoneField.attributedPlaceholder = placeholder;


方法二:

重写UITextField的方法:





<div class="se-preview-section-delimiter"></div>

-(void)drawPlaceholderInRect:(CGRect)rect;


设置UITextField的属性。





<div class="se-preview-section-delimiter"></div>

## 运行时(Runtime)

能做底层操作(比如访问隐藏的成员变量)。





<div class="se-preview-section-delimiter"></div>

+(void)initialize {
unsigned int count = 0;
Ivar *ivars = class_copyIvarList([UITextView class], &count);
for (int i = 0; i < count; i++) {
//去除成员变量
Ivar ivar = *(ivars + i);
//打印成员变量名字
YMLog(@”%s”,ivar_getName(ivar));
}
//释放
free(ivars);
}






<div class="se-preview-section-delimiter"></div>

-(void)setHighlighted:(BOOL)highlighted {
//聚焦
//修改占位符文字颜色
[self setValue:[UIColor whiteColor] forKeyPath:@”_placeholderLabel.textColor”];
}







<div class="se-preview-section-delimiter"></div>

//如果发现控件的位置和尺寸不是自己设置的,那么有可能是自动伸缩属性导致
self.autoresizingMask = UIViewAutoresizingNone;



判断图片是否为gif图片

取出图片的第一个字节,就可以判断出图片的真是类型。

窗口级别:





<div class="se-preview-section-delimiter"></div>

UIWindowLevelNormal < UIWindowLevelStatusBar < UIWindowLevelAlert
“`

2017-08-29 11:35:44 sunnyaigd830 阅读数 1934

iOS精选源码

iOS一种弹出视图效果带动画

一个快速便捷、无侵入、可扩展的动画弹框库

高仿Elk - 旅行货币转换器

iOS内分享的界面、功能一体化解决方案

使用Olami sdk实现一个语音查询股票的iOS程序

iOS高仿微信完整项目源码

分段绘制折线指示图, 点击效果

最新环信推送封装 v3.0【附代码】

仿照网易爱玩APP

APP启动视频




iOS优质博客

iOS 一行代码搞定 KVO

前言发现好久没有研究、学习iOS优秀开源代码,现在大部分时间都在写业务代码, 学习其他语言及一些杂七杂八的事情。所以现在就从简短的开源代码开始学习。这一篇就写FaceBook, 这个极度热爱开源的公司, 它的一套关于KVO的开源代码。GitHub代码演示代码地址正文FBKVOController介绍简单来说,Faceb... 阅读原文

iOS 工程自动化整理分析

4 月份参加 2017@Swift 大会的时候有幸听到了 @zesming 大佬关于美团组件化的 Topic,有一张图印象特别深刻。来自 @zesming 大佬后来跟 @zesming 大佬沟通怎么去整理组件自动构建发布思路的时候他也跟我提到了这张图。所以我准备围绕这张图来整理一下 iOS 工程自动化的思路。基础知识首... 阅读原文

ios原生项目集成react-native过程记录

开发环境准备
首先按照(http:/ /reactnative.cn/docs/0.47/getting-started.html)来安装React Native在iOS平台上所需的一切依赖软件(比如npm)。
一.创建工程
我这里用的是React Native官网上的(https:/ /github.com/... 阅读原文

Apple Music卡片弹出动画的实现

作为程序员,不是在埋头苦干就是在埋头苦干的路上。碰上公司赶项目的时候更是如此。但是,再怎么忙休息的时候也要抽出时间来放放松。健身,音乐,旅游。学会管理自己的生活才能活得更轻松。

说了这么多该回到正题。最近在听音乐时发现Apple Music的卡片弹出动画很有趣,琢磨了一阵子就打算练练手。也顺便想把自定义动画内容整... 阅读原文

3分钟用ARKit平台做出iOS-AR项目

苹果在AR一直布局VR,最近的苹果开发者大会上,果家终于放出大招:iOS移动端ARKit平台以及VR兼容新桌面操作系统macOS High Sierra
和几个做算法设计的程序猿聊天,大家都觉得AR不是什么新东西,尤其是Pokemon Go推出的前后,好多大小公司都对AR有所涉猎,比如阿里的AR红包,百度的AR地图;... 阅读原文

2016-02-02 11:11:01 fjienigui 阅读数 2664

前记

写文前总要说明目的或者吐槽些什么的。
入门iOS也快一年了,到现在还没一个自己独立完成的App,说起来也是惭愧。移动应用,说实在话,我也还在摸索中,实在没什么比较好的idea,但自己又想找一些事干,那么就仿呗。要仿一个App也不是那么简单,撇开移动端的技术,其他需要完成的就有产品、设计、测试、后端接口、服务器,这还不扯到运营、内容、市场。找了一阵子的App后,决定做一个记账方面的App。刚开始是秉持锻炼技术的目的,后来用Charles抓了一下包,发现我每记的一笔账都会被Post到对方的服务器而且还发送到pingma.qq.com做统计,顿时有内裤被人扒了的感觉。恐怕这就是业内的作风吧,冯管数据有用没用,先存起来再说,说不定又可大肆鼓吹大数据处理进入下一个风口继续骗钱过日子。

本文的面向读者

已入门iOS,且用Mac进行开发。
如果你没接触过Mac,那恐怕以下内容都不用看了。

正文

接下来就是怎么获取App素材的步骤了。
1、打开iTunes(mac自带应用),按照下图,先找到App Store,然后搜索框输入想要找的App,比如我输入的是约约(自家产品、避免纠纷),搜索出来后点击获取就可以了,期间可能需要你输入账号密码,填一下就可以了,反正免费。

iTunes.png

2、点击我的应用,找到刚才下载的应用约约,右键点击后选择“在Finder”中显示

我的应用.png

3、如下图所示,我们得到的是一个ipa的安装包,不要直接双击打开,右键点击后选择打开方式:归档实用工具,然后就可以获得一个同名的文件夹,在Payload中找到一个包,右键点击后选择显示包内容。

显示包内容.png

4、到这一步,就算ok了。所有资源都在这个包里面,这里就有App所有的本地素材,当然有一些素材是通过网络加载的(通常是一些需要经常换的素材)。

图片资源.png

5、不过我们可能还会遇到找不到素材的情况,这时候就要留意显示的包中有没有Assets.car文件。当开发者使用Image Assets管理图片资源后,我们下载App解包后无法看到原始的图片,所有的图片都被存储在Assets.car文件中。

images.xcassets.png

那么这时怎么办呢?在stackOverflow上找了一下,有个家伙提供了这么一个方法,用的是开源的cartool工具,专门用于提取.car文件中的资源。

打开终端:输入git clone https://github.com/steventroughtonsmith/cartool
用Xcode打开下载下来的工程,编译后自动生成可执行文件(在工程目录下的product文件夹中),然后找到可执行文件(右键点击后选择show in finder),按照下面的命令执行即可。

cartool.png

命令格式: ./cartool “待解压的文件路径” “解压后的文件路径”
示例:

$ ./cartool /Users/admin/Documents/Assets.car /Users/admin/Documents/

这么一来就可以获取Assets.car中的所有素材了。

首先声明这种做法在一定程度上是侵权的。毕竟每个公司的产品都是每个team的心血,我们极易拿到的素材有可能是设计部门加班加点后的产出,所以我呼吁大家仅作为学习用,切勿用于商业用途。

2014-10-20 00:31:42 leafrenchleaf 阅读数 198
10月19日闲的蛋疼,做了个
仿微信的聊天工具
git地址:[url]https://github.com/killinux/mysocket/tree/master/websocket/project/Test[/url]
ui参考的网上例子http://ios.9tech.cn/news/2013/1111/38520.html
服务端用 tomcat7的websocket
客户端
1.可以用浏览器
2.sockroket的ios客户端,ios8,开发工具xcode6
ios客户端代码如下代码:
ViewController.m

//
// ViewController.m
// BubbleDemo
//
// Created by xiao7 on 14/10/19.
// Copyright (c) 2014年 killinux. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

NSString *websocket_url = @"ws://192.168.0.102:8080/webs/websocket/test";
NSString *myName = @"haoning";
NSString *toName = @"all";
- (void)viewDidLoad {
[super viewDidLoad];
//----init data---begin----
// NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"weixin",@"name",@"这是一个测试",@"content", nil];
// NSDictionary *dict1 = [NSDictionary dictionaryWithObjectsAndKeys:@"haoning",@"name",@"hello",@"content", nil];
// NSDictionary *dict7 = [NSDictionary dictionaryWithObjectsAndKeys:@"weixin",@"name",@",长数据测试。",@"content", nil];
// _resultArray = [NSMutableArray arrayWithObjects:dict,dict1, nil];
// [_resultArray addObject:dict7];

_resultArray = [[NSMutableArray alloc] init];
//----init data---end----
//websocket---begin---
_mywebSocket.delegate = nil;
[_mywebSocket close];
_mywebSocket = [[SRWebSocket alloc] initWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:websocket_url]]];
_mywebSocket.delegate = self;
[_mywebSocket open];
NSLog(@"open success!");
//websocket---end----
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
//pragma websocket
- (void)webSocketDidOpen:(SRWebSocket *)webSocket;
{
NSLog(@"Websocket Connected");
self.title = @"Connected!";
}

- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error;
{
NSLog(@":( Websocket Failed With Error %@", error);
_mywebSocket = nil;
}

- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message;
{
NSLog(@"websocket Received \"%@\"", message);
NSArray *messageArray = [message componentsSeparatedByString:@","];
if(messageArray.count<3){
NSLog(@"error parameter not right:%@",message);
// NSDictionary *dict8 = [NSDictionary dictionaryWithObjectsAndKeys:@"haoning",@"name",message,@"content", nil];
// [_resultArray addObject:dict8];
}else{
NSDictionary *dict8 = [NSDictionary dictionaryWithObjectsAndKeys:messageArray[0],@"name",messageArray[2],@"content", nil];
[_resultArray addObject:dict8];
}
[tableViewList reloadData];
}

- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean;
{
NSLog(@"WebSocket closed");
self.title = @"Connection Closed! (see logs)";
_mywebSocket = nil;
}
//发送消息
- (IBAction)sendBubbleMessage:(id)sender {
NSString *thistext = messageTxt.text;
NSLog(@"sendBubbleMessage:%@",thistext);
// NSDictionary *dict8 = [NSDictionary dictionaryWithObjectsAndKeys:@"haoning",@"name",thistext,@"content", nil];
// [_resultArray addObject:dict8];
// [tableViewList reloadData];
NSString *sendMessage =[myName stringByAppendingFormat:@",%@,%@",toName,thistext];
[_mywebSocket send:sendMessage];
messageTxt.text=nil;
}

//泡泡文本
- (UIView *)bubbleView:(NSString *)text from:(BOOL)fromSelf withPosition:(int)position{

//计算大小
UIFont *font = [UIFont systemFontOfSize:14];
CGSize size = [text sizeWithFont:font constrainedToSize:CGSizeMake(180.0f, 20000.0f) lineBreakMode:NSLineBreakByWordWrapping];

// build single chat bubble cell with given text
UIView *returnView = [[UIView alloc] initWithFrame:CGRectZero];
returnView.backgroundColor = [UIColor clearColor];

//背影图片
UIImage *bubble = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fromSelf?@"SenderAppNodeBkg_HL":@"ReceiverTextNodeBkg" ofType:@"png"]];

UIImageView *bubbleImageView = [[UIImageView alloc] initWithImage:[bubble stretchableImageWithLeftCapWidth:floorf(bubble.size.width/2) topCapHeight:floorf(bubble.size.height/2)]];
//NSLog(@"%f,%f",size.width,size.height);
UILabel *bubbleText = [[UILabel alloc] initWithFrame:CGRectMake(fromSelf?15.0f:22.0f, 20.0f, size.width+10, size.height+10)];
bubbleText.backgroundColor = [UIColor clearColor];
bubbleText.font = font;
bubbleText.numberOfLines = 0;
bubbleText.lineBreakMode = NSLineBreakByWordWrapping;
bubbleText.text = text;
bubbleImageView.frame = CGRectMake(0.0f, 14.0f, bubbleText.frame.size.width+30.0f, bubbleText.frame.size.height+20.0f);
if(fromSelf)
returnView.frame = CGRectMake(320-position-(bubbleText.frame.size.width+30.0f), 0.0f, bubbleText.frame.size.width+30.0f, bubbleText.frame.size.height+30.0f);
else
returnView.frame = CGRectMake(position, 0.0f, bubbleText.frame.size.width+30.0f, bubbleText.frame.size.height+30.0f);

[returnView addSubview:bubbleImageView];
[returnView addSubview:bubbleText];

return returnView;
}

//泡泡语音
- (UIView *)yuyinView:(NSInteger)logntime from:(BOOL)fromSelf withIndexRow:(NSInteger)indexRow withPosition:(int)position{

//根据语音长度
int yuyinwidth = 66+fromSelf;

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.tag = indexRow;
if(fromSelf)
button.frame =CGRectMake(320-position-yuyinwidth, 10, yuyinwidth, 54);
else
button.frame =CGRectMake(position, 10, yuyinwidth, 54);

//image偏移量
UIEdgeInsets imageInsert;
imageInsert.top = -10;
imageInsert.left = fromSelf?button.frame.size.width/3:-button.frame.size.width/3;
button.imageEdgeInsets = imageInsert;

[button setImage:[UIImage imageNamed:fromSelf?@"SenderVoiceNodePlaying":@"ReceiverVoiceNodePlaying"] forState:UIControlStateNormal];
UIImage *backgroundImage = [UIImage imageNamed:fromSelf?@"SenderVoiceNodeDownloading":@"ReceiverVoiceNodeDownloading"];
backgroundImage = [backgroundImage stretchableImageWithLeftCapWidth:20 topCapHeight:0];
[button setBackgroundImage:backgroundImage forState:UIControlStateNormal];

UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(fromSelf?-30:button.frame.size.width, 0, 30, button.frame.size.height)];
label.text = [NSString stringWithFormat:@"%d''",logntime];
label.textColor = [UIColor grayColor];
label.font = [UIFont systemFontOfSize:13];
label.textAlignment = NSTextAlignmentCenter;
label.backgroundColor = [UIColor clearColor];
[button addSubview:label];

return button;
}

#pragma UITableView

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return _resultArray.count;
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSDictionary *dict = [_resultArray objectAtIndex:indexPath.row];
UIFont *font = [UIFont systemFontOfSize:14];
CGSize size = [[dict objectForKey:@"content"] sizeWithFont:font constrainedToSize:CGSizeMake(180.0f, 20000.0f) lineBreakMode:NSLineBreakByWordWrapping];

return size.height+44;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}else{
for (UIView *cellView in cell.subviews){
[cellView removeFromSuperview];
}
}
NSDictionary *dict = [_resultArray objectAtIndex:indexPath.row];

//创建头像
UIImageView *photo ;
if ([[dict objectForKey:@"name"]isEqualToString:@"haoning"]) {
photo = [[UIImageView alloc]initWithFrame:CGRectMake(320-60, 10, 50, 50)];
[cell addSubview:photo];
photo.image = [UIImage imageNamed:@"photo1"];

if ([[dict objectForKey:@"content"] isEqualToString:@"0"]) {
[cell addSubview:[self yuyinView:1 from:YES withIndexRow:indexPath.row withPosition:65]];

}else{
[cell addSubview:[self bubbleView:[dict objectForKey:@"content"] from:YES withPosition:65]];
}

}else{
photo = [[UIImageView alloc]initWithFrame:CGRectMake(10, 10, 50, 50)];
[cell addSubview:photo];
photo.image = [UIImage imageNamed:@"photo"];

if ([[dict objectForKey:@"content"] isEqualToString:@"0"]) {
[cell addSubview:[self yuyinView:1 from:NO withIndexRow:indexPath.row withPosition:65]];
}else{
[cell addSubview:[self bubbleView:[dict objectForKey:@"content"] from:NO withPosition:65]];
}
}

return cell;

}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

}

@end



ViewController.h

//
// ViewController.h
// BubbleDemo
//
// Created by xiao7 on 14/10/19.
// Copyright (c) 2014年 killinux. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "SocketRocket/SRWebSocket.h"
@interface ViewController : UIViewController<SRWebSocketDelegate>
{

IBOutlet UITableView *tableViewList;
IBOutlet UITextField *messageTxt;

}
@property (nonatomic, strong) NSMutableArray *resultArray;
@property (nonatomic, strong) SRWebSocket *mywebSocket;
@end

[img]http://dl2.iteye.com/upload/attachment/0102/1799/a98e13ff-9ba8-3328-8b7f-0228835b7f55.png[/img]
演示
chrome上
[img]http://dl2.iteye.com/upload/attachment/0102/1801/febdd1cf-8511-3df9-86f2-4ff25c499010.png[/img]
ios8系统上
[img]http://dl2.iteye.com/upload/attachment/0102/1804/24fbb834-6277-3f56-a4d9-066176eaca0d.png[/img]

html的客户端

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<script type="text/javascript">
String.prototype.startWith=function(s){
if(s==null||s==""||this.length==0||s.length>this.length)
return false;
if(this.substr(0,s.length)==s)
return true;
else
return false;
return true;
}
Date.prototype.format = function(format) {
var o = {
"M+" : this.getMonth() + 1, //month
"d+" : this.getDate(), //day
"h+" : this.getHours(), //hour
"m+" : this.getMinutes(), //minute
"s+" : this.getSeconds(), //second
"q+" : Math.floor((this.getMonth() + 3) / 3), //quarter
"S" : this.getMilliseconds()
}
if (/(y+)/.test(format))
format = format.replace(RegExp.$1, (this.getFullYear() + "")
.substr(4 - RegExp.$1.length));
for ( var k in o)
if (new RegExp("(" + k + ")").test(format))
format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k]
: ("00" + o[k]).substr(("" + o[k]).length));
return format;
}
var ws = null;
function log(text) {
/* document.getElementById("log").innerHTML = (new Date).getTime() + ": "
+ text + "<br>" + document.getElementById("log").innerHTML; */
document.getElementById("log").innerHTML = new Date().format('yyyy-MM-dd hh:mm:ss') + ","
+ text + "<br>" + document.getElementById("log").innerHTML;
}
function enterSend(){
if(event.keyCode == 13){
document.getElementById("sendbtn").click();
}
}
function startServer() {

var url = document.getElementById("serverip").value;// "ws://192.168.0.102:8887";
if ('WebSocket' in window) {
ws = new WebSocket(url);
} else if ('MozWebSocket' in window) {
ws = new MozWebSocket(url);
} else {
log('浏览器不支持');
return;
}
ws.onopen = function() {
log('唷嘻,连上了');
};
// 收到服务器发送的文本消息, event.data表示文本内容
ws.onmessage = function(event) {
var thisdata = event.data;
if(thisdata.startWith("open")){
//alert(thisdata);
document.getElementById("username").value=thisdata.split(" ")[1];
}else{
//log(event.data);
var showData=event.data.split(",");
log(showData[0]+"说:"+showData[2]);
}
};
ws.onclose = function() {
log('Closed! 刷新页面尝试连接.');
}
//document.getElementById("conbtn").disabled = "true";
//document.getElementById("stopbtn").removeAttribute('disabled');
}
function sendMessage() {
var textMessage = document.getElementById("textMessage").value;
var username = document.getElementById("username").value;
var toUser = "";
if (ws != null && textMessage != "") {
ws.send(username+","+toUser+","+textMessage);
}
document.getElementById("textMessage").value="";
}
function stopconn() {
ws.close();
//document.getElementById("conbtn").removeAttribute('disabled');
//document.getElementById("stopbtn").disabled = "true";
}
</script>
<body onload="startServer()">

<input id="serverip" type="text" size="20"
value="ws://192.168.0.102:8080/webs/websocket/test" />
<!-- ws://192.168.0.102:8887 182.254.155.153 -->
<!-- <input id="conbtn" type="button" onclick="startServer()" value="open" />
<input id="stopbtn" type="button" onclick="stopconn()" value="stop" disabled="disabled"/> -->
</br>
您的名字:<input id="username" type="text" /></br></br>
<input id="textMessage" type="text" size="20" onkeydown="enterSend()" style="border:1;width:400px" />
<input id="sendbtn" type="button" onclick="sendMessage()" value="Send">
<div id="log"></div>
</body>
</html>



java的tomcat7的后台:

package com.hao;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import javax.servlet.http.HttpServletRequest;

import org.apache.catalina.websocket.MessageInbound;
import org.apache.catalina.websocket.StreamInbound;
import org.apache.catalina.websocket.WebSocketServlet;
import org.apache.catalina.websocket.WsOutbound;

public class HelloWorldWebSocketServlet extends WebSocketServlet {
public static Map<String,MyMessageInbound> mmiList = new HashMap<String,MyMessageInbound>();

protected StreamInbound createWebSocketInbound(String subProtocol,
HttpServletRequest arg1) {
return new MyMessageInbound();
}
public int getUserCount(){
return mmiList.size();
}
private class MyMessageInbound extends MessageInbound {
WsOutbound myoutbound;
String mykey;
@Override
public void onOpen(WsOutbound outbound) {
try {
System.out.println("Open Client.");
this.myoutbound = outbound;
mykey ="open "+System.currentTimeMillis();;
mmiList.put(mykey, this);
System.out.println("mmiList size:"+mmiList.size());
outbound.writeTextMessage(CharBuffer.wrap(mykey));
} catch (IOException e) {
e.printStackTrace();
}
}

@Override
public void onClose(int status) {
System.out.println("Close Client.");
//mmiList.remove(this);
mmiList.remove(mykey);
}

@Override
protected void onBinaryMessage(ByteBuffer arg0) throws IOException {

}

@Override
protected void onTextMessage(CharBuffer message) throws IOException {
// TODO Auto-generated method stub
System.out.println("onText--->" + message.toString());
// for (int i=0;i< mmiList.size();i++ ) {
// MyMessageInbound mmib = (MyMessageInbound) mmiList.get(i);
// CharBuffer buffer = CharBuffer.wrap(message);
// mmib.myoutbound.writeTextMessage(buffer);
// mmib.myoutbound.flush();
// }
for (Map.Entry<String, MyMessageInbound> entry : mmiList.entrySet()) {
//System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
MyMessageInbound mmib = (MyMessageInbound) entry.getValue();
// String str = entry.getKey()+message.toString()
CharBuffer buffer = CharBuffer.wrap(message);
mmib.myoutbound.writeTextMessage(buffer);
mmib.myoutbound.flush();
}

/*Socket socket;
String msg = "";
try {
// 向服务器利用Socket发送信息
socket = new Socket("192.168.0.102", 5000);
// socket = new Socket("127.0.0.1",5000);
PrintWriter output = new PrintWriter(socket.getOutputStream());

output.write(message.toString());
output.flush();

// 这里是接收到Server的信息
DataInputStream input = new DataInputStream(
socket.getInputStream());
byte[] b = new byte[1024];
input.read(b);
// Server返回的信息
msg = new String(b).trim();

output.close();
input.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// 往浏览器发送信息
CharBuffer cb = CharBuffer.wrap(new StringBuilder(msg));
getWsOutbound().writeTextMessage(cb);*/
}
}

public static void main(String[] args) {
Socket socket;
String message = "haoning";
String msg = "";
try {
// 向服务器利用Socket发送信息
socket = new Socket("192.168.0.102", 5000);
// socket = new Socket("127.0.0.1",5000);
PrintWriter output = new PrintWriter(socket.getOutputStream());

output.write(message.toString());
output.flush();

// 这里是接收到Server的信息
DataInputStream input = new DataInputStream(socket.getInputStream());
byte[] b = new byte[1024];
input.read(b);
// Server返回的信息
msg = new String(b).trim();

output.close();
input.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}


web.xml

<servlet>
<servlet-name>wsSnake</servlet-name>
<servlet-class>com.hao.HelloWorldWebSocketServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>wsSnake</servlet-name>
<url-pattern>/websocket/test</url-pattern>
</servlet-mapping>

效果图:代码地址:在这里

博文 来自: a997013919
没有更多推荐了,返回首页