more experimental socket code

This commit is contained in:
hyunghwan.chung 2018-05-22 05:15:49 +00:00
parent b42586a1c6
commit c014789fa9
2 changed files with 81 additions and 64 deletions

View File

@ -41,7 +41,7 @@ class HttpConnReg(Object)
method add: elem method add: elem
{ {
| index | | index |
if (self.first_free_slot < 0) { ^Error.Code.ELIMIT }. if (self.first_free_slot < 0) { Exception signal: 'no free slot' }.
index := self.first_free_slot. index := self.first_free_slot.
self.first_free_slot := (self.connections at: index). self.first_free_slot := (self.connections at: index).
self.connections at: index put: elem. self.connections at: index put: elem.
@ -115,8 +115,7 @@ class HttpSocket(SyncSocket)
{ {
| buf | | buf |
buf := ByteArray new: 128. buf := ByteArray new: 128.
'IM RUNNING SERVICE...............' dump. 'IM RUNNING SERVICE...............' dump.
self timeout: 10. self timeout: 10.
self readBytes: buf. self readBytes: buf.
buf dump. buf dump.
@ -137,13 +136,18 @@ class HttpSocket(SyncSocket)
class HttpListener(AsyncServerSocket) class HttpListener(AsyncServerSocket)
{ {
var(#get) server := nil. var(#get) server := nil.
var(#get) rid := -1. var(#get) rid := nil.
method initialize method initialize
{ {
super initialize. super initialize.
} }
##method close
##{
## super close.
##}
method onSocketAccepted: clisck from: cliaddr method onSocketAccepted: clisck from: cliaddr
{ {
| rid | | rid |
@ -154,12 +158,17 @@ clisck dump.
if (self.server notNil) if (self.server notNil)
{ {
server addConnection: clisck. [
if (clisck isKindOf: SyncSocket) server addConnection: clisck.
{ if (clisck isKindOf: SyncSocket)
{
'SERVICE READLLY STARTING' dump. 'SERVICE READLLY STARTING' dump.
[clisck runService] fork. [clisck runService] fork.
} }
]
on: Exception do: [:ex |
Exception signal: ('unable to handle a new connection - ' & ex messageText).
].
}. }.
} }
@ -189,29 +198,54 @@ class HttpServer(Object)
self.connreg := HttpConnReg new. self.connreg := HttpConnReg new.
} }
method __add_listener: listener
{
| rid |
rid := self.listeners add: listener.
('ADD NEW LISTENER ' & rid asString) dump.
listener server: self rid: rid.
}
method __remove_listener: listener
{
| rid |
rid = listener rid.
if (rid notNil)
{
self.listeners remove: (listener rid).
listener server: nil rid: nil.
}.
}
method __start_new_listener: addr
{
| listener |
listener := HttpListener family: (addr family) type: Socket.Type.STREAM.
[
if ((self __add_listener: listener) notError)
{
listener bind: addr.
listener listen: 128.
}
] on: Exception do: [:ex |
self __remove_listener: listener.
listener close.
## ex pass.
Exception signal: ('unable to add new listener - ' & ex messageText).
].
}
method start: laddr method start: laddr
{ {
| listener | | listener |
if (laddr class == Array) if (laddr class == Array)
##if (laddr respondsTo: #do:) ## can i check if the message receives a block and the block accepts 1 argument?
{ {
laddr do: [:addr | laddr do: [:addr | self __start_new_listener: addr ].
listener := HttpListener family: (addr family) type: Socket.Type.STREAM.
if ((self addListener: listener) notError)
{
listener bind: addr.
listener listen: 128.
}
].
} }
else else
{ {
listener := HttpListener family: (laddr family) type: Socket.Type.STREAM. self __start_new_listener: laddr.
if ((self addListener: listener) notError)
{
listener bind: laddr.
listener listen: 128.
}
}. }.
} }
@ -230,43 +264,22 @@ class HttpServer(Object)
{ {
| rid | | rid |
rid := self.connreg add: conn. rid := self.connreg add: conn.
if (rid isError)
{
'ERROR - CANNOT REGISTER NEW CONNECTION >>>>>>>>>> ' dump.
conn close.
^rid.
}.
('ADD NEW CONNECTION ' & rid asString) dump. ('ADD NEW CONNECTION ' & rid asString) dump.
conn server: self rid: rid. conn server: self rid: rid.
} }
method removeConnection: conn method removeConnection: conn
{ {
self.connreg remove: (conn rid). | rid |
conn server: nil rid: -1. rid := conn rid.
if (rid notNil)
{
self.connreg remove: (conn rid).
conn server: nil rid: -1.
}.
} }
method addListener: listener
{
| rid |
rid := self.listeners add: listener.
if (rid isError)
{
'ERROR - CANNOT REGISTER NEW LISTENER >>>>>>>>>> ' dump.
listener close.
^rid.
}.
('ADD NEW LISTENER ' & rid asString) dump.
listener server: self rid: rid.
}
method removeListener: listener
{
self.listeners remove: (listener rid).
listener server: nil rid: -1.
}
} }
@ -346,7 +359,7 @@ class HttpServer2(Object)
self.connreg := HttpConnReg new. self.connreg := HttpConnReg new.
} }
method run: laddr method start: laddr
{ {
| listener sem ss | | listener sem ss |
@ -370,12 +383,6 @@ class HttpServer2(Object)
listener _listen: 128. listener _listen: 128.
} }
}. }.
while (true)
{
ss := self.sg wait.
if (ss isError) { break }.
}.
} }
method close method close
@ -568,7 +575,7 @@ class MyObject(Object)
'----- END OF ANOTHER PROC ------' dump. '----- END OF ANOTHER PROC ------' dump.
} }
method(#class) main222 method(#class) main
{ {
| httpd addr | | httpd addr |
@ -610,17 +617,25 @@ httpd connect: addr.
'----- END OF MAIN ------' dump. '----- END OF MAIN ------' dump.
} }
method(#class) main method(#class) mainqq
{ {
| httpd addr | | httpd addr sg ss |
sg := SemaphoreGroup new.
[ [
httpd := HttpServer2 new. httpd := HttpServer2 new.
[ [
httpd run: %( httpd start: %(
SocketAddress fromString: '[::]:7777', SocketAddress fromString: '[::]:7777',
SocketAddress fromString: '0.0.0.0:7776' SocketAddress fromString: '0.0.0.0:7776'
). ).
while (true)
{
ss := sg wait.
if (ss isError) { break }.
}
] ensure: [ ] ensure: [
if (httpd notNil) { httpd close } if (httpd notNil) { httpd close }
] ]

View File

@ -739,6 +739,7 @@ class Mux(SemaphoreGroup)
} }
} }
(*
class ListenerSocket(Socket) class ListenerSocket(Socket)
{ {
var inreadysem. var inreadysem.
@ -819,3 +820,4 @@ class ListenerSocket(Socket)
} }
} }
*)