C#-TCP實(shí)現(xiàn)多個(gè)客戶端與服務(wù)端-數(shù)據(jù)-與-文件的傳輸_第1頁
C#-TCP實(shí)現(xiàn)多個(gè)客戶端與服務(wù)端-數(shù)據(jù)-與-文件的傳輸_第2頁
C#-TCP實(shí)現(xiàn)多個(gè)客戶端與服務(wù)端-數(shù)據(jù)-與-文件的傳輸_第3頁
C#-TCP實(shí)現(xiàn)多個(gè)客戶端與服務(wù)端-數(shù)據(jù)-與-文件的傳輸_第4頁
C#-TCP實(shí)現(xiàn)多個(gè)客戶端與服務(wù)端-數(shù)據(jù)-與-文件的傳輸_第5頁
已閱讀5頁,還剩21頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、C#菜鳥做這個(gè)東東竟然花了快三天的時(shí)間了,真是菜,菜,菜下面是我用C#寫的 一個(gè)簡(jiǎn)單的TCP通信,主要的功能有:(1) 多個(gè)客戶端與服務(wù)器間的數(shù)據(jù)交流(2)可以實(shí)現(xiàn)群發(fā)的功能(3)客戶端與服務(wù)端可以進(jìn)行文件的傳輸主要用到的知識(shí): TCP里的 socket 、 多線程 Thread 、下面的是界面:推薦精選下面分別是服務(wù)端和客戶端的代碼,如若借用,請(qǐng)標(biāo)明出處服務(wù)端代碼:csharp view plaincopyprint?using System; using System.Collections.Generic; using System.ComponentModel; using Syste

2、m.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net.Sockets; using System.Net; / IP,IPAddress, IPEndPoint,端口等; using System.Threading; using System.IO; namespace _11111 public partial class frm_server : Form public frm_server() 推薦精選 Initia

3、lizeComponent(); TextBox.CheckForIllegalCrossThreadCalls = false; Thread threadWatch = null; / 負(fù)責(zé)監(jiān)聽客戶端連接請(qǐng)求的 線程; Socket socketWatch = null; Dictionary<string, Socket> dict = new Dictionary<string, Socket>(); Dictionary<string, Thread> dictThread = new Dictionary<string, Thread>

4、;(); private void btnBeginListen_Click(object sender, EventArgs e) / 創(chuàng)建負(fù)責(zé)監(jiān)聽的套接字,注意其中的參數(shù); socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); / 獲得文本框中的IP對(duì)象; IPAddress address = IPAddress.Parse(txtIp.Text.Trim(); / 創(chuàng)建包含ip和端口號(hào)的網(wǎng)絡(luò)節(jié)點(diǎn)對(duì)象; IPEndPoint endPoint = new IPE

5、ndPoint(address, int.Parse(txtPort.Text.Trim(); try / 將負(fù)責(zé)監(jiān)聽的套接字綁定到唯一的ip和端口上; socketWatch.Bind(endPoint); catch (SocketException se) MessageBox.Show("異常:"+se.Message); return; / 設(shè)置監(jiān)聽隊(duì)列的長(zhǎng)度; socketWatch.Listen(10); / 創(chuàng)建負(fù)責(zé)監(jiān)聽的線程; threadWatch = new Thread(WatchConnecting); threadWatch.IsBackgrou

6、nd = true; threadWatch.Start(); ShowMsg("服務(wù)器啟動(dòng)監(jiān)聽成功!"); / / <summary> / 監(jiān)聽客戶端請(qǐng)求的方法; / </summary> void WatchConnecting() 推薦精選 while (true) / 持續(xù)不斷的監(jiān)聽客戶端的連接請(qǐng)求; / 開始監(jiān)聽客戶端連接請(qǐng)求,Accept方法會(huì)阻斷當(dāng)前的線程; Socket sokConnection = socketWatch.Accept(); / 一旦監(jiān)聽到一個(gè)客戶端的請(qǐng)求,就返回一個(gè)與該客戶端通信的 套接字; / 想列表控件中添加

7、客戶端的IP信息; lbOnline.Items.Add(sokConnection.RemoteEndPoint.ToString(); / 將與客戶端連接的 套接字 對(duì)象添加到集合中; dict.Add(sokConnection.RemoteEndPoint.ToString(), sokConnection); ShowMsg("客戶端連接成功!"); Thread thr = new Thread(RecMsg); thr.IsBackground = true; thr.Start(sokConnection); dictThread.Add(sokConnec

8、tion.RemoteEndPoint.ToString(), thr); / 將新建的線程 添加 到線程的集合中去。 void RecMsg(object sokConnectionparn) Socket sokClient = sokConnectionparn as Socket; while (true) / 定義一個(gè)2M的緩存區(qū); byte arrMsgRec = new byte1024 * 1024 * 2; / 將接受到的數(shù)據(jù)存入到輸入 arrMsgRec中; int length = -1; try length = sokClient.Receive(arrMsgRec)

9、; / 接收數(shù)據(jù),并返回?cái)?shù)據(jù)的長(zhǎng)度; catch (SocketException se) ShowMsg("異常:" + se.Message); / 從 通信套接字 集合中刪除被中斷連接的通信套接字; dict.Remove(sokClient.RemoteEndPoint.ToString(); / 從通信線程集合中刪除被中斷連接的通信線程對(duì)象; dictThread.Remove(sokClient.RemoteEndPoint.ToString(); / 從列表中移除被中斷的連接IP lbOnline.Items.Remove(sokClient.RemoteEn

10、dPoint.ToString(); break; catch (Exception e) 推薦精選 ShowMsg("異常:" + e.Message); / 從 通信套接字 集合中刪除被中斷連接的通信套接字; dict.Remove(sokClient.RemoteEndPoint.ToString(); / 從通信線程集合中刪除被中斷連接的通信線程對(duì)象; dictThread.Remove(sokClient.RemoteEndPoint.ToString(); / 從列表中移除被中斷的連接IP lbOnline.Items.Remove(sokClient.Remo

11、teEndPoint.ToString(); break; if (arrMsgRec0 = 0) / 表示接收到的是數(shù)據(jù); string strMsg = System.Text.Encoding.UTF8.GetString(arrMsgRec,1, length-1);/ 將接受到的字節(jié)數(shù)據(jù)轉(zhuǎn)化成字符串; ShowMsg(strMsg); if (arrMsgRec0 = 1) / 表示接收到的是文件; SaveFileDialog sfd = new SaveFileDialog(); if (sfd.ShowDialog(this) = System.Windows.Forms.Di

12、alogResult.OK) / 在上邊的 sfd.ShowDialog() 的括號(hào)里邊一定要加上 this 否則就不會(huì)彈出 另存為 的對(duì)話框,而彈出的是本類的其他窗口,這個(gè)一定要注意!【解釋:加了this的sfd.ShowDialog(this),“另存為”窗口的指針才能被SaveFileDialog的對(duì)象調(diào)用,若不加thisSaveFileDialog 的對(duì)象調(diào)用的是本類的其他窗口了,當(dāng)然不彈出“另存為”窗口?!?string fileSavePath = sfd.FileName;/ 獲得文件保存的路徑; / 創(chuàng)建文件流,然后根據(jù)路徑創(chuàng)建文件; using (FileStream fs

13、= new FileStream(fileSavePath, FileMode.Create) fs.Write(arrMsgRec, 1, length - 1); ShowMsg("文件保存成功:" + fileSavePath); void ShowMsg(string str) txtMsg.AppendText(str + "rn"); 推薦精選/ 發(fā)送消息 private void btnSend_Click(object sender, EventArgs e) string strMsg = "服務(wù)器" + "

14、;rn" + " ->" + txtMsgSend.Text.Trim() + "rn" byte arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg); / 將要發(fā)送的字符串轉(zhuǎn)換成Utf-8字節(jié)數(shù)組; byte arrSendMsg=new bytearrMsg.Length+1; arrSendMsg0 = 0; / 表示發(fā)送的是消息數(shù)據(jù) Buffer.BlockCopy(arrMsg, 0, arrSendMsg, 1, arrMsg.Length); string strKey =

15、 "" strKey = lbOnline.Text.Trim(); if (string.IsNullOrEmpty(strKey) / 判斷是不是選擇了發(fā)送的對(duì)象; MessageBox.Show("請(qǐng)選擇你要發(fā)送的好友!"); else dictstrKey.Send(arrSendMsg);/ 解決了 sokConnection是局部變量,不能再本函數(shù)中引用的問題; ShowMsg(strMsg); txtMsgSend.Clear(); / <summary> / 群發(fā)消息 / </summary> / <para

16、m name="sender"></param> / <param name="e">消息</param> private void btnSendToAll_Click(object sender, EventArgs e) string strMsg = "服務(wù)器" + "rn" + " ->" + txtMsgSend.Text.Trim() + "rn" byte arrMsg = System.Text.Encodin

17、g.UTF8.GetBytes(strMsg); / 將要發(fā)送的字符串轉(zhuǎn)換成Utf-8字節(jié)數(shù)組; 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.Net.Sockets;using System.Net; / IP,IPAddress, IPEndPoint,端口等;推

18、薦精選using System.Threading;using System.IO;namespace _11111 public partial class frm_server : Form public frm_server() InitializeComponent(); TextBox.CheckForIllegalCrossThreadCalls = false; Thread threadWatch = null; / 負(fù)責(zé)監(jiān)聽客戶端連接請(qǐng)求的 線程; Socket socketWatch = null; Dictionary<string, Socket> dict

19、 = new Dictionary<string, Socket>(); Dictionary<string, Thread> dictThread = new Dictionary<string, Thread>(); private void btnBeginListen_Click(object sender, EventArgs e) / 創(chuàng)建負(fù)責(zé)監(jiān)聽的套接字,注意其中的參數(shù); socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tc

20、p); / 獲得文本框中的IP對(duì)象; IPAddress address = IPAddress.Parse(txtIp.Text.Trim(); / 創(chuàng)建包含ip和端口號(hào)的網(wǎng)絡(luò)節(jié)點(diǎn)對(duì)象; IPEndPoint endPoint = new IPEndPoint(address, int.Parse(txtPort.Text.Trim(); try / 將負(fù)責(zé)監(jiān)聽的套接字綁定到唯一的ip和端口上; socketWatch.Bind(endPoint); catch (SocketException se) MessageBox.Show("異常:"+se.Message);

21、 return; / 設(shè)置監(jiān)聽隊(duì)列的長(zhǎng)度; socketWatch.Listen(10); / 創(chuàng)建負(fù)責(zé)監(jiān)聽的線程; threadWatch = new Thread(WatchConnecting); threadWatch.IsBackground = true;推薦精選 threadWatch.Start(); ShowMsg("服務(wù)器啟動(dòng)監(jiān)聽成功!"); / / <summary> / 監(jiān)聽客戶端請(qǐng)求的方法; / </summary> void WatchConnecting() while (true) / 持續(xù)不斷的監(jiān)聽客戶端的連接請(qǐng)求;

22、 / 開始監(jiān)聽客戶端連接請(qǐng)求,Accept方法會(huì)阻斷當(dāng)前的線程; Socket sokConnection = socketWatch.Accept(); / 一旦監(jiān)聽到一個(gè)客戶端的請(qǐng)求,就返回一個(gè)與該客戶端通信的 套接字; / 想列表控件中添加客戶端的IP信息; lbOnline.Items.Add(sokConnection.RemoteEndPoint.ToString(); / 將與客戶端連接的 套接字 對(duì)象添加到集合中; dict.Add(sokConnection.RemoteEndPoint.ToString(), sokConnection); ShowMsg("客戶

23、端連接成功!"); Thread thr = new Thread(RecMsg); thr.IsBackground = true; thr.Start(sokConnection); dictThread.Add(sokConnection.RemoteEndPoint.ToString(), thr); / 將新建的線程 添加 到線程的集合中去。 void RecMsg(object sokConnectionparn) Socket sokClient = sokConnectionparn as Socket; while (true) / 定義一個(gè)2M的緩存區(qū); byte

24、 arrMsgRec = new byte1024 * 1024 * 2; / 將接受到的數(shù)據(jù)存入到輸入 arrMsgRec中; int length = -1; try length = sokClient.Receive(arrMsgRec); / 接收數(shù)據(jù),并返回?cái)?shù)據(jù)的長(zhǎng)度; catch (SocketException se)推薦精選 ShowMsg("異常:" + se.Message); / 從 通信套接字 集合中刪除被中斷連接的通信套接字; dict.Remove(sokClient.RemoteEndPoint.ToString(); / 從通信線程集合中刪

25、除被中斷連接的通信線程對(duì)象; dictThread.Remove(sokClient.RemoteEndPoint.ToString(); / 從列表中移除被中斷的連接IP lbOnline.Items.Remove(sokClient.RemoteEndPoint.ToString(); break; catch (Exception e) ShowMsg("異常:" + e.Message); / 從 通信套接字 集合中刪除被中斷連接的通信套接字; dict.Remove(sokClient.RemoteEndPoint.ToString(); / 從通信線程集合中刪除

26、被中斷連接的通信線程對(duì)象; dictThread.Remove(sokClient.RemoteEndPoint.ToString(); / 從列表中移除被中斷的連接IP lbOnline.Items.Remove(sokClient.RemoteEndPoint.ToString(); break; if (arrMsgRec0 = 0) / 表示接收到的是數(shù)據(jù); string strMsg = System.Text.Encoding.UTF8.GetString(arrMsgRec,1, length-1);/ 將接受到的字節(jié)數(shù)據(jù)轉(zhuǎn)化成字符串; ShowMsg(strMsg); if (

27、arrMsgRec0 = 1) / 表示接收到的是文件; SaveFileDialog sfd = new SaveFileDialog(); if (sfd.ShowDialog(this) = System.Windows.Forms.DialogResult.OK) / 在上邊的 sfd.ShowDialog() 的括號(hào)里邊一定要加上 this 否則就不會(huì)彈出 另存為 的對(duì)話框,而彈出的是本類的其他窗口,這個(gè)一定要注意!【解釋:加了this的sfd.ShowDialog(this),“另存為”窗口的指針才能被SaveFileDialog的對(duì)象調(diào)用,若不加thisSaveFileDialo

28、g 的對(duì)象調(diào)用的是本類的其他窗口了,當(dāng)然不彈出“另存為”窗口?!?string fileSavePath = sfd.FileName;/ 獲得文件保存的路徑;推薦精選 / 創(chuàng)建文件流,然后根據(jù)路徑創(chuàng)建文件; using (FileStream fs = new FileStream(fileSavePath, FileMode.Create) fs.Write(arrMsgRec, 1, length - 1); ShowMsg("文件保存成功:" + fileSavePath); void ShowMsg(string str) txtMsg.AppendText(st

29、r + "rn"); / 發(fā)送消息 private void btnSend_Click(object sender, EventArgs e) string strMsg = "服務(wù)器" + "rn" + " ->" + txtMsgSend.Text.Trim() + "rn" byte arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg); / 將要發(fā)送的字符串轉(zhuǎn)換成Utf-8字節(jié)數(shù)組; byte arrSendMsg=new byt

30、earrMsg.Length+1; arrSendMsg0 = 0; / 表示發(fā)送的是消息數(shù)據(jù) Buffer.BlockCopy(arrMsg, 0, arrSendMsg, 1, arrMsg.Length); string strKey = "" strKey = lbOnline.Text.Trim(); if (string.IsNullOrEmpty(strKey) / 判斷是不是選擇了發(fā)送的對(duì)象; MessageBox.Show("請(qǐng)選擇你要發(fā)送的好友!"); else dictstrKey.Send(arrSendMsg);/ 解決了 so

31、kConnection是局部變量,不能再本函數(shù)中引用的問題; ShowMsg(strMsg); txtMsgSend.Clear(); / <summary> / 群發(fā)消息推薦精選 / </summary> / <param name="sender"></param> / <param name="e">消息</param> private void btnSendToAll_Click(object sender, EventArgs e) string strMsg = &qu

32、ot;服務(wù)器" + "rn" + " ->" + txtMsgSend.Text.Trim() + "rn" byte arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg); / 將要發(fā)送的字符串轉(zhuǎn)換成Utf-8字節(jié)數(shù)組;csharp view plaincopyprint? csharp view plaincopyprint?<span style="font-size: 14px;"> byte arrSendMsg = new b

33、ytearrMsg.Length + 1; / 上次寫的時(shí)候把這一段給弄掉了,實(shí)在是抱歉哈 用來標(biāo)識(shí)發(fā)送是數(shù)據(jù)而不是文件,如果沒有這一段的客戶端就接收不到消息了 arrSendMsg0 = 0; / 表示發(fā)送的是消息數(shù)據(jù) Buffer.BlockCopy(arrMsg, 0, arrSendMsg, 1, arrMsg.Length);</span> byte arrSendMsg = new bytearrMsg.Length + 1; / 上次寫的時(shí)候把這一段給弄掉了,實(shí)在是抱歉哈 用來標(biāo)識(shí)發(fā)送是數(shù)據(jù)而不是文件,如果沒有這一段的客戶端就接收不到消息了 arrSendMsg0 =

34、 0; / 表示發(fā)送的是消息數(shù)據(jù) Buffer.BlockCopy(arrMsg, 0, arrSendMsg, 1, arrMsg.Length);csharp view plaincopyprint?foreach (Socket s in dict.Values) s.Send(arrMsg); ShowMsg(strMsg); txtMsgSend.Clear(); ShowMsg(" 群發(fā)完畢"); / 選擇要發(fā)送的文件 private void btnSelectFile_Click_1(object sender, EventArgs e) OpenFileD

35、ialog ofd = new OpenFileDialog(); ofd.InitialDirectory = "D:" if (ofd.ShowDialog() = System.Windows.Forms.DialogResult.OK) txtSelectFile.Text = ofd.FileName; 推薦精選/ 文件的發(fā)送 private void btnSendFile_Click_1(object sender, EventArgs e) if (string.IsNullOrEmpty(txtSelectFile.Text) MessageBox.Sho

36、w("請(qǐng)選擇你要發(fā)送的文件!"); else / 用文件流打開用戶要發(fā)送的文件; using (FileStream fs = new FileStream(txtSelectFile.Text, FileMode.Open) string fileName=System.IO.Path.GetFileName(txtSelectFile.Text); string fileExtension=System.IO.Path.GetExtension(txtSelectFile.Text); string strMsg = "我給你發(fā)送的文件為: "+fi

37、leName+fileExtension+"rn" byte arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg); / 將要發(fā)送的字符串轉(zhuǎn)換成Utf-8字節(jié)數(shù)組; byte arrSendMsg = new bytearrMsg.Length + 1; arrSendMsg0 = 0; / 表示發(fā)送的是消息數(shù)據(jù) Buffer.BlockCopy(arrMsg, 0, arrSendMsg, 1, arrMsg.Length); bool fff = true; string strKey = "" st

38、rKey = lbOnline.Text.Trim(); if (string.IsNullOrEmpty(strKey) / 判斷是不是選擇了發(fā)送的對(duì)象; MessageBox.Show("請(qǐng)選擇你要發(fā)送的好友!"); else dictstrKey.Send(arrSendMsg);/ 解決了 sokConnection是局部變量,不能再本函數(shù)中引用的問題; byte arrFile = new byte1024 * 1024 * 2; int length = fs.Read(arrFile, 0, arrFile.Length); / 將文件中的數(shù)據(jù)讀到arrFil

39、e數(shù)組中; byte arrFileSend = new bytelength + 1; arrFileSend0 = 1; / 用來表示發(fā)送的是文件數(shù)據(jù); Buffer.BlockCopy(arrFile, 0, arrFileSend, 1, length); / 還有一個(gè) CopyTo的方法,但是在這里不適合; 當(dāng)然還可以用for循環(huán)自己轉(zhuǎn)化; / sockClient.Send(arrFileSend);/ 發(fā)送數(shù)據(jù)到服務(wù)端; dictstrKey.Send(arrFileSend);/ 解決了 sokConnection是局部變量,不能再本函數(shù)中引用的問題; txtSelectFil

40、e.Clear(); 推薦精選 txtSelectFile.Clear(); foreach (Socket s in dict.Values) s.Send(arrMsg); ShowMsg(strMsg); txtMsgSend.Clear(); ShowMsg(" 群發(fā)完畢"); / 選擇要發(fā)送的文件 private void btnSelectFile_Click_1(object sender, EventArgs e) OpenFileDialog ofd = new OpenFileDialog(); ofd.InitialDirectory = "

41、D:" if (ofd.ShowDialog() = System.Windows.Forms.DialogResult.OK) txtSelectFile.Text = ofd.FileName; / 文件的發(fā)送 private void btnSendFile_Click_1(object sender, EventArgs e) if (string.IsNullOrEmpty(txtSelectFile.Text) MessageBox.Show("請(qǐng)選擇你要發(fā)送的文件!"); else / 用文件流打開用戶要發(fā)送的文件; using (FileStrea

42、m fs = new FileStream(txtSelectFile.Text, FileMode.Open) string fileName=System.IO.Path.GetFileName(txtSelectFile.Text); string fileExtension=System.IO.Path.GetExtension(txtSelectFile.Text);推薦精選 string strMsg = "我給你發(fā)送的文件為: "+fileName+fileExtension+"rn" byte arrMsg = System.Text.E

43、ncoding.UTF8.GetBytes(strMsg); / 將要發(fā)送的字符串轉(zhuǎn)換成Utf-8字節(jié)數(shù)組; byte arrSendMsg = new bytearrMsg.Length + 1; arrSendMsg0 = 0; / 表示發(fā)送的是消息數(shù)據(jù) Buffer.BlockCopy(arrMsg, 0, arrSendMsg, 1, arrMsg.Length); bool fff = true; string strKey = "" strKey = lbOnline.Text.Trim(); if (string.IsNullOrEmpty(strKey) /

44、 判斷是不是選擇了發(fā)送的對(duì)象; MessageBox.Show("請(qǐng)選擇你要發(fā)送的好友!"); else dictstrKey.Send(arrSendMsg);/ 解決了 sokConnection是局部變量,不能再本函數(shù)中引用的問題; byte arrFile = new byte1024 * 1024 * 2; int length = fs.Read(arrFile, 0, arrFile.Length); / 將文件中的數(shù)據(jù)讀到arrFile數(shù)組中; byte arrFileSend = new bytelength + 1; arrFileSend0 = 1;

45、/ 用來表示發(fā)送的是文件數(shù)據(jù); Buffer.BlockCopy(arrFile, 0, arrFileSend, 1, length); / 還有一個(gè) CopyTo的方法,但是在這里不適合; 當(dāng)然還可以用for循環(huán)自己轉(zhuǎn)化; / sockClient.Send(arrFileSend);/ 發(fā)送數(shù)據(jù)到服務(wù)端; dictstrKey.Send(arrFileSend);/ 解決了 sokConnection是局部變量,不能再本函數(shù)中引用的問題; txtSelectFile.Clear(); txtSelectFile.Clear(); 客戶端代碼:csharp view plaincopypr

46、int?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.Net; using System.Net.Sockets; using System.Threading; using System.IO; namespace _2222222 public partial class frmClient : Form public frmClient() InitializeComponent(); TextBox.CheckForIllegalCrossThreadCalls = false; Thread threadClient = null; / 創(chuàng)建用于接收服務(wù)端消息的 線程; Socke

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論