Server類(服務器端)
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("--服務器端已開啟--");
//創建ServerSocket對象,這里的端口號必須與客戶端的端口號相同
ServerSocket server = new ServerSocket(9000);
//調用方法accept(),用來監聽客戶端發來的請求
Socket socket = server.accept();
//獲取輸入流對象
InputStream is = socket.getInputStream();
//讀取輸入流中的數據
int b = 0;
while ((b =is.read()) != -1){
System.out.print((char)b);
}
//關閉流
is.close();
socket.close();
server.close();
}
}
提示:在運行程序時,一定要先運行服務器端的程序代碼,再運行客戶端的程序代碼。因為客戶端要向服務器發送請求,前提是服務器端要處于開啟狀態。
Server類(服務器端)運行結果:
--服務器端已開啟--
Client類(客戶端)運行結果:
信息已發送
Client類(客戶端)運行后,Server類(服務器端)收到信息,運行結果:
--服務器端已開啟--
Java is my friend !
實例分析:
服務器端啟動后,服務器端的accept()方法一直處于監聽狀態,直到客戶端連接了服務器,服務器端再從流中讀取客戶端發來的數據。
恕我直言,這是一個超級無敵簡單的單向通信實例。
六、UDP編程
UDP使用數據報進行數據傳輸,沒有客戶端與服務器端之分,只有發送方與接收方,兩者哪個先啟動都不會報錯,但是會出現數據丟包現象。發送的內容有字數限制,大小必須限制在64k以內。
發送方與接收方實現步驟:
前提:創建一個項目,在項目中創建兩個模塊(model),一個模塊用來放發送方相關代碼,一個模塊用來放接收方相關代碼。
目錄結構如下圖
發送方 :
1、創建DatagramSocket對象,可以指定應用程序的端口號,也可以不指定。
2、準備需要發送的數據
3、創建DatagramPacket對象,用來對發送的數據進行打包,需要指定發送內容、發送多少、發送到哪里和接收方的端口號四個參數。
4、調用DatagramSocket對象的send()方法發送數據。
5、記得關閉流。
接收方 :
1、創建DatagramSocket對象,指定接收方的端口號,這個必須指定。
2、創建一個byte類型數組,用來接收發送方發送過來的數據。
3、創建DatagramPacket對象,準備接收數據。
4、調用DatagramSocket對象的receive()方法用于接收數據。
5、使用String類的構造方法將byte類型的數組中的數據轉化成String類型并顯示。
6、記得關閉流。
實例 :
發送方發送信息,接收方接收信息,并顯示。
Sender類(發送方)
package cn.tkrnet.Sender;
import java.io.IOException;
import java.net.*;
public class Sender {
public static void main(String[] args) throws IOException {
//創建接受或發送的數據報套接字,并指定發送方的端口號為7770
DatagramSocket ds = new DatagramSocket(7770); //端口號也可以不指定
System.out.println("---發送方---");
//創建數據報對象,用來發送數據
byte[] b = "Java is my friend !".getBytes();
//8800為接收方的端口號,netAddress.getByName("localhost")是獲取主機的IP地址
DatagramPacket dp = new DatagramPacket(b,b.length, InetAddress.getByName("localhost"),7788);
ds.send(dp); //發送數據報
System.out.println("數據已發送");
//關閉流
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("---接收方---");
//創建數據報套接字對象,指定的端口號要和發送方發送數據的端口號相同
// (不是發送方的端口號7770,是發送方發送數據的端口號7788)
DatagramSocket ds = new DatagramSocket(7788);
//創建接收數據報的對象
byte[] b = new byte[1024];
DatagramPacket dp = new DatagramPacket(b,b.length);
//接收數據
ds.receive(dp);
System.out.println(new String(b,0,dp.getLength()));
//關閉流
ds.close();
}
}
提示:在運行程序時,先運行發送方程序,還是先運行接收方程序都不會報錯,但是有可能會出現數據丟包,一般我們都先運行接收方的程序代碼,再運行發送方的程序代碼。
Receiver類(接收方)運行結果:
---接收方---
Sender類(發送方)運行結果:
---發送方---
數據已發送
Sender類(發送方)運行后,Receiver類(接收方)接收到信息,運行結果:
---接收方---
Java is my friend !
實例分析:
只有接收方先啟動運行,才會存在端口號為7788的程序,發送方才能發送數據到指定端口號7788,接收方才能接收數據。
不瞞你說,這也是個超級無敵簡單的單向通信實例。
-
通信協議
+關注
關注
28文章
915瀏覽量
40439 -
TCP
+關注
關注
8文章
1378瀏覽量
79301 -
UDP
+關注
關注
0文章
327瀏覽量
34043 -
端口
+關注
關注
4文章
990瀏覽量
32207 -
網絡編程
+關注
關注
0文章
72瀏覽量
10101
發布評論請先 登錄
相關推薦
評論