Java簡單實現(xiàn)UDP和TCP的示例
TCP實現(xiàn)
TCP協(xié)議需要在雙方之間建立連接,通過輸入輸出流來進行數(shù)據(jù)的交換,建立需要通過三次握手,斷開需要四次揮手,保證了數(shù)據(jù)的完整性,但傳輸效率也會相應(yīng)的降低。
簡單的TCP實現(xiàn)
//服務(wù)端 public class TcpServer { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(8886); // 建立服務(wù)端,ip為本機ip,端口為8886 Socket accept = serverSocket.accept(); // 監(jiān)聽客戶端的連接,一旦有客戶端連接,則會返回客戶端對應(yīng)的accept InputStream in = accept.getInputStream(); //獲取到客戶端的輸出流 byte b[] = new byte[1024]; int len = in.read(b); System.out.println("接受到客戶端數(shù)據(jù),返回數(shù)據(jù)"+new String(b,0,len)); OutputStream out = accept.getOutputStream(); // 給客戶端發(fā)送消息 out.write("服務(wù)端已經(jīng)接受".getBytes()); serverSocket.close(); } } // 客戶端 public class TcpClient { public static void main(String[] args) throws IOException { Socket socket = new Socket("127.0.0.1", 8886); // 通過Socket來建立和服務(wù)端的連接 OutputStream out = socket.getOutputStream(); // 獲取輸出流(客戶端輸出流即向服務(wù)端輸出信息) out.write("hello tcp Server".getBytes()); // 輸出信息 InputStream in = socket.getInputStream(); // 接受服務(wù)端的消息 byte b[] = new byte[1024]; int len = in.read(b); System.out.println("接受到服務(wù)器消息 : "+new String(b,0,len)); // 輸出 out.write("返回的的數(shù)據(jù)已經(jīng)收到 ".getBytes()); // 向服務(wù)器返回消息 socket.close(); } }
改進服務(wù)端,啟用多線程來接受客戶端的數(shù)據(jù)
// server public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(8886); // 建立服務(wù)端,ip為本機ip,端口為8886 int i=4; while(i>2){ Socket accept = serverSocket.accept(); // 監(jiān)聽客戶端的連接,一旦有客戶端連接,則會返回客戶端對應(yīng)的accept ServerThread st = new ServerThread(accept); // 啟動線程 Thread th = new Thread(st); th.start(); } serverSocket.close(); } // thread public class ServerThread implements Runnable { private Socket accept; public ServerThread(Socket s) { this.accept = s; } public void run(){ InputStream in; try { in = accept.getInputStream(); byte b[] = new byte[1024]; int len = in.read(b); System.out.println("接受到客戶端數(shù)據(jù),返回數(shù)據(jù)" + new String(b, 0, len)); OutputStream out = accept.getOutputStream(); // 給客戶端發(fā)送消息 out.write("服務(wù)端已經(jīng)接受".getBytes()); } catch (IOException e) { e.printStackTrace(); } } }
傳遞圖片
// 服務(wù)端 public class Server { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(5555); Socket ss = serverSocket.accept(); BufferedInputStream br = new BufferedInputStream(ss.getInputStream()); BufferedOutputStream bw = new BufferedOutputStream(new FileOutputStream("copy.jpg")); // 寫出文件流 byte b[] = new byte[1024]; int len = 0; while ((len = br.read(b)) != -1) { // 寫出文件 bw.write(b, 0, len); bw.flush(); // 別忘了刷新,要不然最后一塊緩沖區(qū)字符串會缺失 } BufferedWriter bw2 = new BufferedWriter(new OutputStreamWriter(ss.getOutputStream())); // 輸出 bw2.write("圖片傳輸成功"); bw2.flush(); bw.close(); ss.close(); } } // 客戶端 public class Client { public static void main(String[] args) throws UnknownHostException, IOException { Socket socket = new Socket("127.0.0.1", 5555); BufferedInputStream in = new BufferedInputStream(new FileInputStream("c.jpg")); BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream()); byte b[] = new byte[1024]; int len = 0; while ((len = in.read(b)) != -1) { out.write(b, 0, len); out.flush(); // 刷新緩沖區(qū) 要不然最后一塊緩沖區(qū)字符串會缺失 } socket.shutdownOutput(); // 關(guān)閉流以后Server段才會接收道結(jié)束字符結(jié)束接受 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); String line; while ((line = br.readLine()) != null) { System.out.println(line); } in.close(); socket.close(); } }
UDP實現(xiàn)
UDP是將數(shù)據(jù)打成數(shù)據(jù)包向?qū)Ψ桨l(fā)送,只關(guān)系是否發(fā)送成功,而不關(guān)心是否接收成功,傳輸速度快,但是可靠性低。
udp代碼實現(xiàn)
// 發(fā)送端 public class SendDemo { public static void main(String[] args) throws IOException { DatagramSocket ds = new DatagramSocket(); // 此類表示用來發(fā)送和接收數(shù)據(jù)報包的套接字。 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 鍵盤輸入 String line = null; while ((line = br.readLine()) != null) { byte[] bytes = line.getBytes(); DatagramPacket dp = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("127.0.0.1"), 10005); // 數(shù)據(jù)包對象 ds.send(dp); if ("886".equals(line)) { // 當(dāng)輸入886時結(jié)束發(fā)送 break; } } ds.close(); } } // 接收端 public class ReciveDemo { public static void main(String[] args) throws IOException { DatagramSocket ds = new DatagramSocket(10005); // 建立服務(wù)端 byte bytes[] = new byte[1024]; DatagramPacket dp = new DatagramPacket(bytes, bytes.length); // 建立數(shù)據(jù)包對象 while (true) { ds.receive(dp); // 接受數(shù)據(jù)包 byte[] data = dp.getData(); // 獲取數(shù)據(jù) String str = new String(data, 0, dp.getLength()); if ("886".equals(str)) { break; } System.out.println(str); } ds.close(); } }
以上這篇Java簡單實現(xiàn)UDP和TCP的示例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
- java UDP通信客戶端與服務(wù)器端實例分析
- java 基礎(chǔ)知識之網(wǎng)絡(luò)通信(TCP通信、UDP通信、多播以及NIO)總結(jié)
- Java基于socket服務(wù)實現(xiàn)UDP協(xié)議的方法
- java中UDP簡單聊天程序?qū)嵗a
- Java基于UDP協(xié)議實現(xiàn)簡單的聊天室程序
- java編程實現(xiàn)基于UDP協(xié)議傳輸數(shù)據(jù)的方法
- java 中模擬UDP傳輸?shù)陌l(fā)送端和接收端實例詳解
- 基于Java中UDP的廣播形式(實例講解)
- java Socket UDP實例詳解
- java中TCP/UDP詳細(xì)總結(jié)
- JAVA編程實現(xiàn)UDP網(wǎng)絡(luò)通訊的方法示例
- Java實現(xiàn)UDP通信過程實例分析【服務(wù)器端與客戶端】
相關(guān)文章
5分鐘快速創(chuàng)建spring boot項目的完整步驟
這篇文章主要給大家介紹了關(guān)于通過5分鐘快速創(chuàng)建spring boot項目的完整步驟,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06java ant包中的org.apache.tools.zip實現(xiàn)壓縮和解壓縮實例詳解
這篇文章主要介紹了java ant包中的org.apache.tools.zip實現(xiàn)壓縮和解壓縮實例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04Java多線程并發(fā)之線程池任務(wù)請求攔截測試實例
這篇文章主要介紹了Java多線程并發(fā)之線程池任務(wù)請求攔截測試實例,隊列中永遠(yuǎn)沒有線程被加入,即使線程池已滿,也不會導(dǎo)致被加入排隊隊列,實現(xiàn)了只有線程池存在空閑線程的時候才會接受新任務(wù)的需求,需要的朋友可以參考下2023-12-12Java循環(huán)對bean的屬性進行賦值的實現(xiàn)
本文主要介紹了Java循環(huán)對bean的屬性進行賦值,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08詳解在SpringBoot中@Transactional事物操作和事物無效問題排查
這篇文章主要介紹了詳解在SpringBoot中@Transactional事物操作和事物無效問題排查,本文詳細(xì)的介紹了SpringBoot中集成使用@Transactional注解操作事物以及事物開啟后無效的問題排查,需要的朋友可以參考下2021-06-06搭建 springboot selenium 網(wǎng)頁文件轉(zhuǎn)圖片環(huán)境的詳細(xì)教程
這篇文章主要介紹了搭建 springboot selenium 網(wǎng)頁文件轉(zhuǎn)圖片環(huán)境,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08