WebSocket 和 Socket 的区别
1、原理上的区别:Socket是传输控制层协议,WebSocket是应用层协议。Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口(不是协议,为了方便使用TCP或UDP而抽象出来的一层,是位于应用层和传输控制层之间的一组接口)。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面。利用TCP/IP协议建立TCP连接。(TCP连接则更依靠于底层的IP协议,IP协议的连接则依赖于链路层等更低层次。)WebSocket则是一个典型的应用层协议。2、灵活运用的程度不同:WebSocket 更易用,而 Socket 更灵活。Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。主机 A 的应用程序要能和主机 B 的应用程序通信,必须通过 Socket 建立连接,而建立 Socket 连接必须需要底层 TCP/IP 协议来建立 TCP 连接。建立 TCP 连接需要底层 IP 协议来寻址网络中的主机。网络层使用的 IP 协议可以帮助我们根据 IP 地址来找到目标主机,但是一台主机上可能运行着多个应用程序,如何才能与指定的应用程序通信就要通过 TCP 或 UPD 的地址也就是端口号来指定。这样就可以通过一个 Socket 实例唯一代表一个主机上的一个应用程序的通信链路了。而 WebSocket 则不同,它是一个完整的 应用层协议,包含一套标准的 API 。3、传输层次不同:Socket 是传输控制层的接口。用户可以通过 Socket 来操作底层 TCP/IP 协议族通信。网络中的 Socket 并不是什么协议,而是为了使用 TCP,UDP 而抽象出来的一层 API,它是位于应用层和传输层之间的一个抽象层。Socket 是对 TCP/IP 的封装;HTTP 是轿车,提供了封装或者显示数据的具体形式;Socket 是发动机,提供了网络通信的能力。在 Unix 一切皆文件哲学的思想下,Socket 是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次 HTTP 握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。参考资料来源:百度百科——WebSocket百度百科——socket
websocket原理是什么?
它的工作原理是Pub-Sub(发布和订阅)。它适用于发送者将数据(发布者)发送给抽象数量的收件人(订阅者),而无需指定他们是谁。根据定义,WebSocket是通过单个TCP连接提供全双工(双向通信)通信信道的计算机通信协议。此WebSocket API可在用户的浏览器和服务器之间进行双向通信。用户可以向服务器发送消息并接收事件驱动的响应,而无需轮询服务器。它可以让多个用户连接到同一个实时服务器,并通过API进行通信并立即获得响应。WebSockets允许用户和服务器之间的流连接,并允许即时信息交换。在聊天应用程序的示例中,通过套接字汇集消息,可以实时与一个或多个用户交换,具体取决于谁在服务器上“监听”(连接)。WebSockets不仅限于聊天/消息传递应用程序。它们适用于需要实时更新和即时信息交换的任何应用程序。一些示例包括但不限于:现场体育更新,股票行情,多人游戏,聊天应用,社交媒体等等。WebSockets还会考虑代理和防火墙等危险,使得任何连接都可以进行流式传输。它支持单个连接的上游和下游通信。它还减轻了服务器的负担,允许现有机器支持同时连接。
VC++中 用winsock 编写一个无连接协议的通讯程序
同学,你是在写客户段还是服务端?
若是客户端的话是不需要绑定地址的,若是服务端的话是不会指定一个实际ip地址的,
还有:
c++中首先需要加载Winsock库,不像java中的语句那样简单
如下:
WSADATA wsaData;
WORD sockVersion=MAKEWORD(2,2);//指定要加载Winsock库的版本.
//加载Winsock库
if(WSAStartup(sockVersion,&wsaData))
return 0;
然后创建套接字
而且你这里面还有很多语法错误
自己稍微再改改
VB 的ActivetX Dll 中如何用winsock的方法及事件与服务器的winsock通信?
如果你想在非VB环境里用VB里的控件是行不通的,主要因为以下几点:
1、VB的Active Dll要对运行环境进行检查,如果是非VB环境里调用的话,使用外部控件多数情况下会导致VB检查失败。
2、你要的按键精灵插件里本意是做标准DLL,而不是Active DLL,这种DLL VB本身就不支持(注:可以自己编写一些插件改造VB完成,但有一定限制)
3、使用标准DLL你不能使用额外的代码,包括并不限于:API/控件等,因为控件本身要对VB环境初始化,非VB的调用者(比如按键精灵等)无法完成这一点导致出错,对于API的访问,你无法确定调用者的行为,那么有可能出现API嵌套的情况,这种情况下VB必然失败(VB每次会调用一个API检查,如果在非VB代码里,检查会失败,我过去回答过这个问题)
所以,你可以用VB写ACTIVE DLL留给VB调用,但是你无法写active dll给别的语言用。
建议用VC做,因为它没有上面那么多限制,还有,用控件是完全不可以的。
===================================
这里有一份写好的代码可以用,你可以加百度HI然后我发给你或者你参考下面的做法:
创建一个Active DLL工程,添加一个窗体,窗体属性里visible设置是false,在窗体里添加一个winsock控件
窗体名字命名位WskFrm,窗体中粘贴如下代码:
Option Explicit
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim s As String
Winsock1.GetData s
Debug.Print s
End Sub
Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
Winsock1.Close
End Sub
把类模块命名为MyCls
把DLL工程命名为MyWskDll(必须做,否则容易名字冲突)
类模块里放置一些公开的方法,代码如下:
Option Explicit
Private Sub Class_Initialize()
Load WskFrm
End Sub
Public Sub ConnectTo(Hostname As String, Port As Integer)
WskFrm.Winsock1.Close
WskFrm.Winsock1.Connect Hostname, Port
End Sub
Public Function GetSckState() As Integer
GetSckState = WskFrm.Winsock1.State
End Function
Public Sub SendData(Data As String)
WskFrm.Winsock1.SendData Data
End Sub
Public Sub CloseSck()
WskFrm.Winsock1.Close
End Sub
Private Sub Class_Terminate()
Unload WskFrm
Set WskFrm = Nothing
End Sub
保存这个工程,然后添加一个标准EXE的工程,注意这里是添加不是新建
工程里防治两个按钮和如下的代码
Option Explicit
Private x As MyCls
Private Sub Command1_Click()
x.ConnectTo "www.yjrg.net", 23'链接
End Sub
Private Sub Command2_Click()
x.SendData "abc"'发送
End Sub
Private Sub Form_Load()
Set x = New MyCls' 创建对象
End Sub
然后要在标准EXE工程选中的情况下,点工程->引用,找到MyWskDll并选中确认。
然后设置标准EXE工程位启动工程
即可完成你的要求。
不明确的地方百度HI我