TCP协议通信中,两个客户端之间是如何进行通信的

我现在在学习JAVA的网络编程,我想实现一个类似于QQ那样的通信软件,但是我不知道客户端与客户端之间是怎么通信,他们是通过一个服务端来进行通信的吗,例如:客户端A想跟客户端B通信,需要客户端A先跟服务端C通信,然后再通过服务端C与客户端B通信,是这样吗?

0

1个回答

对的
A将信息发给C,C在socket表中查找之前C与B的socket,然后根据这个socket,把信息转发给B

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
QT下的TCP协议,服务端与客户端之间的通信
主要是写这个来记录一下,当作复习笔记。 在QT里,自己创建两个文件,一个当做客户端,一个当做服务端。 一、服务端 服务端主要有两个重要的套接字,一个是监听套接字 QTcpServer,一个是通信套接字QTcpsocket. 在写服务端时,我没用ui界面,手写按钮,文本框啥的。 ①在服务端头文件里写如下代码: #include <QTcpServer> #include &lt...
tcp 多路复用实现 两个客户端之间的通信
/******************************* 服务器端  ****************************/ #include #include #include #include #include #include #include #include #include #include #define BACKLO
如何进行客户端之间的通信
已经能和服务器进行通信了,但是客户端之间因该怎样通信呢?如果要通过服务器转发那么要怎样获得2个客户端的地址呢?
TCP客户端与服务端之间的通信
客户端package cn.itcast.net.p4.tcp; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; public class ClientDemo2 { /** * * @param args *...
基于Tcp协议的服务器与客户端通信之客户端
在Qt上实现服务器与客户端的通信,本资源为客户端示例,仅供参考。
QQ的各个客户端之间是如何进行通信的?
QQ的各个客户端之间是如何进行通信的?rn假设客户端A要与B聊天,是:rn1、A发消息到服务器,再由服务器转发给B(对服务器造成太大的压力)吗?rn2、UDP打洞,A登陆服务器,服务器记下IP及端口号,B登陆服务器,服务器记下B的iP及端口,然后把A的IP及端口发给B,把B的IP及端口发给A,最后进行通信时,就直接发消息给对方(不须要再用服务器了),但如果双方都在内网里面(局域网),就通过网关连接到服务器,服务器得到的就是你外网(网关)的IP及端口,其它人(服务器及好友等)要给你发信息,就给你的外网的IP及及端口发信息,网关就把收到的信息转发到你局域网内的IP及端口rn方法2是我的一个思路,不知可行否?还有由于双方在局域网内会在网关上产生session 端口,session 端口据我所知,你过一段时间不进行操作,隔一段时间后,你再发信息,它就会变化,那不是其它人就不能给你发信息了吗,端口不正确了嘛?rn或者各位有其它的思路和方法也就更好?
Remoting 是如何应用到在客户端与服务器和对等通信中的?
以前看过一篇文章,可现在找时又找不到了!
TCP 协议是如何进行拥塞控制的?
tcp从客户端每次发送一次数据服务器返回一个确认,这样效率非常的低,所以就有窗口这个概念,每一次最大报文段长度(mss)都是1024,设定窗口为2048的话第一次发送1024(1~1025)后不等他的确认,再次发送1024(1025~2049),而后服务端一次性确认之前的数据,ack序号为2049(之前总量加1,也就是下次的开始号),这个节省了开销。 按理来说服务端的拥塞控制有定
C#socket编程——TCP协议创建服务器端和客户端并进行通信
我们做网络通信的时候需要有通信协议,在进行socket编程的时候有两种通信协议TCP、UDP,这次我们就用简单的方式在一台电脑建立TCP协议的服务器端和客户端并使之进行通信。 服务器端和客户端进行连接,第一步就行在服务器端创建一个socket,开始监听客户端的连接,然后在客户端创建一个socket,向服务器端发起连接,这样连接建立起来之后就可以进行数据的交换。 由于Visual Studio一...
移动端与后台之间是如何进行通信的?
如题,想请教下大家。因为我现在想开发一个app(包括安卓端和苹果端),不过自己在移动端与后台之间的通信这方面不是很有概念,因为我本身是刚出来做开发工作的小白,目前是做网站后台(使用SSH框架),所以可能需要大神们不吝赐教,希望能较为详细地描述下通信的过程:通信机制、通信协议、数据格式以及前后台对数据格式的处理。万分感谢哈!
实现客户端和服务器之间的通信(TCP协议、多线程)
1、myhead.h #ifndef _MYHEAD_H_ #define _MYHEAD_H_ #include #include #include #include #include #include #include #include #define MYPORT 6666 #define MYADDR "192.168.1.100" #endif 2、tcp_s
多线程TCP通信(客户端之间的数据共享)
  1.创建服务端用作读取客户端的每一行内容,   并分享给每个客户端。   package chat; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Outp...
基于TCP 实现客户端之间通信【1】
前段时间学习了基于TCP协议及duoxiancheng实现服务器与一个客户端或多个客户端之间通信以及客户端之间互相通信
TCP服务器、客户端之间的相互通信
TCP服务器、客户端之间的相互通信 之前的版本只能实现TCP服务器之间单发单收,此版本能实现TCP服务器和客户端之间的相互通信。 见下面的程序: tcp_server.c #include #include #include #include #include #include #include #define PORT 3333 int main() { int
基于TCP的客户端与服务器端之间的通信
使用说明:把服务器IP地址更改为自己的服务器主机IP地址即可import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.DataInputStream; import java.io.DataOutputStream; import ja
qt 服务器与多个客户端之间的tcp通信
qt的tcp通信,实现多个客户端与一个服务器之间的通信。 注意事项:客户端发送时格式“名称”+“:”+“要发送的消息”; 若是不加冒号,服务器程序会崩溃。按照指定格式发送消息。这样服务器回复消息时可以指定客户端,也可以对所有客户端发送消息
TCP通信中,客户端发送文件内容到服务器端的实现...
如何实现呢?大家给点意见啊,多谢啦!
COM协议通信与TCP协议通信
C#串口监听的实现在 Visual Stdio 2005中,对于串口操作Framework提供了一个很好的类接口-SerialPort,在这当中,串口数据的读取与写入有较大的不同。C#串口监听的实现由于串口不知道数据何时到达,因此有两种方法可以实现C#串口监听之串口数据的读取。1.用线程实时读串口2.用事件触发方式实现。但由于线程实时读串口的效率不是十分高效,因此比较好的方法是事件触发的方式。在SerialPort类中有DataReceived事件,当串口的读缓存有数据到达时则触发DataReceived事件,其中SerialPort.ReceivedBytesThreshold属性决定了当串口读缓存中数据多少个时才触发DataReceived事件,默认为1。 此外,SerialPort.DataReceived事件运行比较特殊,其运行在辅线程,不能与主线程中的显示数据控件直接进行数据传输,必须用间接的方式实现。 TCP协议被称作一种端对端协议。这是因为它为两台计算机之间的连接起了重要作用:当一台计算机需要与另一台远程计算机连接时,TCP协议会让它们建立一个连接、发送和接收数据以及终止连接。 TCP是提供面向连接的,可靠的字节流服务。面向连接是TCP在正式进行通讯之前首先通过一些握手机制确认双方通讯意向并建立一条认为可以传输的概念通道。字节流服务是TCP传输的最小单位为字节,认为字节是有意义的单位。并且TCP不会在此字节流中插入记录符号。发送端不对字节数据做任何解释,均由接收端的应用完成解释。
tcp通信中同时收到两个数据包,怎么办?
我在做一个TCP/IP通信程序,在发出一个请求包后,希望收到一个应答包,或者什么也没有,等待一段时间后自动返回。rn但是在试验时发现,如果连续发送两个请求包,可能两个应答包并在一起返回了(单包数据量比较小,不超过50字节)。rn我想,windows是事件驱动的,操作系统在接收缓冲区准备好以后,再发个事件消息通知程序的。因此我想如果发现同时收到两个以上的数据包,取得第一个包后就模仿操作系统发一个消息给程序自身让它去处理,然后再取下一个包,再发消息,就像两个包是单独到达的一样。rn现在的问题是,不知道操作系统发的这个消息是什么。用Spy++看过,还是不知道。哪位知道的请告诉我,或者如果有更好的方法,也请告知,253了
两个TCP服务端之间的通信交互
现在我有一个服务程序建立了2个TCP服务端,侦听端口A和B,想实现将A端口侦听收到的数据通过B服务端的B端口发送出去,然后再将B端口收到的数据通过A服务端A端口发送出去,实现一个中间过渡的功能。我的想法是通过一个全局的队列中间赋值后再传递,由于是多线程共享全局变量需要临界区变量实现互斥,但是这样的效率每次只能处理A端发来的一个请求。有没有更好的解决方式,或者给出相关的资料也可以
wcf 客户端之间如何通信
类似聊天工具,现在我能实现的是广播信息,rn客户端连接时订阅事件,然后客户端调用服务器方法时触发所有订阅者事件,即广播到所有已连接的客户端。rn但现在我想实现类似悄悄话的功能,a向b发送信息只有b能看到,怎么做?rn,
西门子 TCP通信中的Fetch和Write用法
西门子 TCP通信中的Fetch和Write用法,PLC侧无需编程,公开的通信格式
MFC TCP通信中网络字节序问题
RT,现象:rn客户端发送UINT16 senddata=0xefdf,0x7def;rn服务器端接收到的是 df ef ef 7d;rnrn服务器端发送 df ef ef 7d;rn客户端收到0xdf 0xef 0xef 0x7d;rnrn问题:我想要服务器端收到 ef df 7d ef,该咋实现?是要在发送前用htons函数吗?但是htons函数参数是u_short类型的。我的发送数组是UINT16,这个该咋转换呢?rnrn疑问:服务器发送,客户端接收时,发送和接收的顺序是对的。这是因为tcp是按字节一个一个发送的吗?rnrn补充,客户端是我自己代码。服务器是个tcp测试小软件,服务器端数据是在编辑框里看的。客户端是在程序监视里面看的。rnrn请大神给解释一下,感谢rn
TCP协议通信
C#实现的TCP协议下客户端与服务器端的通信。 服务器端可记录客户端的上线、下线等
UDP与TCP协议通信
自已写的通信功能,两个机器互发信息,东西虽小,技术却一点没少,新手学习很方便
基于TCP协议的通信
socket套接字:绑定一个端口,用于该端口的通信服务socket.getInputStream()       用套接字可以获取输入输出流,通过输入输出流可以进行数据的传输socket.shutdowmOutput()   用套接字可以关闭半读或半写状态socket.IsInputstream()         返回一个布尔值,如果为true,就说明该线程已关闭半读状态socket.getIn...
tcp/ip通信中listen函数的参数设置
listen函数的第二个参数即backlog最大可以设为多少呢?SOMAXCONN是在哪里定义的啊?
TCP通信中的readLine()方法遇到的问题
TCP通信中的readLine() Server.java ServerSocket ss=new ServerSocket(10086); Socket s=ss.accept(); BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream())); // 封装目的地文本文件 BufferedWr...
[c#源码分享]TCP通信中的大文件传送
[url=http://pan.baidu.com/s/1o6zETAy] 源码[/url] (为节省空间,不包含通信框架源码,通信框架源码请另行下载)rnrn文件传送在TCP通信中是经常用到的,本文针对文件传送进行探讨rnrn经过测试,可以发送比较大的文件,比如1个G或者2个Grnrn本文只对文件传送做了简单的探讨,示例程序可能也不是很成熟,希望本文起到抛砖引玉的作用,有兴趣的朋友帮忙补充完善rnrn首先看一下实现的效果rnrn服务器端:[img=https://img-bbs.csdn.net/upload/201503/06/1425618275_501821.jpg][/img]rn客户端(一次只能发送一个文件):rn[img=https://img-bbs.csdn.net/upload/201503/06/1425618288_992931.jpg][/img]rn服务器端收到的文件,存放到了D盘根目录下(存放的路径可以根据情况修改)rnrn[color=#FF6600]本程序基于开源的networkcomms2.3.1通信框架[/color]rnrn下面来看一下实现的步骤:rnrn1、客户端rnrn (1): 先连接服务器: rn[code=csharp] //给连接信息对象赋值rn connInfo = new ConnectionInfo(txtIP.Text, int.Parse(txtPort.Text));rnrn //如果不成功,会弹出异常信息rn newTcpConnection = TCPConnection.GetConnection(connInfo);rnrn TCPConnection.StartListening(connInfo.LocalEndPoint);rnrn button1.Enabled = false;rn button1.Text = "连接成功";[/code]rn(2)发送大文件(分段发送) rn[code=csharp]private void SendFileButton_Click(object sender, EventArgs e)rn rn //打开对话框,获取文件rn if (openFileDialog1.ShowDialog() == DialogResult.OK)rn rn //暂时禁用发送按钮rn sendFileButton.Enabled = false;rnrn //获取对话框中选择的文件的名称rn string filename = openFileDialog1.FileName;rnrn //设置进度条显示为0rn UpdateSendProgress(0);rnrn tryrn rn //创建一个文件流rn FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read);rnrn //创建一个线程安全流rn ThreadSafeStream safeStream = new ThreadSafeStream(stream);rnrn //获取不包含路径的文件名称rn string shortFileName = System.IO.Path.GetFileName(filename);rnrn //每次发送的字节数 可根据实际情况进行设定rn long sendChunkSizeBytes = 40960;rn //已发送的字节数rn long totalBytesSent = 0;rn dorn rn //检查剩余的字节数 小于 上面指定的字节数 则发送"剩余的字节数" 否则发送"指定的字节数"rn long bytesToSend = (totalBytesSent + sendChunkSizeBytes < stream.Length ? sendChunkSizeBytes : stream.Length - totalBytesSent);rnrnrn //包装一个ThreadSafeStream 使之可以分段发送rn StreamSendWrapper streamWrapper = new StreamSendWrapper(safeStream, totalBytesSent, bytesToSend);rnrn //顺序号 rn long packetSequenceNumber;rn //发送指定数据rn newTcpConnection.SendObject("PartialFileData", streamWrapper, customOptions, out packetSequenceNumber);rn //发送指定的数据相关的信息rn newTcpConnection.SendObject("PartialFileDataInfo", new SendInfo(shortFileName, stream.Length, totalBytesSent, packetSequenceNumber), customOptions);rnrn totalBytesSent += bytesToSend;rnrnrn UpdateSendProgress((double)totalBytesSent / stream.Length);rn //两次发送之间间隔一定时间rn System.Threading.Thread.Sleep(30);rnrnrn while (totalBytesSent < stream.Length);rnrnrnrn rn catch (CommunicationException)rn rnrn rn catch (Exception ex)rn rnrn NetworkComms.LogError(ex, "SendFileError");rnrn rnrn rn rn [/code]rnrn2:服务器端接收文件:rnrn (1)开始监听rn[code=csharp] //服务器开始监听客户端的请求 rn //开始监听某T端口rn IPEndPoint thePoint = new IPEndPoint(IPAddress.Parse(txtIP.Text), int.Parse(txtPort.Text)); rn TCPConnection.StartListening(thePoint, false);rn button1.Text = "监听中";rn button1.Enabled = false;rnrn //此方法中包含服务器具体的处理方法。rn StartListening();rn复制代码[/code]rn(2)添加接收文件处理方法rn[code=csharp] //处理收到的文件字节数据rn NetworkComms.AppendGlobalIncomingPacketHandler("PartialFileData", IncomingPartialFileData);rn //处理收到的文件信息数据rn NetworkComms.AppendGlobalIncomingPacketHandler("PartialFileDataInfo", IncomingPartialFileDataInfo);[/code]rn[code=csharp]//处理收到的文件字节数据rn rn private void IncomingPartialFileData(PacketHeader header, Connection connection, byte[] data)rn rn tryrn rn SendInfo info = null;rn ReceivedFile file = null;rnrn rn lock (syncRoot)rn rn //获取顺序号rn long sequenceNumber = header.GetOption(PacketHeaderLongItems.PacketSequenceNumber);rnrn if (incomingDataInfoCache.ContainsKey(connection.ConnectionInfo) && incomingDataInfoCache[connection.ConnectionInfo].ContainsKey(sequenceNumber))rn rn rn //如果已经收到此部分 “文件字节数据” 对应的 “文件信息数据”rn info = incomingDataInfoCache[connection.ConnectionInfo][sequenceNumber];rn incomingDataInfoCache[connection.ConnectionInfo].Remove(sequenceNumber);rn rn if (!receivedFilesDict.ContainsKey(connection.ConnectionInfo))rn receivedFilesDict.Add(connection.ConnectionInfo, new Dictionary());rnrn //如果当前收到字节数据,还没有对应的ReceivedFile类,则创建一个rn if (!receivedFilesDict[connection.ConnectionInfo].ContainsKey(info.Filename))rn rn receivedFilesDict[connection.ConnectionInfo].Add(info.Filename, new ReceivedFile(info.Filename, connection.ConnectionInfo, info.TotalBytes));rn rn rnrn file = receivedFilesDict[connection.ConnectionInfo][info.Filename];rn rn elsern rn rn if (!incomingDataCache.ContainsKey(connection.ConnectionInfo))rn incomingDataCache.Add(connection.ConnectionInfo, new Dictionary());rnrn incomingDataCache[connection.ConnectionInfo].Add(sequenceNumber, data);rn rn rnrn rn if (info != null && file != null && !file.IsCompleted)rn rn file.AddData(info.BytesStart, 0, data.Length, data);rnrn rn file = null;rn data = null;rn rn rn else if (info == null ^ file == null)rn throw new Exception("Either both are null or both are set. Info is " + (info == null ? "null." : "set.") + " File is " + (file == null ? "null." : "set.") + " File is " + (file.IsCompleted ? "completed." : "not completed."));rn rn catch (Exception ex)rn rn rn NetworkComms.LogError(ex, "IncomingPartialFileDataError");rn rn [/code]rn[code=csharp]//处理收到的文件信息数据rn private void IncomingPartialFileDataInfo(PacketHeader header, Connection connection, SendInfo info)rn rn tryrn rn byte[] data = null;rn ReceivedFile file = null;rnrn rn lock (syncRoot)rn rn //获取顺序号rn long sequenceNumber = info.PacketSequenceNumber;rnrn if (incomingDataCache.ContainsKey(connection.ConnectionInfo) && incomingDataCache[connection.ConnectionInfo].ContainsKey(sequenceNumber))rn rn //如果当前文件信息类对应的文件字节部分已经存在rn data = incomingDataCache[connection.ConnectionInfo][sequenceNumber];rn incomingDataCache[connection.ConnectionInfo].Remove(sequenceNumber);rnrn rn if (!receivedFilesDict.ContainsKey(connection.ConnectionInfo))rn receivedFilesDict.Add(connection.ConnectionInfo, new Dictionary());rnrn rn if (!receivedFilesDict[connection.ConnectionInfo].ContainsKey(info.Filename))rn rn receivedFilesDict[connection.ConnectionInfo].Add(info.Filename, new ReceivedFile(info.Filename, connection.ConnectionInfo, info.TotalBytes));rn rn rnrn file = receivedFilesDict[connection.ConnectionInfo][info.Filename];rn rn elsern rn rn if (!incomingDataInfoCache.ContainsKey(connection.ConnectionInfo))rn incomingDataInfoCache.Add(connection.ConnectionInfo, new Dictionary());rnrn incomingDataInfoCache[connection.ConnectionInfo].Add(sequenceNumber, info);rn rn rnrn rn if (data != null && file != null && !file.IsCompleted)rn rn file.AddData(info.BytesStart, 0, data.Length, data); rn file = null;rn data = null;rn rn rn else if (data == null ^ file == null)rn throw new Exception("Either both are null or both are set. Data is " + (data == null ? "null." : "set.") + " File is " + (file == null ? "null." : "set.") + " File is " + (file.IsCompleted ? "completed." : "not completed."));rn rn catch (Exception ex)rn rn NetworkComms.LogError(ex, "IncomingPartialFileDataInfo");rn rn [/code]rnrn[code=csharp][/code]
TCP协议如何进行流量控制
TCP使用的流量控制协议是可变大小的滑动窗口协议。 字节流服务:: 两个应用程序通过TCP连接交换8bit字节构成的字节流。TCP不在字节流中插入记录标识符。我们将这称为字节流服务(bytestreamservice)。 TCP对字节流的内容不作任何解释:: TCP对字节流的内容不作任何解释。TCP不知道传输的数据字节流是二进制数据,还是ASCII字符、EBCDIC字符或者其他类型数据。对字
通信中物理层的协议(3GPP的标准)
这是3GPP中的一些物理层协议R8版本,是全英文但绝对是好东西。
两个平台之间如何通信
比如说淘宝和支付宝,它们是两个平台,淘宝只是一个交易平台,支付宝是一个支付平台,它们二者之间是如何通信的呢,请求是如何传递的呢
两个程序之间如何通信
比如有个A。B两个程序rnA有个label是用来显示的 rnB里有个文本框,一个按钮 点击按钮 文本框里的文字显示在B的label里rn不借助本地文件和数据库rnrn我先取到A的句柄 然后遍历子窗口句柄 然后怎么改label的caption啊 setwindowtext不行rn或者有什么其他控件更适合放文本内容 这些内容将来是不显示的rn或者有其他方式的 只要能通信的就好rnrn先谢过了rnrn
两个applet 之间如何通信???
请大虾说一下思路,谢谢
两个程序之间如何通信?
一个是用asp编的网页程序,一个是vc编的程序。两个之间要有少量数据通信。rn我现在的解决办法是:vc程序把数据存入文件,网页程序从文件中读。rn但我觉得不太好,实际中也会出现“××内存不能读”的错误。rn各位大哥,如何解决。
两个JFrame之间如何通信
![图片说明](https://img-ask.csdn.net/upload/201604/26/1461633103_698493.png)n老师布置的软件工程大作业,这个我想这个高级查询new 一个JFrame 然后一系列选择之后传出一个SQL语句 然后这个库存查询的JFrame根据这个sql语句改变JTable的内容 一直没想明白要怎么弄 0,0 求大腿
如何实现客户端与客户端之间的一对一通信?
用c/s模型如何实现客户端与客户端之间的一对一通信?客户端与客户端之间实现的一对多的通信,是通过vector来实现的?那么一对一如何实现?
TCP通信,多客户端通信(客户端、服务端)
1、定义 客户端和服务器间的交流, 客户端发送信息,服务器接收到,并返回信息 长连接 2、使用步骤 客户端 创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器 调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流 输入流可以读取服务端输出流写出的数据 输出流可以写出数据到服务端的输入流 服务端 创建...
WCF如何通过代码创建TCP协议的双工客户端通信
我现在的客户端的绑定和地址以及创建端点都是通过配置文件来实现的: rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rnrn客户端调用: rn InstanceContext ic = new InstanceContext(new CallbackHandler());rn Test.TasksServiceClient client = new TasksServiceClient(ic);rn client.DoWork();rn client.Close();rnrn我现在希望配置文件中的Client节点中的endpoint address通过代码来实现怎么实现???
ActiveForm:两个客户端如何通信?
使用普通应用程序可以在两个客户端进行通信(类似聊天室),当把此程序转化rnrn成ActiveForm时(用IE作客户端)却毫无反应?rnrn(因涉及第三方控件,此处不便贴源代码)用ActiveForm发布时,如何进行客户端通rnrn信?