TCP之Socket的程式設計

2022-05-01 22:03:16 字數 3062 閱讀 3683

socket是網路程式設計的乙個抽象的概念,通常我們用socket來表示伺服器與客戶端間的網路連線,

即用socket表示"開啟了乙個網路連線", 而開啟乙個網路連線需要知道目標電腦的ip位址以及埠號,然後指定協議的型別即可。

大多數的連線都是可靠的tcp連線,在建立tcp時,主動發起請求的就是客戶端,被動響應請求的就是伺服器端。

1、當我們建立乙個基於tcp連線的socket時可以這樣做:

//

建立負責通訊的客戶端socket

socket = new

socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp);

//告訴客戶端負責通訊的socket要連線的ip位址以及埠號

ipaddress ip =ipaddress.parse(txtserver.text);

ipendpoint point = new ipendpoint(ip, int

.parse(txtport.text));

建立socket時,addressfamily.internetwork 指定使用ipv4協議,如果要用更先進的ipv6,就指定為addressfamily.internetworkv6。sockettype.stream 指定使用面向流的tcp協議,這樣,乙個socket物件就建立成功,但是還沒有建立連線。

2、客戶端要主動發起tcp連線,必須知道伺服器的ip位址和埠號。

//

客戶端連線伺服器的應用程式

socket.connect(point);

showmsg(

"客戶端連線成功

");

3、在建立tcp客戶端與伺服器端的連線之後,我們客戶端就可以向伺服器傳送資訊了,

byte buffer =encoding.default.getbytes(txtmsg.text.trim());

socket.send(buffer);

注意:tcp連線建立的是雙向通道,雙方都可以同時給對方發資料。但是誰先發誰後發,怎麼協調,要根據具體的協議來決定。例如,http協議規定客戶端必須先發請求給伺服器,伺服器收到後才發資料給客戶端。

而在客戶端接受資料時,由於一次最多接收指定的位元組數,因此需要建立乙個執行緒,並用while()迴圈不斷的接受,並將接受到的資料返回快取區中,直到receive()返回空資料,表示接收完畢,退出迴圈。

也就是byte buffer 陣列中

//

不停的接受伺服器傳送過來的訊息

void

recive()

}

伺服器端要複雜一些

伺服器要先繫結乙個埠,並先監聽客戶端的連線,如果某個客戶端連線過來了,伺服器就與該客戶端建立socket連線,隨後的通訊就靠這個socket連線了。

所以,伺服器會開啟固定埠(比如80)監聽,每來乙個客戶端連線,就建立該socket連線。由於伺服器會有大量來自客戶端的連線,

但是伺服器還需要同時響應多個客戶端的請求,所以,每個連線都需要乙個新的程序或者新的執行緒來處理,否則,伺服器一次就只能服務乙個客戶端了。

//

建立負責監聽的socket

socket socketwatch = new

socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp);

//獲得當前應用程式的ip位址

ipaddress ip =ipaddress.parse(textsever.text);

//獲得當前應用程式的埠號

ipendpoint point = new ipendpoint(ip, int.parse(textbox1.text));

2、然後,我們要繫結監聽的位址和埠。

緊接著,呼叫listen()方法開始監聽埠,傳入的引數指定等待連線的最大數量:

在建立監聽的同時,還要建立乙個執行緒,用來不斷的接受客戶端發來的請求:

//

伺服器開啟對當前應用程式的監聽,最重要的是乙個是ip位址,乙個是埠號

socketwatch.bind(point);

//設定監聽佇列

socketwatch.listen(10);

//

建立乙個執行緒,伺服器端不斷的接受客戶端發來的連線請求

thread th = new

thread(recconnect);

th.isbackground = true

; th.start(socketwatch);

3、接下來,伺服器程式通過乙個永久迴圈來接受來自客戶端的連線,accept()會等待並返回乙個客戶端的連線:

//

伺服器接受客戶端的連線請求

private

void recconnect(object

o)

}

4、每個連線都必須建立新執行緒(或程序)來處理,否則,單執行緒在處理連線的過程中,無法接受其他客戶端的連線,下面來在上文建立的執行緒中接受資料:

//

伺服器端接受資料

private

void recive(object

o)

string s = encoding.default.getstring(buffer, 0

, r);

showmsg(socketsend.remoteendpoint.tostring() + "

:" +s);

}}

用tcp協議進行socket程式設計,對於客戶端,要主動連線伺服器的ip和指定埠,對於伺服器,要首先監聽指定埠,然後,對每乙個新的連線,建立乙個執行緒或程序來處理。通常,伺服器程式會無限執行下去。

同乙個埠,被乙個socket繫結了以後,就不能被別的socket繫結了。

Socket 程式設計(TCP)

詳細請參見 點我o o哈!很不錯的一篇文章哈 下面是接收資料和傳送資料的函式 int receive socket fd,char sztext,int len if rc 0 return len cnt sztext rc cnt rc return len int send socket fd...

Socket 程式設計(TCP)

下面是接收資料和傳送資料的函式 cpp view plain copy intreceive socket fd,char sztext,intlen if rc 0 return len cnt sztext rc cnt rc return len int send socket fd,char...

socket程式設計TCP

注意一定要先啟動server,再啟動client,否則client因為無法找到server而丟擲異常 coding utf 8 from socket import serverport 12000 af inet表示底層網路使用的是ipv4,sock stream表示使用的socket型別是tcp...