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...