qt的tcp通信 服务器和客户端读写数据的问题
首先回答第一个问题,读和写可以有多种实现方式,用write和read只是其中一种,前面一个函数中的 clientConnection->write(block)是调用了QTcpSocket 类中的write方法来实现,如果你想不用此方法调用类中的read和write方法,就是你问的第二个问题,in和out的作用,in和out在这里将对socket中的报文收发变为数据流的形式来操作,QDataStream in(tcpSocket)比如这一句是将tcpSocket这个连接的实例对象作为一个文件描述符传递给QDataStream,然后in >> blockSize这句话实现的就是相当于read的操作,就是将数据流读出来。这个 out << (quint16)(block.size() - sizeof(quint16))是写入。实际上对诸如串口收发,读写文件,socket通信等等,用C语言来写,抽象出来都是对文件描述符进行操作,都可以用write和read来做,所以,实际上,第一种方法和第二种方法是一样的,就看你选择什么样的方法了,第三个问题可参考out << (quint16)(block.size() - sizeof(quint16))这样的方法在收到数据以后把数据发出去。
in和out的作用,in和out在这里将对socket中的报文收发变为数据流的形式来操作,QDataStream in(tcpSocket)比如这一句是将tcpSocket这个连接的实例对象作为一个文件描述符传递给QDataStream,然后in >> blockSize这句话实现的就是相当于read的操作,就是将数据流读出来。这个 out << (quint16)(block.size() - sizeof(quint16))是写入。实际上对诸如串口收发,读写文件,socket通信等等,用C语言来写,抽象出来都是对文件描述符进行操作,都可以用write和read来做,所以,实际上,第一种方法和第二种方法是一样的,就看你选择什么样的方法了,第三个问题可参考out << (quint16)(block.size() - sizeof(quint16))这样的方法在收到数据以后把数据发出去。

C#基于Tcp协议的socket通信,知道服务端发送数据长度、帧头和发送频率,如何在客户端取得完整一帧数据?
当然不能这么搞,TCP发送时都是分包的,也就是说你一次接收的数据很可能不是一个完整的数据包,这种东西在TCP里叫粘包和拆包,网上解决方法已经很多了,你可以搜索下 TCP粘包,拆包现象及解决方案C#粘包和分包问题及解决方法 注:正常情况下,你的接收和数据处理应该是两个单独的线程,这样才不会相互干扰。
? 国外评价6 版本系统

tcp客户端和服务器的关系
答:TCP客户端负责进行服务的请求,而服务器进行请求的响应。一个TCP服务器可以同时为多个TCP客户端进行服务。在进行通信之前必须先建立连接。

以下哪个类用于实现tcp通信的客户端程序
Socket类。 解析:在JDK中提供了两个用于实现TCP程序的类,一个是ServerSocket类,用于表示服务器端;另一个是Socket类,用于表示客户端。
之所以称为TCP服务器,是因为服务器端执行TCP的listen(监听连入请求)逻辑;而TCP客户端执行的是connect(请求连接)逻辑。 所以,不能可能让服务器去主动连接客户端端的。

C# TCP/IP中的客户端和服务器在局域网或外网怎么通信呀?谁有完整的例子呀.
这是我以前在学校的时候做的一个c/s系统里面的类似qq聊天工具 你看看。。这是客服端的代码:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Threading;using System.Net;using System.Net.Sockets;namespace demo2{public partial class frmTouchWe : Form{Thread a;//发送IP跟端口private UdpClient udp = new UdpClient("127.0.0.1",9000);//接收端口private UdpClient udpSend = new UdpClient(8000);private IPEndPoint ip = new IPEndPoint(IPAddress.Any,0);public frmTouchWe(){InitializeComponent();Form.CheckForIllegalCrossThreadCalls = false;}private void frmTouchWe_Load(object sender, EventArgs e){//定义线程开始a = new Thread(new ThreadStart(Run));a.Start();}private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e){//客服接收信息。弹出窗体frmAnswerInfo answerInfo = new frmAnswerInfo();answerInfo.Show();}private void button1_Click(object sender, EventArgs e){//在自己的信息栏中显示自己的信息lsbInfo.Items.Add(txtInfo.Text);//用户信息内容string Mes = txtInfo.Text;//用户信息string mes = "用户:"+Program.user.id+"("+Program.user.name+")"+"" + time;//转换成字节byte[] b = UTF8Encoding.UTF8.GetBytes(Mes);byte[] bb = UTF32Encoding.UTF8.GetBytes(mes);//发送信息udp.Send(bb, bb.Length);udp.Send(b, b.Length);txtInfo.Text = "";}//循环接受客服发来的信息private void Run(){while (true){byte[] b = udpSend.Receive(ref ip);string mes = UTF8Encoding.UTF8.GetString(b);lsbInfo.Items.Add(mes);}}private void button2_Click(object sender, EventArgs e){this.Close();}private void button3_Click_1(object sender, EventArgs e){//清空所有项lsbInfo.Items.Clear();}}}下面是服务器端的代码using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Threading;using System.Net;using System.Net.Sockets;namespace demo2{public partial class frmAnswerInfo : Form{//定义一条线程,用来循环接收客户发来的信息Thread a;//定义另一条线程,用来升起窗体Thread b;//发送到信息的地址private UdpClient udpSend = new UdpClient("127.0.0.1",8000);//接收端口private UdpClient udp = new UdpClient(9000);private IPEndPoint ip = new IPEndPoint(IPAddress.Any,0);public frmAnswerInfo(){InitializeComponent();Form.CheckForIllegalCrossThreadCalls = false;}//循环接收信息private void Run(){while (true){byte[] b = udp.Receive(ref ip);string mes = UTF8Encoding.UTF8.GetString(b);lsbInfo.Items.Add(mes);}}private void frmAnswerInfo_Load(object sender, EventArgs e){//设置窗体的位置属性(窗体加载时候慢慢从右下角升上来~类似qq广告~~)this.Top = Screen.PrimaryScreen.WorkingArea.Height;this.Left = Screen.PrimaryScreen.WorkingArea.Width - this.Width;//设置窗体的名字a = new Thread(new ThreadStart(Run));b = new Thread(new ThreadStart(run));//开始线程a.Start();b.Start();}//用户点击谈话时显示该窗体private void run(){while (true){this.Top = this.Top - 10;Thread.Sleep(100);if (Screen.PrimaryScreen.WorkingArea.Height - this.Height >= this.Top){break;}}}//发送按钮编码private void button1_Click(object sender, EventArgs e){//获取当前时间DateTime time = DateTime.Now;//在自己的信息栏中显示自己发出去的信息lsbInfo.Items.Add("在线客服:"+time);lsbInfo.Items.Add(txtInfo.Text);//在客户端显示自己的信息标题string mes = "在线客服:"+time;//信息内容string Mes = txtInfo.Text;//发送信息标题byte[] b = UTF8Encoding.UTF8.GetBytes(mes);//发送信息内容byte[] bb = UTF8Encoding.UTF8.GetBytes(Mes);udpSend.Send(b, b.Length);udpSend.Send(bb,bb.Length);txtInfo.Text = "";}private void button2_Click(object sender, EventArgs e){this.Close();}private void button3_Click(object sender, EventArgs e){//清除所有项lsbInfo.Items.Clear();}}} 这个可以跑的。。我以前就用过的。
socket,局域网 是没有问题的,但是广域网,需要用p2p 我这里有老外写得socket、server和client,非p2p,在局域网测试过了。 但是代码太长,贴不完,需要的话 留下mail。
这个得用p2p技术,普通的tcp/ip无法直接突破不同网段. 参看网址http://developer.51cto.com/art/200602/21200.htm
把机器防火墙关了,地址对,端口可用肯定连得上
项目?不会是北大青鸟的QQ吧。。。

本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/70499.html。