Java簡單實(shí)現(xiàn)UDP和TCP的示例
TCP實(shí)現(xiàn)
TCP協(xié)議需要在雙方之間建立連接,通過輸入輸出流來進(jìn)行數(shù)據(jù)的交換,建立需要通過三次握手,斷開需要四次揮手,保證了數(shù)據(jù)的完整性,但傳輸效率也會(huì)相應(yīng)的降低。

簡單的TCP實(shí)現(xiàn)
//服務(wù)端
public class TcpServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8886); // 建立服務(wù)端,ip為本機(jī)ip,端口為8886
Socket accept = serverSocket.accept(); // 監(jiān)聽客戶端的連接,一旦有客戶端連接,則會(huì)返回客戶端對應(yīng)的accept
InputStream in = accept.getInputStream(); //獲取到客戶端的輸出流
byte b[] = new byte[1024];
int len = in.read(b);
System.out.println("接受到客戶端數(shù)據(jù),返回?cái)?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();
}
}
改進(jìn)服務(wù)端,啟用多線程來接受客戶端的數(shù)據(jù)
// server
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8886); // 建立服務(wù)端,ip為本機(jī)ip,端口為8886
int i=4;
while(i>2){
Socket accept = serverSocket.accept(); // 監(jiān)聽客戶端的連接,一旦有客戶端連接,則會(huì)返回客戶端對應(yīng)的accept
ServerThread st = new ServerThread(accept); // 啟動(dòng)線程
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ù),返回?cái)?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ū)字符串會(huì)缺失
}
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ū)字符串會(huì)缺失
}
socket.shutdownOutput(); // 關(guān)閉流以后Server段才會(huì)接收道結(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實(shí)現(xiàn)
UDP是將數(shù)據(jù)打成數(shù)據(jù)包向?qū)Ψ桨l(fā)送,只關(guān)系是否發(fā)送成功,而不關(guān)心是否接收成功,傳輸速度快,但是可靠性低。
udp代碼實(shí)現(xiàn)
// 發(fā)送端
public class SendDemo {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket(); // 此類表示用來發(fā)送和接收數(shù)據(jù)報(bào)包的套接字。
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時(shí)結(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簡單實(shí)現(xiàn)UDP和TCP的示例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- java UDP通信客戶端與服務(wù)器端實(shí)例分析
- java 基礎(chǔ)知識(shí)之網(wǎng)絡(luò)通信(TCP通信、UDP通信、多播以及NIO)總結(jié)
- Java基于socket服務(wù)實(shí)現(xiàn)UDP協(xié)議的方法
- java中UDP簡單聊天程序?qū)嵗a
- Java基于UDP協(xié)議實(shí)現(xiàn)簡單的聊天室程序
- java編程實(shí)現(xiàn)基于UDP協(xié)議傳輸數(shù)據(jù)的方法
- java 中模擬UDP傳輸?shù)陌l(fā)送端和接收端實(shí)例詳解
- 基于Java中UDP的廣播形式(實(shí)例講解)
- java Socket UDP實(shí)例詳解
- java中TCP/UDP詳細(xì)總結(jié)
- JAVA編程實(shí)現(xiàn)UDP網(wǎng)絡(luò)通訊的方法示例
- Java實(shí)現(xiàn)UDP通信過程實(shí)例分析【服務(wù)器端與客戶端】
相關(guān)文章
java多線程之線程,進(jìn)程和Synchronized概念初解
這篇文章主要介紹了java多線程之線程,進(jìn)程和Synchronized概念初解,涉及進(jìn)程與線程的簡單概念,實(shí)現(xiàn)多線程的方式,線程安全問題,synchronized修飾符等相關(guān)內(nèi)容,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-11-11
java 動(dòng)態(tài)增加定時(shí)任務(wù)示例
本篇文章主要介紹了java 動(dòng)態(tài)增加定時(shí)任務(wù)示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03
java WebSocket的實(shí)現(xiàn)以及Spring WebSocket示例代碼
本篇文章主要介紹了java WebSocket的實(shí)現(xiàn)以及Spring WebSocket,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-01-01
SpringBoot+ruoyi框架文件上傳和下載的實(shí)現(xiàn)
文件的上傳和下載功能,是項(xiàng)目開發(fā)過程中比較常見的業(yè)務(wù)需求,本文主要介紹了SpringBoot+ruoyi框架文件上傳和文件下載的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09

