Skip to content

Commit

Permalink
add long polling implement
Browse files Browse the repository at this point in the history
  • Loading branch information
hesh915 committed Sep 8, 2015
1 parent 6b16908 commit 3afbc90
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 49 deletions.
4 changes: 1 addition & 3 deletions TODO
Original file line number Diff line number Diff line change
@@ -1,3 +1 @@
1.long polling
2.connect timeout
3.namespace
1.connect timeout
35 changes: 14 additions & 21 deletions client.go
Original file line number Diff line number Diff line change
@@ -1,59 +1,52 @@
package socketio_client

import (
"net/http"
"net/url"
"reflect"
"path"
"strings"
)

var defaultTransport = "websocket"

type Options struct {
Transport string //protocol name string,websocket polling...
Query map[string]string //url的附加的参数

}

type Client struct {
opts *Options

conn *clientConn

events map[string]*caller
acks map[int]*caller
events map[string]*caller
acks map[int]*caller
id int
namespace string
}

func NewClient(uri string, opts *Options) (client *Client, err error) {
exist := false
for _, b := range transports {
if b == opts.Transport {
exist = true
}
}
if !exist {
opts.Transport = defaultTransport
}

request := &http.Request{}
request.URL, err = url.Parse(uri)
url, err := url.Parse(uri)
if err != nil {
return
}
q := request.URL.Query()
url.Path = path.Join("/socket.io",url.Path)
url.Path = url.EscapedPath()
if strings.HasSuffix(url.Path,"socket.io"){
url.Path+="/"
}
q := url.Query()
for k, v := range opts.Query {
q.Set(k, v)
}
request.URL.RawQuery = q.Encode()
url.RawQuery = q.Encode()

socket, err := newClientConn(opts.Transport, request)
socket, err := newClientConn(opts.Transport, url)
if err != nil {
return
}

client = &Client{
opts: opts,
opts: opts,
conn: socket,

events: make(map[string]*caller),
Expand Down
63 changes: 41 additions & 22 deletions client_conn.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"github.com/googollee/go-engine.io/websocket"
"io"
"net/http"
"net/url"
"strings"
"sync"
"time"
Expand Down Expand Up @@ -55,6 +56,7 @@ const (
type clientConn struct {
id string
transportName string
url *url.URL
request *http.Request
writerLocker sync.Mutex
transportLocker sync.RWMutex
Expand All @@ -70,13 +72,18 @@ type clientConn struct {
pingChan chan bool
}

func newClientConn(transportName string, r *http.Request) (client *clientConn, err error) {
func newClientConn(transportName string, u *url.URL) (client *clientConn, err error) {
if transportName == "" {
transportName = "polling"
transportName = "websocket"
}

_, exists := creaters[transportName]
if !exists {
return nil, InvalidError
}

client = &clientConn{
request: r,
url: u,
transportName: transportName,
state: stateNormal,
pingTimeout: 60000 * time.Millisecond,
Expand Down Expand Up @@ -245,6 +252,12 @@ func (c *clientConn) OnClose(server transport.Client) {

func (c *clientConn) onOpen() error {

var err error
c.request, err = http.NewRequest("GET", c.url.String(), nil)
if err != nil {
return err
}

creater, exists := creaters["polling"]
if !exists {
return InvalidError
Expand Down Expand Up @@ -316,29 +329,35 @@ func (c *clientConn) onOpen() error {
}
//fmt.Println(string(p2))

//upgrade
creater, exists = creaters["websocket"]
if !exists {
return InvalidError
}
if c.transportName == "polling" {
//over
} else if c.transportName == "websocket" {
//upgrade
creater, exists = creaters["websocket"]
if !exists {
return InvalidError
}

c.request.URL.Scheme = "ws"
q.Set("sid", c.id)
q.Set("transport", "websocket")
c.request.URL.RawQuery = q.Encode()
c.request.URL.Scheme = "ws"
q.Set("sid", c.id)
q.Set("transport", "websocket")
c.request.URL.RawQuery = q.Encode()

transport, err = creater.Client(c.request)
if err != nil {
return err
}
c.setUpgrading("websocket", transport)
transport, err = creater.Client(c.request)
if err != nil {
return err
}
c.setUpgrading("websocket", transport)

w, err := c.getUpgrade().NextWriter(message.MessageText, parser.PING)
if err != nil {
return err
w, err := c.getUpgrade().NextWriter(message.MessageText, parser.PING)
if err != nil {
return err
}
w.Write([]byte("probe"))
w.Close()
} else {
return InvalidError
}
w.Write([]byte("probe"))
w.Close()

//fmt.Println("end")

Expand Down
5 changes: 3 additions & 2 deletions example/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,13 @@ import (
func main() {

opts := &socketio_client.Options{
Transport: "websocket",
//Transport:"polling",
Transport:"websocket",
Query: make(map[string]string),
}
opts.Query["user"] = "user"
opts.Query["pwd"] = "pass"
uri := "http://192.168.1.70:9090/socket.io/"
uri := "http://192.168.1.70:9090"

client, err := socketio_client.NewClient(uri, opts)
if err != nil {
Expand Down
3 changes: 2 additions & 1 deletion example/test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,13 @@ import (
func main() {

opts := &socketio_client.Options{
//Transport:"polling",
Transport:"websocket",
Query:make(map[string]string),
}
opts.Query["uid"] = "1"
opts.Query["cid"] = "conf_123"
uri := "http://192.168.1.70:9090/socket.io/"
uri := "http://192.168.1.70:9090"

client,err := socketio_client.NewClient(uri,opts)
if err != nil {
Expand Down

0 comments on commit 3afbc90

Please sign in to comment.