Server類(服務(wù)器端)
package cn.tkrnet.server;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
System.out.println("--服務(wù)器端已開啟--");
//創(chuàng)建ServerSocket對(duì)象,這里的端口號(hào)必須與客戶端的端口號(hào)相同
ServerSocket server = new ServerSocket(9000);
//調(diào)用方法accept(),用來監(jiān)聽客戶端發(fā)來的請(qǐng)求
Socket socket = server.accept();
//獲取輸入流對(duì)象
InputStream is = socket.getInputStream();
//讀取輸入流中的數(shù)據(jù)
int b = 0;
while ((b =is.read()) != -1){
System.out.print((char)b);
}
//關(guān)閉流
is.close();
socket.close();
server.close();
}
}
提示:在運(yùn)行程序時(shí),一定要先運(yùn)行服務(wù)器端的程序代碼,再運(yùn)行客戶端的程序代碼。因?yàn)榭蛻舳艘蚍?wù)器發(fā)送請(qǐng)求,前提是服務(wù)器端要處于開啟狀態(tài)。
Server類(服務(wù)器端)運(yùn)行結(jié)果:
--服務(wù)器端已開啟--
Client類(客戶端)運(yùn)行結(jié)果:
信息已發(fā)送
Client類(客戶端)運(yùn)行后,Server類(服務(wù)器端)收到信息,運(yùn)行結(jié)果:
--服務(wù)器端已開啟--
Java is my friend !
實(shí)例分析:
服務(wù)器端啟動(dòng)后,服務(wù)器端的accept()方法一直處于監(jiān)聽狀態(tài),直到客戶端連接了服務(wù)器,服務(wù)器端再從流中讀取客戶端發(fā)來的數(shù)據(jù)。
恕我直言,這是一個(gè)超級(jí)無敵簡單的單向通信實(shí)例。
六、UDP編程
UDP使用數(shù)據(jù)報(bào)進(jìn)行數(shù)據(jù)傳輸,沒有客戶端與服務(wù)器端之分,只有發(fā)送方與接收方,兩者哪個(gè)先啟動(dòng)都不會(huì)報(bào)錯(cuò),但是會(huì)出現(xiàn)數(shù)據(jù)丟包現(xiàn)象。發(fā)送的內(nèi)容有字?jǐn)?shù)限制,大小必須限制在64k以內(nèi)。
發(fā)送方與接收方實(shí)現(xiàn)步驟:
前提:創(chuàng)建一個(gè)項(xiàng)目,在項(xiàng)目中創(chuàng)建兩個(gè)模塊(model),一個(gè)模塊用來放發(fā)送方相關(guān)代碼,一個(gè)模塊用來放接收方相關(guān)代碼。
目錄結(jié)構(gòu)如下圖

發(fā)送方 :
1、創(chuàng)建DatagramSocket對(duì)象,可以指定應(yīng)用程序的端口號(hào),也可以不指定。
2、準(zhǔn)備需要發(fā)送的數(shù)據(jù)
3、創(chuàng)建DatagramPacket對(duì)象,用來對(duì)發(fā)送的數(shù)據(jù)進(jìn)行打包,需要指定發(fā)送內(nèi)容、發(fā)送多少、發(fā)送到哪里和接收方的端口號(hào)四個(gè)參數(shù)。
4、調(diào)用DatagramSocket對(duì)象的send()方法發(fā)送數(shù)據(jù)。
5、記得關(guān)閉流。
接收方 :
1、創(chuàng)建DatagramSocket對(duì)象,指定接收方的端口號(hào),這個(gè)必須指定。
2、創(chuàng)建一個(gè)byte類型數(shù)組,用來接收發(fā)送方發(fā)送過來的數(shù)據(jù)。
3、創(chuàng)建DatagramPacket對(duì)象,準(zhǔn)備接收數(shù)據(jù)。
4、調(diào)用DatagramSocket對(duì)象的receive()方法用于接收數(shù)據(jù)。
5、使用String類的構(gòu)造方法將byte類型的數(shù)組中的數(shù)據(jù)轉(zhuǎn)化成String類型并顯示。
6、記得關(guān)閉流。
實(shí)例 :
發(fā)送方發(fā)送信息,接收方接收信息,并顯示。
Sender類(發(fā)送方)
package cn.tkrnet.Sender;
import java.io.IOException;
import java.net.*;
public class Sender {
public static void main(String[] args) throws IOException {
//創(chuàng)建接受或發(fā)送的數(shù)據(jù)報(bào)套接字,并指定發(fā)送方的端口號(hào)為7770
DatagramSocket ds = new DatagramSocket(7770); //端口號(hào)也可以不指定
System.out.println("---發(fā)送方---");
//創(chuàng)建數(shù)據(jù)報(bào)對(duì)象,用來發(fā)送數(shù)據(jù)
byte[] b = "Java is my friend !".getBytes();
//8800為接收方的端口號(hào),netAddress.getByName("localhost")是獲取主機(jī)的IP地址
DatagramPacket dp = new DatagramPacket(b,b.length, InetAddress.getByName("localhost"),7788);
ds.send(dp); //發(fā)送數(shù)據(jù)報(bào)
System.out.println("數(shù)據(jù)已發(fā)送");
//關(guān)閉流
ds.close();
}
}
Receiver類(接收方)
package cn.tkrnet.receiver;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Receiver {
public static void main(String[] args) throws IOException {
System.out.println("---接收方---");
//創(chuàng)建數(shù)據(jù)報(bào)套接字對(duì)象,指定的端口號(hào)要和發(fā)送方發(fā)送數(shù)據(jù)的端口號(hào)相同
// (不是發(fā)送方的端口號(hào)7770,是發(fā)送方發(fā)送數(shù)據(jù)的端口號(hào)7788)
DatagramSocket ds = new DatagramSocket(7788);
//創(chuàng)建接收數(shù)據(jù)報(bào)的對(duì)象
byte[] b = new byte[1024];
DatagramPacket dp = new DatagramPacket(b,b.length);
//接收數(shù)據(jù)
ds.receive(dp);
System.out.println(new String(b,0,dp.getLength()));
//關(guān)閉流
ds.close();
}
}
提示:在運(yùn)行程序時(shí),先運(yùn)行發(fā)送方程序,還是先運(yùn)行接收方程序都不會(huì)報(bào)錯(cuò),但是有可能會(huì)出現(xiàn)數(shù)據(jù)丟包,一般我們都先運(yùn)行接收方的程序代碼,再運(yùn)行發(fā)送方的程序代碼。
Receiver類(接收方)運(yùn)行結(jié)果:
---接收方---
Sender類(發(fā)送方)運(yùn)行結(jié)果:
---發(fā)送方---
數(shù)據(jù)已發(fā)送
Sender類(發(fā)送方)運(yùn)行后,Receiver類(接收方)接收到信息,運(yùn)行結(jié)果:
---接收方---
Java is my friend !
實(shí)例分析:
只有接收方先啟動(dòng)運(yùn)行,才會(huì)存在端口號(hào)為7788的程序,發(fā)送方才能發(fā)送數(shù)據(jù)到指定端口號(hào)7788,接收方才能接收數(shù)據(jù)。
不瞞你說,這也是個(gè)超級(jí)無敵簡單的單向通信實(shí)例。
-
通信協(xié)議
+關(guān)注
關(guān)注
28文章
1092瀏覽量
42150 -
TCP
+關(guān)注
關(guān)注
8文章
1424瀏覽量
83501 -
UDP
+關(guān)注
關(guān)注
0文章
334瀏覽量
35412 -
端口
+關(guān)注
關(guān)注
4文章
1104瀏覽量
33963 -
網(wǎng)絡(luò)編程
+關(guān)注
關(guān)注
0文章
73瀏覽量
11108
發(fā)布評(píng)論請(qǐng)先 登錄
linxu網(wǎng)絡(luò)協(xié)議分析:IP協(xié)議、TCP協(xié)議、UDP協(xié)議
TCP協(xié)議和UDP協(xié)議的區(qū)別有哪些
通訊協(xié)議TCP和UDP協(xié)議使用方法
Linux下的UDP協(xié)議編程
(WiFi干貨)WiFi模塊的TCP和UDP協(xié)議
TCP協(xié)議與UDP協(xié)議的區(qū)別和相同點(diǎn)有哪些 一文看懂TCP協(xié)議與UDP協(xié)議的優(yōu)缺點(diǎn)
TCP協(xié)議和UDP協(xié)議的區(qū)別
一文搞明白TCP協(xié)議與UDP協(xié)議(上)
TCP協(xié)議和UDP協(xié)議最核心的區(qū)別是什么?
udp是什么協(xié)議 TCP與UDP的區(qū)別
什么是UDP協(xié)議?什么場景下會(huì)去用這種協(xié)議呢?
TCP/IP協(xié)議進(jìn)階課程:5、UDP協(xié)議
一文搞明白TCP協(xié)議與UDP協(xié)議(下)
評(píng)論