導航:首頁 > 編程語言 > socketiojs11下載

socketiojs11下載

發布時間:2022-07-24 22:20:00

『壹』 socketio 不是標準的websocket為什麼java寫的client端連不上

php有可用的websocket庫,不需要php-fpm。
目前比較成熟的有swoole(swoole.com),和workman(workman.net)
swoole是c寫的php擴展, 效率比nodejs還要高,workman是純php實現,兩者都號稱可以實現並發百萬TCP連接。
給你個例子:
這個要通過cmd運行的 具體帶的參數有點忘記了
<?php
error_reporting(E_ALL);
set_time_limit(0);
ob_implicit_flush();

//創建一個socket連接 設置參數 綁定 監聽 並且返回
$master = WebSocket("localhost",12345);

//標示是否已經進行過握手了
$is_shaked = false;

//是否已經關閉
$is_closed = true;

//將socket變為一個可用的socket

while(true){
//如果是關閉狀態並且是沒有握手的話 則創建一個可用的socket(貌似第二個條件可以去除)
if($is_closed && !$is_shaked){
if(($sock = socket_accept($master)) < 0){
echo "socket_accept() failed: reason: " . socket_strerror($sock) . "\n";
}

//將關閉狀態修改為false
$is_closed = false;
}

//開始進行數據處理
process($sock);
}

//處理請求的函數
function process($socket){
//先從獲取到全局變數
global $is_closed, $is_shaked;

//從socket中獲取數據
$buffer = socket_read($socket,2048);

//如果buffer返回值為false並且已經握手的話 則斷開連接
if(!$buffer && $is_shaked){
disconnect($socket);
}else{
//如果沒有握手的話則握手 並且修改握手狀態
if($is_shaked == false){
$return_str = dohandshake($buffer);
$is_shaked = true;
}else{
//如果已經握手的話則送入deal函數中進行相應處理
$data_str = decode($buffer); //解析出來的從前端送來的內容
console($data_str);
$return_str = encode(deal($socket, $data_str));
//$return_str = encode($data_str);
}

//將應該返回的字元串寫入socket返回
socket_write($socket,$return_str,strlen($return_str));
}
}

function deal($socket, $msgObj){
$obj = json_decode($msgObj);
foreach($obj as $key=>$value){
if($key == 'close'){
disconnect($socket);
console('close success');
return 'close success';
}else if($key == 'msg'){
console($value."\n");
return $value;
}
}
}

//獲取頭部信息
function getheaders($req){
$r=$h=$o=null;
if(preg_match("/GET (.*) HTTP/" ,$req,$match)){ $r=$match[1]; }
if(preg_match("/Host: (.*)\r\n/" ,$req,$match)){ $h=$match[1]; }
if(preg_match("/Origin: (.*)\r\n/",$req,$match)){ $o=$match[1]; }
if(preg_match("/Sec-WebSocket-Key: (.*)\r\n/",$req,$match)){ $key=$match[1]; }
if(preg_match("/\r\n(.*?)\$/",$req,$match)){ $data=$match[1]; }
return array($r,$h,$o,$key,$data);
}

function WebSocket($address,$port){
$master=socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("socket_create() failed");
socket_set_option($master, SOL_SOCKET, SO_REUSEADDR, 1) or die("socket_option() failed");
socket_bind($master, $address, $port) or die("socket_bind() failed");
socket_listen($master,20) or die("socket_listen() failed");
echo "Server Started : ".date('Y-m-d H:i:s')."\n";
echo "Master socket : ".$master."\n";
echo "Listening on : ".$address." port ".$port."\n\n";
return $master;
}

function dohandshake($buffer){
list($resource,$host,$origin,$key,$data) = getheaders($buffer);
echo "resource is $resource\n";
echo "origin is $origin\n";
echo "host is $host\n";
echo "key is $key\n\n";

$response_key = base64_encode(sha1($key.'258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true));

$return_str = "HTTP/1.1 101 Switching Protocols\r\n".
"Upgrade: websocket\r\n".
"Connection: Upgrade\r\n".
"Sec-WebSocket-Accept: $response_key\r\n\r\n";
return $return_str;
}

function console($msg){
$msg = transToGBK($msg);
echo "$msg\n";
return $msg;
}

function decode($msg="") {
$mask = array();
$data = "";
$msg = unpack("H*",$msg);

$head = substr($msg[1],0,2);

if (hexdec($head{1}) === 8){
$data = false;
} else if (hexdec($head{1}) === 1){
$mask[] = hexdec(substr($msg[1],4,2));
$mask[] = hexdec(substr($msg[1],6,2));
$mask[] = hexdec(substr($msg[1],8,2));
$mask[] = hexdec(substr($msg[1],10,2));

$s = 12;
$e = strlen($msg[1])-2;
$n = 0;
for ($i= $s; $i<= $e; $i+= 2){
$data .= chr($mask[$n%4]^hexdec(substr($msg[1],$i,2)));
$n++;
}
}

return $data;
}

function encode($msg=""){
$frame = array();
$frame[0] = "81";
$msg .= ' is ok';
$len = strlen($msg);
$frame[1] = $len<16?"0".dechex($len):dechex($len);
$frame[2] = ord_hex($msg);
$data = implode("",$frame);
return pack("H*", $data);
}

function transToGBK($s){//UTF8->GBK
//echo $s;
return iconv("UTF-8", "GBK", $s);
return $s;
}

function ord_hex($data){
$msg = "";
$l = strlen($data);

for ($i=0; $i<$l; $i++){
//ord是返回字元串第一個字元的ascii值
//dechex把十進制轉換為十六進制
$msg .= dechex(ord($data{$i}));
}

return $msg;
}

function disconnect($socket){
global $is_shaked, $is_closed;
$is_shaked = false;
$is_closed = true;
socket_close($socket);
}
?>

『貳』 如何使用Socket.IO編寫聊天應用程序

我們將首先通過查看客戶端代碼。所有聊天互動都有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 e to bad name
self.appEventBus.on('loginNameBad', function(name) {
self.loginModel.set('error', 'Invalid Name');
});

// triggered when login error e 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很容易的在客戶端和伺服器端交換消息。

『叄』 Socket.io中怎麼知道emit有沒有執行成功

頁面JS:
……
socket.emit('nickname','張三',function(data){
if(data){
console.log('Nicknamesetsuccessfully');
}
});
服務端:
……
socket.on('nickname',function(data,callback){
callback(data);
});

『肆』 前台h5 Socket.Io.js做客戶端,伺服器用Tomcat,java後台怎麼實現通訊。也是用socketio嗎上詳細代碼。

socket.io封裝了websocket,同時包含了其它的連接方式,比如Ajax。原因在於不是所有的瀏覽器都支持websocket,通過socket.io的封裝,你不用關心裏面用了什麼連接方式。
你在任何瀏覽器里都可以使用socket.io來建立非同步的連接。socket.io包含了服務端和客戶端的庫,如果在瀏覽器中使用了socket.io的js,服務端也必須同樣適用。如果你很清楚你需要的就是websocket,那可以直接使用websocket

『伍』 cocos2d-js中的socketio部分是不是只適合native部分,不適合web

Cocos2d-JS為純Web開發者提供了特別定製的一套更友好的工作流,對於這些開發者來說,如果Cocos2d-JS可以像其他Web框架一樣用單個文件被引入到用戶頁面中並可以直接使用的話,會更符合他們的開發習慣。而Cocos2d-JS引擎包看上去對於Web開發者來說實在是太龐大和復雜了,對於Web開發者來說,就好像被扔進了一個巨大的迷宮,完全不知道從哪下手。這甚至會給開發者一種錯誤的認知:"Cocos2d-JS是一個非常重的引擎,不適合做Web游戲開發。"

實際上,在Cocos2d-JS的Web引擎實現模塊化之後,可以非常優美得做到既強大又輕量。也正是以上原因,促使我們推出了Lite Version以及專為Lite Version定製的工作流供純Web開發者使用。

『陸』 nodejs socketio的問題

估計是前端代碼沒有觸發。貼一下前端的關鍵代碼。

『柒』 不用nodejs可以用socketio嗎

方法/步驟 點擊右上部,打開配置界面 選擇調試Node.js 配置需要調試的Node.js程序的入口app.js 開始設置斷點和調試 5 也可以在程序中使用console.log,在控制台中輸出

『捌』 不用nodejs可以用socketio嗎

socketio是nodejs的一個庫,相當於別人利用nodejs的函數封裝了一些功能給你使用,依賴與nodejs的一些api,所以只能在nodejs下用。
其它語言可以搜索相應語言的庫

『玖』 nodejs 怎麼手動觸發socketio disconnection事件

socketio是nodejs的一個庫,相當於別人利用nodejs的函數封裝了一些功能給你使用,依賴與nodejs的一些api,所以只能在nodejs下用。 其它語言可以搜索相應語言的庫

閱讀全文

與socketiojs11下載相關的資料

熱點內容
ps3文件分割視頻 瀏覽:280
微信圖片一鍵轉發軟體 瀏覽:331
如何判斷s200plc編程電纜 瀏覽:691
太原編程培訓班哪個好 瀏覽:171
樹葉吹奏教程 瀏覽:6
社交app帶來了哪些社會問題 瀏覽:394
如何安裝愛寶8800數據採集器 瀏覽:712
文件保存了怎麼找不到了 瀏覽:476
彩票網站怎麼辨真假 瀏覽:840
pr找不到該文件 瀏覽:963
java移除panel 瀏覽:354
jsp填充jsp 瀏覽:166
海關外貿大數據在哪裡查 瀏覽:381
思特奇java筆試題 瀏覽:121
葫蘆俠在手機中的文件名 瀏覽:813
plc編程應該怎麼收錢 瀏覽:584
c語言中源文件由什麼組成 瀏覽:890
linuxhttpdphp配置文件 瀏覽:607
拆單數據要怎麼保存 瀏覽:17
mac電腦怎樣壓縮文件到100m 瀏覽:645

友情鏈接