hprose 1.4.2 → 1.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/examples/client.rb +1 -1
- data/examples/tcpclient.rb +11 -0
- data/lib/hprose/client.rb +23 -3
- data/lib/hprose/httpclient.rb +3 -4
- data/lib/hprose/tcpclient.rb +127 -0
- data/lib/hprose.rb +3 -1
- data/lib/hproseclient.rb +4 -2
- metadata +4 -2
data/examples/client.rb
CHANGED
data/lib/hprose/client.rb
CHANGED
@@ -14,19 +14,37 @@
|
|
14
14
|
# #
|
15
15
|
# hprose client for ruby #
|
16
16
|
# #
|
17
|
-
# LastModified: Mar
|
17
|
+
# LastModified: Mar 10, 2014 #
|
18
18
|
# Author: Ma Bingyao <andot@hprose.com> #
|
19
19
|
# #
|
20
20
|
############################################################
|
21
21
|
|
22
22
|
require "hprose/common"
|
23
23
|
require "hprose/io"
|
24
|
+
require "uri"
|
24
25
|
|
25
26
|
module Hprose
|
26
27
|
class Client
|
27
|
-
|
28
|
-
|
28
|
+
class << self
|
29
|
+
alias :__new__ :new
|
30
|
+
def inherited(subclass)
|
31
|
+
class << subclass
|
32
|
+
alias :new :__new__
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
29
36
|
public
|
37
|
+
def self.new(uri)
|
38
|
+
u = URI.parse(uri)
|
39
|
+
case u.scheme
|
40
|
+
when 'http', 'https' then
|
41
|
+
return HttpClient.new(uri)
|
42
|
+
when 'tcp', 'tcp4', 'tcp6' then
|
43
|
+
return TcpClient.new(uri)
|
44
|
+
else
|
45
|
+
raise Exception.exception("The " << u.scheme << " client isn't implemented.")
|
46
|
+
end
|
47
|
+
end
|
30
48
|
def initialize(uri = nil)
|
31
49
|
@onerror = nil
|
32
50
|
@filter = Filter.new
|
@@ -82,6 +100,8 @@ module Hprose
|
|
82
100
|
raise NotImplementedError.new("#{self.class.name}#send_and_receive is an abstract method")
|
83
101
|
end
|
84
102
|
private
|
103
|
+
include Tags
|
104
|
+
include ResultMode
|
85
105
|
def do_output(methodname, args, byref, simple)
|
86
106
|
stream = StringIO.new
|
87
107
|
writer = Writer.new(stream, simple)
|
data/lib/hprose/httpclient.rb
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
# #
|
15
15
|
# hprose http client for ruby #
|
16
16
|
# #
|
17
|
-
# LastModified: Mar
|
17
|
+
# LastModified: Mar 10, 2014 #
|
18
18
|
# Author: Ma Bingyao <andot@hprose.com> #
|
19
19
|
# #
|
20
20
|
############################################################
|
@@ -26,9 +26,6 @@ require "uri"
|
|
26
26
|
|
27
27
|
module Hprose
|
28
28
|
class HttpClient < Client
|
29
|
-
include Tags
|
30
|
-
@@cookie_manager = {}
|
31
|
-
@@cookie_manager_mutex = Mutex.new
|
32
29
|
public
|
33
30
|
def initialize(uri = nil)
|
34
31
|
super
|
@@ -87,6 +84,8 @@ module Hprose
|
|
87
84
|
end
|
88
85
|
end
|
89
86
|
private
|
87
|
+
@@cookie_manager = {}
|
88
|
+
@@cookie_manager_mutex = Mutex.new
|
90
89
|
def _set_cookie(cookielist, host)
|
91
90
|
@@cookie_manager_mutex.synchronize do
|
92
91
|
cookielist.each do |cookies|
|
@@ -0,0 +1,127 @@
|
|
1
|
+
############################################################
|
2
|
+
# #
|
3
|
+
# hprose #
|
4
|
+
# #
|
5
|
+
# Official WebSite: http://www.hprose.com/ #
|
6
|
+
# http://www.hprose.net/ #
|
7
|
+
# http://www.hprose.org/ #
|
8
|
+
# #
|
9
|
+
############################################################
|
10
|
+
|
11
|
+
############################################################
|
12
|
+
# #
|
13
|
+
# hprose/tcpclient.rb #
|
14
|
+
# #
|
15
|
+
# hprose tcp client for ruby #
|
16
|
+
# #
|
17
|
+
# LastModified: Mar 10, 2014 #
|
18
|
+
# Author: Ma Bingyao <andot@hprose.com> #
|
19
|
+
# #
|
20
|
+
############################################################
|
21
|
+
|
22
|
+
require "hprose/client"
|
23
|
+
require "socket"
|
24
|
+
|
25
|
+
module Hprose
|
26
|
+
class TcpClient < Client
|
27
|
+
private
|
28
|
+
module TcpConnStatus
|
29
|
+
Free = 0
|
30
|
+
Using = 1
|
31
|
+
Closing = 2
|
32
|
+
end
|
33
|
+
class TcpConnEntry
|
34
|
+
def initialize(uri)
|
35
|
+
@uri = uri
|
36
|
+
@status = TcpConnStatus::Using
|
37
|
+
@socket = nil
|
38
|
+
end
|
39
|
+
attr_accessor :uri, :status, :socket
|
40
|
+
end
|
41
|
+
class TcpConnPool
|
42
|
+
def initialize
|
43
|
+
@pool = []
|
44
|
+
@mutex = Mutex.new
|
45
|
+
end
|
46
|
+
def get(uri)
|
47
|
+
@mutex.synchronize do
|
48
|
+
@pool.each do |entry|
|
49
|
+
if entry.status == TcpConnStatus::Free then
|
50
|
+
if not entry.uri.nil? and entry.uri == uri then
|
51
|
+
entry.status = TcpConnStatus::Using
|
52
|
+
return entry
|
53
|
+
elsif entry.uri.nil? then
|
54
|
+
entry.status = TcpConnStatus::Using
|
55
|
+
entry.uri = uri
|
56
|
+
return entry
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
entry = TcpConnEntry.new(uri)
|
61
|
+
@pool << entry
|
62
|
+
return entry
|
63
|
+
end
|
64
|
+
end
|
65
|
+
def close(uri)
|
66
|
+
sockets = []
|
67
|
+
@mutex.synchronize do
|
68
|
+
@pool.each do |entry|
|
69
|
+
if not entry.uri.nil? and entry.uri == uri then
|
70
|
+
if entry.status == TcpConnStatus::Free then
|
71
|
+
sockets << entry.socket
|
72
|
+
entry.socket = nil
|
73
|
+
entry.uri = nil
|
74
|
+
else
|
75
|
+
entry.status = TcpConnStatus::Closing
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
freeSockets(sockets)
|
81
|
+
end
|
82
|
+
def free(entry)
|
83
|
+
if entry.status == TcpConnStatus::Closing then
|
84
|
+
if not entry.socket.nil? then
|
85
|
+
entry.socket.close
|
86
|
+
entry.socket = nil
|
87
|
+
end
|
88
|
+
entry.uri = nil
|
89
|
+
end
|
90
|
+
entry.status = TcpConnStatus::Free
|
91
|
+
end
|
92
|
+
private
|
93
|
+
def freeSockets(sockets)
|
94
|
+
Thread.start do
|
95
|
+
sockets.each do |socket|
|
96
|
+
socket.close
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
public
|
102
|
+
def initialize(uri = nil)
|
103
|
+
super
|
104
|
+
@pool = TcpConnPool.new
|
105
|
+
end
|
106
|
+
protected
|
107
|
+
def send_and_receive(data)
|
108
|
+
entry = @pool.get(@uri)
|
109
|
+
if entry.socket.nil? then
|
110
|
+
entry.socket = TCPSocket.new(@uri.host, @uri.port)
|
111
|
+
end
|
112
|
+
begin
|
113
|
+
n = data.size
|
114
|
+
entry.socket.send("" << (n >> 24 & 0xff) << (n >> 16 & 0xff) << (n >> 8 & 0xff) << (n & 0xff) << data, 0)
|
115
|
+
buf = entry.socket.recv(4, 0)
|
116
|
+
n = buf[0].ord << 24 | buf[1].ord << 16 | buf[2].ord << 8 | buf[3].ord
|
117
|
+
data = entry.socket.recv(n, 0)
|
118
|
+
rescue
|
119
|
+
entry.status = TcpConnStatus::Closing
|
120
|
+
raise
|
121
|
+
ensure
|
122
|
+
@pool.free(entry)
|
123
|
+
end
|
124
|
+
return data
|
125
|
+
end
|
126
|
+
end # class TcpClient
|
127
|
+
end # module Hprose
|
data/lib/hprose.rb
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
# #
|
15
15
|
# hprose for ruby #
|
16
16
|
# #
|
17
|
-
# LastModified: Mar
|
17
|
+
# LastModified: Mar 10, 2014 #
|
18
18
|
# Author: Ma Bingyao <andot@hprose.com> #
|
19
19
|
# #
|
20
20
|
############################################################
|
@@ -31,6 +31,7 @@ module Hprose
|
|
31
31
|
autoload :Formatter, 'hprose/io'
|
32
32
|
autoload :Client, 'hprose/client'
|
33
33
|
autoload :HttpClient, 'hprose/httpclient'
|
34
|
+
autoload :TcpClient, 'hprose/tcpclient'
|
34
35
|
autoload :Service, 'hprose/service'
|
35
36
|
autoload :HttpService, 'hprose/httpservice'
|
36
37
|
end
|
@@ -46,5 +47,6 @@ Object.const_set(:HproseWriter, Hprose.const_get(:Writer))
|
|
46
47
|
Object.const_set(:HproseFormatter, Hprose.const_get(:Formatter))
|
47
48
|
Object.const_set(:HproseClient, Hprose.const_get(:Client))
|
48
49
|
Object.const_set(:HproseHttpClient, Hprose.const_get(:HttpClient))
|
50
|
+
Object.const_set(:HproseTcpClient, Hprose.const_get(:TcpClient))
|
49
51
|
Object.const_set(:HproseService, Hprose.const_get(:Service))
|
50
52
|
Object.const_set(:HproseHttpService, Hprose.const_get(:HttpService))
|
data/lib/hproseclient.rb
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
# #
|
15
15
|
# hprose client for ruby #
|
16
16
|
# #
|
17
|
-
# LastModified:
|
17
|
+
# LastModified: Mar 10, 2014 #
|
18
18
|
# Author: Ma Bingyao <andot@hprose.com> #
|
19
19
|
# #
|
20
20
|
############################################################
|
@@ -22,7 +22,9 @@
|
|
22
22
|
module Hprose
|
23
23
|
autoload :Client, 'hprose/client'
|
24
24
|
autoload :HttpClient, 'hprose/httpclient'
|
25
|
+
autoload :TcpClient, 'hprose/tcpclient'
|
25
26
|
end
|
26
27
|
|
27
28
|
Object.const_set(:HproseClient, Hprose.const_get(:Client))
|
28
|
-
Object.const_set(:HproseHttpClient, Hprose.const_get(:HttpClient))
|
29
|
+
Object.const_set(:HproseHttpClient, Hprose.const_get(:HttpClient))
|
30
|
+
Object.const_set(:HproseTcpClient, Hprose.const_get(:TcpClient))
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hprose
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-03-
|
12
|
+
date: 2014-03-10 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description:
|
15
15
|
email: andot@hprose.com
|
@@ -19,12 +19,14 @@ extra_rdoc_files: []
|
|
19
19
|
files:
|
20
20
|
- examples/client.rb
|
21
21
|
- examples/server.rb
|
22
|
+
- examples/tcpclient.rb
|
22
23
|
- lib/hprose/client.rb
|
23
24
|
- lib/hprose/common.rb
|
24
25
|
- lib/hprose/httpclient.rb
|
25
26
|
- lib/hprose/httpservice.rb
|
26
27
|
- lib/hprose/io.rb
|
27
28
|
- lib/hprose/service.rb
|
29
|
+
- lib/hprose/tcpclient.rb
|
28
30
|
- lib/hprose.rb
|
29
31
|
- lib/hproseclient.rb
|
30
32
|
- lib/hprosecommon.rb
|