聊天软件原理?不是说服务器不会主动向客户端发送消息吗?只有客户...
即时通讯(Instant Messenger,简称IM)软件多是基于TCP/IP和UDP进行通讯的,TCP/IP和UDP都是建立在更低层的IP协议上的两种通讯传输协议。
前者是以数据流的形式,将传输数据经分割、打包后,通过两台机器之间建立起的虚电路,进行连续的、双向的、严格保证数据正确性的文件传输协议。
而后者是以数据报的形式,对拆分后的数据的先后到达顺序不做要求的文件传输协议。
QQ就是使用UDP协议进行发送和接收消息的。
当你的机器安装了OICQ以后,实际上,你既是服务端(Server),又是客户端(Client)。
当你登录OICQ时,你的OICQ作为Client连接到腾讯公司的主服务器上,当你“看谁在线时,你的OICQ又一次作为Client从QQ Server上读取在线网友名单。
当你和你的OICQ伙伴进行聊天时,如果你和对方的连接比较稳定,你和他的聊天内容都是以UDP的形式,在计算机之间传送。
如果你和对方的连接不是很稳定,QQ服务器将为你们的聊天内容进行中转。
其他的即时通信软件原理与此大同小异。
一般的步骤:首先,用户A输入自己的用户名和密码登录即时通讯服务器,服务器通过读取用户数据库来验证用户身份,如果用户名、密码都正确,就登记用户A的IP地址、IM客户端软件的版本号及使用的TCP/UDP端口号,然后返回用户A登录成功的标志,此时用户A在 IM系统中的状态为在线(Online Presence)。
其次,根据用户A存储在IM服务器上的好友列表(Buddy List),服务器将用户A在线的相关信息发送到也同时在线的即时通讯好友的PC机,这些信息包括在线状态、IP地址、 IM客户端使用的TCP端口(Port)号等,即时通讯好友PC机上的即时通讯软件收到此信息后将在PC桌面上弹出一个小窗口予以提示。
第三步,即时通讯服务器把用户A存储在服务器上的好友列表及相关信息回送到他的PC机,这些信息包括也在线状态、IP地址、IM客户端使用的TCP端口(Port)号等信息,用户A的PC机上的IM客户端收到后将显示这些好友列表及其在线状态。
接下来,如果用户A想与他的在线好友用户B聊天,他将直接通过服务器发送过来的用户B的IP地址、TCP端口号等信息,直接向用户B的PC机发出聊天信息,用户B的IM客户端软件收到后显示在屏幕上,然后用户B再直接回复到用户A的PC机,这样双方的即时文字消息就不通过 IM服务器中转,而是通过网络进行点对点的直接通讯,这称为对等通讯方式(Peer To Peer)。
在商用即时通讯系统中,如果用户A与用户B的点对点通讯由于防火墙、网络速度等原因难以建立或者速度很慢, IM服务器还提供消息中转服务,即用户A和用户B的即时消息全部先发送到IM服务器,再由服务器转发给对方。
早期的IM系统,在IM客户端和IM服务器之间通讯采用采用UDP协议,UDP协议是不可靠的传输协议,而在 IM客户端之间的直接通讯中,采用具备可靠传输能力的TCP协议。
随着用户需求和技术环境的发展,目前主流的即时通讯系统倾向于在即时通讯客户端之间、即时通讯客户端和即时通讯服务器之间都采用TCP协议。
Qt udp 如何得server端的Ip ,是在接收到server 端发送的信息之后通过...
展开全部 语音聊天软件主要有:YY语音、QT语音、Skype等等。
YY语音: YY语音是由欢聚时代公司开发的一款通讯用软件,它是一款基于Internet的团队语音通信平台,功能十分强大、通话音质清晰、性能安全稳定、资源占比小,在上线以来反响良好,能适应游戏玩家的各种需求。
在网络上通常用YY表示。
QT语音: QT语音是一款支持多人语音交流的团队语音通信软件,主要客户是需要进行团队协作的广大游戏用户,同时它也能适用于需要多人语音沟通的办公情况和家庭使用用户。
这款软件小巧、占内存比少、灵活简单,同时又性能卓越,能以极小的带宽占用方式,穿越防火墙,为用户提供清晰高质的语音服务。
除了以上两种,还有Skype软件也是现在十分受大家喜爱的聊天软件。
Skype是一款线上即时通讯软件,它的功能十分强大,比如可以进行实时视频聊天对话、通畅的多人语音会议、多人在线聊天、传送重要文件、文字轻聊天等功能。
它还可以以高清晰的语音质量与其他用户进行实时语音对话,也可以拨打国内或者国际电话,无论是固定电话、手机、小灵通都可直接拨打,并且还可以实现呼叫转移、短信发送等功能。
...
什么聊天软件好用
展开全部 全球最大的聊天工具是MSN,因为是世界通用的,只要是用WIN操作系统的一般就都会使用这个。
(下载MSN软件 → 安装 → 注册MSN帐号 → 登录MSN → 添加群帐号(或者管理员直接加你) → 打开群聊天窗口,设置个人信息 → MSN的一些常用设置 → 正式开始聊天。
MSN(Windows Live Messenger)是类似于QQ的一种即时通讯工具,其实有很多人再用这个软件,QQ所拥有的聊天功能MSN都有,所以很容易上手。
) 易信,可以发免费短信,需要加对方为好友,但对方可以不用易信也能收到。
QQ手机版(手机QQ)是由腾讯公司打造的移动互联网领航级手机应用,目前已经全面覆盖至各大手机平台,服务超过5.7亿的月活跃用户。
微信 (WeChat) 是腾讯公司于2011年1月21日推出的一个为智能终端提供即时通讯服务的免费应用程序,微信支持跨通信运营商、跨操作系统平台通过网络快速发送免费(需消耗少量网络流量)语音短信、视频、图片和文字,同时,也可以使用通过共享流媒体内容的资料和基于位置的社交插件“摇一摇”、“漂流瓶”、“朋友圈”、”公众平台“、”语音记事本“等服务插件。
飞信是中国移动的综合通信服务,是融合语音(IVR)、GPRS、短信等多种通信方式,覆盖三种不同形态(完全实时的语音服务、准实时的文字和小数据量通信服务、非实时的通信服务)的客户通信需求,实现互联网、移动互联网和移动网间的无缝通信服务。
?...
微信朋友圈里怎么转发朋友的文字信息
服务端代码如下:import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.event.*;import java.net.*;import java.io.*;/* * 聊天服务端的主框架类 */public class ChatServer extends JFrame implements ActionListener{ public static int port = 8888;//服务端的侦听端口 ServerSocket serverSocket;//服务端Socket Image icon;//程序图标 JComboBox combobox;//选择发送消息的接受者 JTextArea messageShow;//服务端的信息显示 JScrollPane messageScrollPane;//信息显示的滚动条 JTextField showStatus;//显示用户连接状态 JLabel sendToLabel,messageLabel; JTextField sysMessage;//服务端消息的发送 JButton sysMessageButton;//服务端消息的发送按钮 UserLinkList userLinkList;//用户链表 //建立菜单栏 JMenuBar jMenuBar = new JMenuBar(); //建立菜单组 JMenu serviceMenu = new JMenu ("服务(V)"); //建立菜单项 JMenuItem portItem = new JMenuItem ("端口设置(P)"); JMenuItem startItem = new JMenuItem ("启动服务(S)"); JMenuItem stopItem=new JMenuItem ("停止服务(T)"); JMenuItem exitItem=new JMenuItem ("退出(X)"); JMenu helpMenu=new JMenu ("帮助(H)"); JMenuItem helpItem=new JMenuItem ("帮助(H)"); //建立工具栏 JToolBar toolBar = new JToolBar(); //建立工具栏中的按钮组件 JButton portSet;//启动服务端侦听 JButton startServer;//启动服务端侦听 JButton stopServer;//关闭服务端侦听 JButton exitButton;//退出按钮 //框架的大小 Dimension faceSize = new Dimension(400, 600); ServerListen listenThread; JPanel downPanel ; GridBagLayout girdBag; GridBagConstraints girdBagCon;/** * 服务端构造函数 */ public ChatServer(){ init();//初始化程序 //添加框架的关闭事件处理 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.pack(); //设置框架的大小 this.setSize(faceSize); //设置运行时窗口的位置 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); this.setLocation( (int) (screenSize.width - faceSize.getWidth()) / 2, (int) (screenSize.height - faceSize.getHeight()) / 2); this.setResizable(false); this.setTitle("聊天室服务端"); //设置标题 //程序图标 icon = getImage("icon.gif"); this.setIconImage(icon); //设置程序图标 show(); //为服务菜单栏设置热键'V' serviceMenu.setMnemonic('V'); //为端口设置快捷键为ctrl+p portItem.setMnemonic ('P'); portItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_P,InputEvent.CTRL_MASK)); //为启动服务快捷键为ctrl+s startItem.setMnemonic ('S'); startItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_S,InputEvent.CTRL_MASK)); //为端口设置快捷键为ctrl+T stopItem.setMnemonic ('T'); stopItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_T,InputEvent.CTRL_MASK)); //为退出设置快捷键为ctrl+x exitItem.setMnemonic ('X'); exitItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_X,InputEvent.CTRL_MASK)); //为帮助菜单栏设置热键'H' helpMenu.setMnemonic('H'); //为帮助设置快捷键为ctrl+p helpItem.setMnemonic ('H'); helpItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_H,InputEvent.CTRL_MASK)); } /** * 程序初始化函数 */ public void init(){ Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout()); //添加菜单栏 serviceMenu.add (portItem); serviceMenu.add (startItem); serviceMenu.add (stopItem); serviceMenu.add (exitItem); jMenuBar.add (serviceMenu); helpMenu.add (helpItem); jMenuBar.add (helpMenu); setJMenuBar (jMenuBar); //初始化按钮 portSet = new JButton("端口设置"); startServer = new JButton("启动服务"); stopServer = new JButton("停止服务" ); exitButton = new JButton("退出" ); //将按钮添加到工具栏 toolBar.add(portSet); toolBar.addSeparator();//添加分隔栏 toolBar.add(startServer); toolBar.add(stopServer); toolBar.addSeparator();//添加分隔栏 toolBar.add(exitButton); contentPane.add(toolBar,BorderLayout.NORTH); //初始时,令停止服务按钮不可用 stopServer.setEnabled(false); stopItem .setEnabled(false); //为菜单栏添加事件监听 portItem.addActionListener(this); startItem.addActionListener(this); stopItem.addActionListener(this); exitItem.addActionListener(this); helpItem.addActionListener(this); //添加按钮的事件侦听 portSet.addActionListener(this); startServer.addActionListener(this); stopServer.addActionListener(this); exitButton.addActionListener(this); combobox = new JCom...
TCP与UDP应用的例子有哪些?
两种协议都是传输层协议,为应用层提供信息载体.TCP协议是基于连接的可靠协议,有流量控制和差错控制,也正因为有可靠性的保证和控制手段,所以传输效率比UDP低;UDP协议是基于无连接的不可靠协议,没有控制手段,仅仅是将数据发送给对方,因此效率比TCP要高.TCP一般用于文件传输(FTP HTTP 对数据准确性要求高,速度可以相对慢),发送或接收邮件(POP IMAP SMTP 对数据准确性要求高,非紧急应用),远程登录(TELNET SSH 对数据准确性有一定要求,有连接的概念)等等
微信朋友圈如何发布那些点进去有全文的信息
展开全部 微信发长篇文章方法1打开微信,在微信界面中切换到“微信”选项卡界面,在聊天记录中打开一个好友的聊天窗口,如图所示。
打开聊天窗口后,展开文本框以输入文字。
2在文本框中输入“faxinxi.la”代码(双引号无需输入),然后点击“发送”按钮即可。
发送成功后,点击“faxinxi.la”就会进入“发信息啦”界面...
腾讯QQ使用UDP协议的工作原理?
凡是是即时通信软件,原理都是大同小异的。
MSN和QQ都是使用UDP协议进行发送和接收“消息”的。
当你的机器安装了OICQ或者MSN以后,实际上,你既是服务端(Server),又是客户端(Client)。
当你登录OICQ(MSN)时,你的OICQ(MSN)作为Client连接到腾讯公司的主服务器上,当你“看谁在线”时,你的OICQ又一次作为Client从QQ Server上读取在线网友名单。
当你和你的OICQ伙伴进行聊天时,如果你和对方的连接比较稳定,你和他的聊天内容都是以UDP的形式,在计算机之间传送。
如果你和对方的连接不是很稳定,QQ服务器将为你们的聊天内容进行“中转”。
大致过程就是: 1、用户首先从软件服务器上获取好友列表,以建立点对点的联系; 2、用户(Client1)和好友(Client2)之间采用UDP方式发送信息; 3、如果无法直接点对点联系,则用服务器中转的方式完成。
QQ电脑管家专家团——小雨。
UDP数据包是什么?
展开全部 UDP协议的全称是用户数据报,在网络中它与TCP协议一样用于处理数据包。
在OSI模型中,在第四层——传输层,处于IP协议的上一层。
UDP有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
为什么要使用UDP 在选择使用协议的时候,选择UDP必须要谨慎。
在网络质量令人不十分满意的环境下,UDP协议数据包丢失会比较严重。
但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。
比如我们聊天用的ICQ和OICQ就是使用的UDP协议。
在Java中操纵UDP 使用位于JDK中Java.net包下的DatagramSocket和DatagramPacket类,可以非常方便地控制用户数据报文。
在描述它们之前,必须了解位于同一个位置的InetAddress类。
InetAddress实现了Java.io. Serializable接口,不允许继承。
它用于描述和包装一个Internet IP地址,通过三个方法返回InetAddress实例: getLocalhost():返回封装本地地址的实例。
getAllByName(String host):返回封装Host地址的InetAddress实例数组。
getByName(String host):返回一个封装Host地址的实例。
其中,Host可以是域名或者是一个合法的IP地址。
DatagramSocket类用于创建接收和发送UDP的Socket实例。
和Socket类依赖SocketImpl类一样,DatagramSocket类的实现也依靠专门为它设计的DatagramScoketImplFactory类。
DatagramSocket类有3个构建器: DatagramSocket():创建实例。
这是个比较特殊的用法,通常用于客户端编程,它并没有特定监听的端口,仅仅使用一个临时的。
DatagramSocket(int port):创建实例,并固定监听Port端口的报文。
DatagramSocket(int port, InetAddress localAddr):这是个非常有用的构建器,当一台机器拥有多于一个IP地址的时候,由它创建的实例仅仅接收来自LocalAddr的报文。
值得注意的是,在创建DatagramSocket类实例时,如果端口已经被使用,会产生一个SocketException的异常抛出,并导致程序非法终止,这个异常应该注意捕获。
DatagramSocket类最主要的方法有4个: Receive(DatagramPacket d):接收数据报文到d中。
receive方法产生一个“阻塞”。
Send(DatagramPacket d):发送报文d到目的地。
SetSoTimeout(int timeout):设置超时时间,单位为毫秒。
Close():关闭DatagramSocket。
在应用程序退出的时候,通常会主动释放资源,关闭Socket,但是由于异常地退出可能造成资源无法回收。
所以,应该在程序完成时,主动使用此方法关闭Socket,或在捕获到异常抛出后关闭Socket。
“阻塞”是一个专业名词,它会产生一个内部循环,使程序暂停在这个地方,直到一个条件触发。
DatagramPacket类用于处理报文,它将Byte数组、目标地址、目标端口等数据包装成报文或者将报文拆卸成Byte数组。
应用程序在产生数据包是应该注意,TCP/IP规定数据报文大小最多包含65507个,通常主机接收548个字节,但大多数平台能够支持8192字节大小的报文。
DatagramPacket类的构建器共有4个: DatagramPacket(byte[] buf, int length, InetAddress addr, int port):从Buf数组中,取出Length长的数据创建数据包对象,目标是Addr地址,Port端口。
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port):从Buf数组中,取出Offset开始的、Length长的数据创建数据包对象,目标是Addr地址,Port端口。
DatagramPacket(byte[] buf, int offset, int length):将数据包中从Offset开始、Length长的数据装进Buf数组。
DatagramPacket(byte[] buf, int length):将数据包中Length长的数据装进Buf数组。
DatagramPacket类最重要的方法就是getData()了,它从实例中取得报文的Byte数组编码。
★简单的实例说明 {接收数据的服务器} byte[] buf = new byte[1000]; DatagramSocket ds = new DatagramSocket(12345); //开始监视12345端口 DatagramPacket ip = new DatagramPacket(buf, buf.length); //创建接收数据报的实例 while (true) { ds.receive(ip); //阻塞,直到收到数据报后将数据装入IP中 System.out.println(new String(buf)); } {发送数据的客户端} InetAddress target = InetAddress.getByName("www.xxx.com"); //得到目标机器的地址实例 DatagramSocket ds = new DatagramSocket(9999); //从9999端口发送数据报 String hello = "Hello, I am come in!"; //要发送的数据 byte[] buf = hello.getBytes(); //将数据转换成Byte类型 op = new DatagramPacket(buf, buf.length, target, 12345); //将BUF缓冲区中的数据打包 ds.send(op); //发送数据 ds.close(); //关闭连接
转载请注明出处51数据库 » 基于qt的udp发送文字信息聊天小软件