如何用Qt的Qudpsocket传输图片文件?

如何用Qt的Qudpsocket传输图片文件?,第1张

主要是你通过socket api封装要发送的数据,内部会自动封装成数据流进行传输。

1,什么是Socket

网络上的两个程序通过一个双向的通讯连接磨者实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。

但是,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。在Java环境下,Socket编程主要是指谨衡基于TCP/IP协议的网络编程。

2,Socket通讯的过程

Server端Listen(监听)某个端口是否有连接请求,Client端向Server 端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建瞎晌薯立起来了。Server端和Client 端都可以通过Send,Write等方法与对方通信。

对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:

(1) 创建Socket;

(2) 打开连接到Socket的输入/出流;

(3) 按照一定的协议对Socket进行读/写 *** 作;

(4) 关闭Socket.(在实际应用中,并未使用到显示的close,虽然很多文章都推荐如此,不过在我的程序中,可能因为程序本身比较简单,要求不高,所以并未造成什么影响。)

3,创建Socket

创建Socket

java在包java.net中提供了两个类Socket和ServerSocket,分别用来表示双向连接的客户端和服务端。这是两个封装得非常好的类,使用很方便。其构造方法如下:

Socket(InetAddress address, int port)

Socket(InetAddress address, int port, boolean stream)

Socket(String host, int prot)

Socket(String host, int prot, boolean stream)

Socket(SocketImpl impl)

Socket(String host, int port, InetAddress localAddr, int localPort)

Socket(InetAddress address, int port, InetAddress localAddr, int localPort)

ServerSocket(int port)

ServerSocket(int port, int backlog)

ServerSocket(int port, int backlog, InetAddress bindAddr)

Socket client = new Socket("127.0.01.", 80)

ServerSocket server = new ServerSocket(80)

在创建socket时如果发生错误,将产生IOException,在程序中必须对之作出处理。所以在创建Socket或ServerSocket是必须捕获或抛出例外。

/**

*1、用递归毕野的方式依次传输单个文件

*2、将整个目录打手正喊包清脊成压缩文件,再通过tcp传输。

*/

tcpSocket->write()

在两台计算机传输文件之前,必需得先有一台计算机建立套接字连接并绑定一个固定得端口,并在这个端口侦听另外一台计算机的连接请求。

socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp)

socket.Blocking = true

IPEndPoint computernode1 = new IPEndPoint(serverIpadress, 8080)

socket.Bind(computernode1)

socket.Listen(-1)

当有其他的计算机发出连接请求的时候,被请求的计算机将对每一个连接请求分配一个线程,用于处理文件传输和其他服务。

while ( true )

{

clientsock = socket.Accept()

if ( clientsock.Connected )

{

Thread tc = new Thread(new ThreadStart(listenclient))

tc.Start()

}

}

下面的代码展示了listenclient方启橡法是如何处理另外一台计算机发送过来的请求。首先并对发送过来的请求字符串作出判断,看看是何种请求,然后决定相应的处理方法。

void listenclient()

{

Socket sock = clientsock

try

{

while ( sock != null )

{

byte[] recs = new byte[32767]

int rcount = sock.Receive(recs,recs.Length,0)

string message = System.Text.Encoding.ASCII.GetString(recs)

//对message作出处理,解析处请求字符和参数存储在cmdList 中

execmd=cmdList[0]

sender = null

sender = new Byte[32767]

string parm1 = ""

//目橡哗录列举

if ( execmd == "LISTING" )

{

ListFiles(message)

continue

}

//文件传输

if ( execmd == "GETOK" )

{

cmd = "BEGINSEND " + filepath + " " + filesize

sender = new Byte[1024]

sender = Encoding.ASCII.GetBytes(cmd)

sock.Send(sender, sender.Length , 0 )

//转到文件下载处理

DownloadingFile(sock)

continue

}

}

}

catch(Exception Se)

{

string s = Se.Message

Console.WriteLine(s)

}

}

至此,基本的工作已经完成了,下面我们看看如何处理文件传输的。

while(rdby <total &&nfs.CanWrite)

{

//从要传输的文件读取指定长度的数据

len =fin.Read(buffed,0,buffed.Length)

//将读取的数据发送梁旁行到对应的计算机

nfs.Write(buffed, 0,len)

//增加已经发送的长度

rdby=rdby+len

}

从上面的代码可以看出是完成文件转换成FileStream 流,然后通过NetworkStream绑定对应的套节子,最后调用他的write方法发送到对应的计算机。

我们再看看接受端是如何接受传输过来的流,并且转换成文件的:

NetworkStream nfs = new NetworkStream(sock)

try

{

//一直循环直到指定的文件长度

while(rby <size)

{

byte[] buffer = new byte[1024]

//读取发送过来的文件流

int i = nfs.Read(buffer,0,buffer.Length)

fout.Write(buffer,0,(int)i)

rby=rby+i

}

fout.Close()

从上面可以看出接受与发送恰好是互为相反的过程,非常简单。

至此,单方向的文件传输就完成了,只需要在每个对等的节点上同时实现上面的发送和接受的处理代码就可以做到互相传输文件了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12273858.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存