除其他外,WebRTC用于实时浏览器到浏览器媒体通信,但在我的情况下,它将用于浏览器到服务器的音频通信.
根据我收集的信息,使用RTP over UDP传输MediaStream.
除了用于信令的协议之外,这将需要至少两个额外的端口,这是我想要避免的.
在WebRTC中,是否有可能在Websocket上使用RTP而不是在UDP上使用RTP,这样我只需要使用端口80或443?
Microsoft 的 OUTPUT Clause 文档表示您可以在 OUTPUT 子句的列名中使用from_table_name 。
有两个例子:
是否也可以在INSERT 语句中使用它?
INSERT INTO T ( [Name] )
OUTPUT S.Code, inserted.Id INTO @TMP -- The multi-part identifier "S.Code" could not be bound.
SELECT [Name] FROM S;
Run Code Online (Sandbox Code Playgroud)
-- A table to insert into.
DECLARE @Item TABLE (
[Id] [int] IDENTITY(1,1),
[Name] varchar(100)
);
-- A table variable to store inserted Ids …Run Code Online (Sandbox Code Playgroud) 关于Go中浮点精度的问题使我想知道C如何处理问题.
使用C中的以下代码:
float a = 0.1;
Run Code Online (Sandbox Code Playgroud)
将a具有最接近的IEEE 754二进制表示:
00111101110011001100110011001101 (Decimal: 0.10000000149011612)
Run Code Online (Sandbox Code Playgroud)
或者只是将它裁剪成:
00111101110011001100110011001100 (Decimal: 0.09999999403953552)
Run Code Online (Sandbox Code Playgroud)
或者根据编译器/平台的不同而不同?
在GO中编写websocket服务器时(在我的情况下使用JSON编解码器),是否可以安全地使用两个不同的Go例程来处理在同一连接上发送和接收数据?
由于websocket.JSON.Receive暂停和等待接收数据,我认为处理数据发送的单独Go例程将是一个有效的解决方案,除非在同一连接上不能同时发送/接收.
那么,下面的工作示例是不良做法吗?
package main
import (
"fmt"
"net/http"
"code.google.com/p/go.net/websocket"
)
const queueSize = 20
type Input struct {
Cmd string
}
type Output struct {
Cmd string
}
func Handler(ws *websocket.Conn) {
msgWrite := make(chan *Output, queueSize)
var in Input
go writeHandler(ws, msgWrite)
for {
err := websocket.JSON.Receive(ws, &in)
if err != nil {
fmt.Println(err)
break
} else {
msgWrite <- &Output{Cmd: "Thanks for your message: " + in.Cmd}
}
}
}
func writeHandler(ws *websocket.Conn, out chan …Run Code Online (Sandbox Code Playgroud) 在time包中,格式化time.Time变量时,输出将使用未导出的[]字符串切片中定义的周和月的英文名称.
如何使用不同的语言本地化字符串(希望仍然使用Format())?
例:
fmt.Println(time.Now().Format("Mon 2 January 2006"))
Run Code Online (Sandbox Code Playgroud)
输出:
2014年1月28日星期二
期望的输出:
2014年1月28日,Januari
我有一个用户登录和注销邮票列表.遗憾的是,LOGIN条目可能并不总是后跟LOGOUT条目.
我希望在[event_date]命令时删除与前一行具有相同[event]和[user_id]的任何行.
有关如何执行此操作的建议吗?
示例表
CREATE TABLE #LOG (
[id] int IDENTITY(1,1),
[user_id] int,
[event] varchar(50),
[event_date] datetime
);
INSERT INTO #LOG ([user_id], [event], [event_date])
SELECT 1,'LOGIN',{ts '2010-12-15 15:31:59'}
UNION ALL SELECT 1,'LOGOUT',{ts '2010-12-15 15:32:55'}
UNION ALL SELECT 1,'LOGIN',{ts '2010-12-15 15:38:04'}
UNION ALL SELECT 1,'LOGOUT',{ts '2010-12-15 15:38:17'}
UNION ALL SELECT 1,'LOGOUT',{ts '2010-12-15 15:38:45'} -- Delete
UNION ALL SELECT 2,'LOGIN',{ts '2010-12-15 16:59:39'}
UNION ALL SELECT 2,'LOGOUT',{ts '2010-12-15 17:00:08'}
UNION ALL SELECT 2,'LOGOUT',{ts '2010-12-15 17:00:39'} -- Delete …Run Code Online (Sandbox Code Playgroud) 我在Ubuntu上运行Go编译器,使用安装 sudo apt-get install golang
我已成功编译并执行了一个Trivial示例服务器的代码(请参阅http://golang.org/pkg/websocket/#Handler)
package main
import (
"http"
"io"
"websocket"
)
// Echo the data received on the Web Socket.
func EchoServer(ws *websocket.Conn) {
io.Copy(ws, ws);
}
func main() {
http.Handle("/echo", websocket.Handler(EchoServer));
err := http.ListenAndServe(":12345", nil);
if err != nil {
panic("ListenAndServe: " + err.String())
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我无法使用我的Chromium版本(16.0.912.77)连接到服务器.我假设Chrome已经实现了RFC 6455 Websocket(版本13),但是Ubuntu golang包中的go websocket库已经过时了.
所以,我的问题是:如何只将websocket包更新到最新版本?
我想创建一个非阻塞队列包描述使用算法通过马吉德·M. Michael和迈克尔·L.·斯科特并发应用在这里.
这需要使用"sync/atomic"包提供的原子CompareAndSwap .
但是我不确定以下伪代码的Go等价物是什么:
E9: if CAS(&tail.ptr->next, next, <node, next.count+1>)
Run Code Online (Sandbox Code Playgroud)
其中tail和next类型:
type pointer_t struct {
ptr *node_t
count uint
}
Run Code Online (Sandbox Code Playgroud)
并且node是类型:
type node_t struct {
value interface{}
next pointer_t
}
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,似乎我需要用一个结构(一个指针和一个uint)来做一个CAS .使用atomic-package 可以实现这一点吗?
感谢帮助!
如何将类型变量转换**T为*unsafe.Pointer?
下面的示例将给出编译错误:
无法将&ptr(类型**s)转换为*unsafe.Pointer类型
package main
import (
"sync/atomic"
"unsafe"
)
type s struct {
value int
}
func main(){
var ptr *s
a := &s{42}
old := ptr
atomic.CompareAndSwapPointer(
(*unsafe.Pointer)(&ptr), // &unsafe.Pointer(ptr)
unsafe.Pointer(old),
unsafe.Pointer(a))
}
Run Code Online (Sandbox Code Playgroud)
如果我切换(*unsafe.Pointer)(&ptr)到&unsafe.Pointer(ptr),我将得到此编译错误:
不能取不安全的地址.Pointer(ptr)
PS.我选择做一个例子,sync/atomic因为这是你必须进行这种转换的一种情况.
编辑
一个不正确的解决方案是使用临时变量:
up := unsafe.Pointer(ptr)
atomic.CompareAndSwapPointer(&up, ...
Run Code Online (Sandbox Code Playgroud)
在编译时,CAS只会交换存储的内容up而不是内存中的内容ptr.这不是理想的结果,正如zeebo @#go-nuts所指出的那样.
对于带有自引用外键的表:
CREATE TABLE tree (
id INTEGER,
parent_id INTEGER,
PRIMARY KEY (id)
);
ALTER TABLE tree
ADD CONSTRAINT fk_tree
FOREIGN KEY (parent_id)
REFERENCES tree(id);
INSERT INTO tree (id, parent_id)
VALUES (1, null),
(2, 1),
(3, 1),
(4, 2),
(5, null),
(6, 5);
Run Code Online (Sandbox Code Playgroud)
我希望通过递归遍历树来删除分支,因为我可能不会使用ON DELETE CASCADE.
WITH RECURSIVE branch (id, parent_id) AS (
SELECT id, parent_id
FROM tree
WHERE id = 1 -- Delete branch with root id = 1
UNION ALL SELECT c.id, c.parent_id
FROM tree c -- …Run Code Online (Sandbox Code Playgroud) go ×5
sql ×3
websocket ×3
sql-server ×2
c ×1
concurrency ×1
localization ×1
package ×1
pointers ×1
postgresql ×1
queue ×1
rtp ×1
sql-delete ×1
struct ×1
t-sql ×1
time ×1
webrtc ×1