c Socket如何非同步分批傳送和接收資料報

2021-05-02 22:15:38 字數 3897 閱讀 1642

1樓:匿名使用者

如果在同步的基礎上去改,改動會比較大,因為同步的socket通訊幾乎不需要什麼協議,而非同步一般是需要乙個簡單的協議,並且複雜程度會高很多,因為非同步本身就是不確定的。

我不太清楚你說的「處理分批傳送和接收大資料報」是什麼意思,我的理解就是用**把資料一塊一塊的傳送了然後再在目的端去重新組合,你的意思是乙個socket同時發訊息傳檔案等等?(長連線,不可取,協議會變得非常複雜)我印象中c#是有非同步的socket可以直接用的,十分簡單,可能需要改動一些結構。

不知道是否有用**驗證過傳送的包是否出錯(一般是需要的,在包的前面或者後面附一些bit就足夠了),如果想盡可能簡單的修改,就還是多執行緒仍然採用同步的方式好了,socket專用只維持短連線,監聽的監聽,傳送的傳送,接收的接收,處理的處理。如果需要提高程式的效率,搜尋一下重疊io,這個是高效率io的不二選擇。希望我沒理解錯

2樓:陳學陽

web的

reponse.write("");

winform

(messagebox.show("訊息", "訊息", messageboxbuttons.yesno) == dialogresult.yes)

如果對您有幫助,請記得採納為滿意答案,謝謝!祝您生活愉快!

vaela

c# socket 如何完全傳送/接收資料

3樓:大野瘦子

傳送:private void button2_click(object sender, eventargs e)

catch}}

接收:system.timers.timer atimer = new system.timers.timer();

byte res = new byte[1024];

private void form1_load(object sender, eventargs e)

void timermange()

private void socket_rev(object sender, eventargs e)}

4樓:匿名使用者

比如b1:1-100是乙個「資料報」,b2:0是乙個「資料報」,每次傳送以「資料報」為單位傳送,「資料報」中包含「開始」和「結束」的標記,那麼 傳送端 b1,b2的執行可以想象成 資料報b1:

b1開始+1~100+b1結束,資料報b2:b2開始+0+b2結束,接受端 接受到資料報b1的"b1開始"標記時,建立b1執行緒,b1執行緒接受到1~10時,接受端 接受到資料報b2的"b2開始"標記,建立b2執行緒,b2執行緒接受0,b2執行緒接受"b2結束"標記,釋放b2執行緒,同時b1執行緒接受到11~100和"b1結束"標記釋放b1執行緒。

文字描述的不是很給力,**例子看看,希望能讓你明白。

5樓:匿名使用者

存在情況:

1、 接收端迴圈沒寫好

2、沒有讀完網路流(快取可以設大些,或判斷是否讀到完所有的位元組)建議要一次發完所有資料 可以先將100個數字拼接成字串,然後傳送一次 。字串頭可加入[length=***]其中***是實際傳送的字串長度(注意不是位元組陣列buffer的長度),那麼對於上面的請求,則我們傳送的資料為:「[length=9]1,2,23,54」。

而服務端接收字串之後,首先讀取這個「元資料」的內容,然後再根據「元資料」內容來讀取實際的資料。取得內空後就可以拆分成數字

6樓:匿名使用者

伺服器端:

namespace sockettest

",socket.remoteendpoint);

socket.send(encoding.ascii.getbytes("welcome to server"));

//thread thread = new thread(receivemessage);

// thread.start();

}public static void receivemessage(object obj)

from ", datastring,socket.remoteendpoint);

//thread thread = new thread(sendmessage);

//thread.start(socket);

}static socket serversocket;

static void main(string args)

at port ", ipendclient.address, ipendclient.port);

//定義待傳送字元

string welcome = "welcome to my server";

//資料型別轉換

data = encoding.ascii.getbytes(welcome);

while (true)

catch (exception)

}client.close();

}//console.writeline("disconnect form", ipendclient.address);

serversocket.close();}}

}客戶端:

namespace client

public static void receivemessage(object obj)

from ", datastring, socket.remoteendpoint);

//thread thread = new thread(new parameterizedthreadstart(sendmessage));

//thread.start(socket);

}static void main(string args)

//異常處理

catch (socketexception e)

//定義接收資料的長度

int recv = socket.receive(data);

//將接收的資料轉換成字串

stringdata = encoding.ascii.getstring(data, 0, recv);

//控制台輸出接收到的資料

console.writeline(stringdata);

while(true)

//將從鍵盤獲取的字串轉換成整型資料並儲存在陣列中

data = encoding.ascii.getbytes(input);

//傳送該陣列

socket.send(data, data.length, socketflags.none);

////如果字串是"exit",退出while迴圈

//if (input == "exit")

//////對data清零

//data = new byte[1024];

////定義接收到的資料的長度

//recv = socket.receive(data);

////將接收到的資料轉換為字串

//stringdata = encoding.ascii.getstring(data, 0, recv);

////控制台輸出字串

//console.write(stringdata);

////傳送收到的資料

//socket.send(data, recv, 0);

}console.writeline("disconnect from server");

socket.shutdown(socketshutdown.both);

socket.close();}}}

7樓:天涯

你在傳送端 設定乙個標誌,說明我傳送的東西已經傳送完畢,你接受的時候,判斷接受的網路流中是否有這個標誌,如果有,代表已經接收完整了。否則沒有。

打字不易,如滿意,望採納。

同一信用證,分批發貨,怎麼提供單據,收匯

每裝運一批貨,受益人持信用證正本及所有單據到議付行交一次單,議付行在該信用證的背面會做每次交單的記錄,受益人在下一次交單時,議付行會再做記錄,直至該信用證的金額用完為止。分批發貨後拿分批發貨的單據 信用證上要求提供的 到銀行交單,銀行會把正本給你,或者留下,你下次交單的時候用正本,影印件都可以,銀行...

csocket 如何將物件傳送給客戶端

如你所說,可以使用序列化,將user物件序列化成乙個流,收到後再進行反序列化。舉乙個小例子,這是序列化的思想,lz可以理解並完善之 class carchive struct iserialize class carchive carchive operator iserialize data ca...

信用證規定分批裝運如何向銀行交單

信用證分批交單有兩種形式,即允許部分裝運和分期裝運 前者是人們通常所說的 允許分批裝運 即受益人可以根據自己備貨的情況,可以分若干批次裝運 後者對每批交貨的時間和數量有明確的規定 前者開立信用證只規定乙個最遲裝運期,而後者規定出每一批裝運的時間和數量。所以,首先要確定究竟是上述的前者還是後者,由此來...