Java學習總結(十三)——基於UDP協議網絡編程
阿新 • • 發佈:2018-04-16
網絡編程 UDP協議 聊天 一.UDP網絡編程
1.面向無連接的數據傳輸,不可靠的,但效率高(音頻,視頻等).
2.UDP一次發送的數據不能超過64kb.
3.UDP編程所需要的類
(1)DatagramSocket此類表示用來發送和接收數據報包的套接字
(2)DatagramPacket此類表示數據報包
方法:DatagramPacket(byte[]?buf, int?length, InetAddress?address, int?port)
參數表示:buf - 包數據
length - 包長度
address - 目的地址
port - 目的端口
4.DatagramSocket常用方法
(1)構造方法:public DatagramSocket(int port)
(2)常用方法:#public void send(DatagramPacket p)
#public void receive(DatagramPacket p)
5.DatagramPacket常用方法
(1)構造方法:public DatagramPacket(byte[] buf,int length)此構造方法用來接收
數據
(2)public?DatagramPacket(byte[]?buf, int?length, InetAddress address, int?port) 此構造方法用來組裝將要發送的數據
(3)public InetAddress getAddress():返回將要發送ign方的IP或者接收到的數據的IP
(4)public byte[] getData():返回將要發送的數據緩沖區或已經接收到的數據緩沖區
(5)public int getLength():返回要發送的數據長度或接收到的數據長度
6.基於TCP與UDP協議的網絡編程(區別):
(1)基於TCP協議的Socket編程:#.通信雙發需要建立連接;#.連接建立時雙方存在主次之分
(2)基於UDP協議的Socket編程:#.通信雙發不需要建立連接;#.通信雙方完全平等
7.基於UDP協議的Socket編程
(1)UDP Socket通信模型:
例(UDP示例):
信息發送線程類:
package udp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
//發送線程類
public class SendRunnable implements Runnable{
private String destHost;
private int port;
private DatagramSocket ds;
1.面向無連接的數據傳輸,不可靠的,但效率高(音頻,視頻等).
2.UDP一次發送的數據不能超過64kb.
3.UDP編程所需要的類
(1)DatagramSocket此類表示用來發送和接收數據報包的套接字
(2)DatagramPacket此類表示數據報包
方法:DatagramPacket(byte[]?buf, int?length, InetAddress?address, int?port)
參數表示:buf - 包數據
length - 包長度
address - 目的地址
port - 目的端口
4.DatagramSocket常用方法
(1)構造方法:public DatagramSocket(int port)
#public void receive(DatagramPacket p)
5.DatagramPacket常用方法
(1)構造方法:public DatagramPacket(byte[] buf,int length)此構造方法用來接收
數據
(2)public?DatagramPacket(byte[]?buf, int?length, InetAddress address, int?port) 此構造方法用來組裝將要發送的數據
(3)public InetAddress getAddress():返回將要發送ign方的IP或者接收到的數據的IP
(5)public int getLength():返回要發送的數據長度或接收到的數據長度
6.基於TCP與UDP協議的網絡編程(區別):
(1)基於TCP協議的Socket編程:#.通信雙發需要建立連接;#.連接建立時雙方存在主次之分
(2)基於UDP協議的Socket編程:#.通信雙發不需要建立連接;#.通信雙方完全平等
7.基於UDP協議的Socket編程
(1)UDP Socket通信模型:
例(UDP示例):
信息發送線程類:
package udp;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
//發送線程類
public class SendRunnable implements Runnable{
private String destHost;
private int port;
private DatagramSocket ds;
public SendRunnable(String destHost, int port, DatagramSocket ds) {
this.destHost = destHost;
this.port = port;
this.ds = ds;
}
@Override
public void run() {
while(true){
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
System.out.print(Thread.currentThread().getName()+":");
String say;
DatagramPacket dp=null;
try {
say=br.readLine();
dp=new DatagramPacket(say.getBytes(),say.getBytes().length ,InetAddress.getByName(destHost), port);
ds.send(dp);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
信息接收線程類:
package udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/接收線程類
/
public class ReceiveRunnable implements Runnable {
private DatagramSocket ds;
public ReceiveRunnable(DatagramSocket ds) {
this.ds = ds;
}
@Override
public void run() {
while (true) {
byte[] b = new byte[1024];
DatagramPacket dp = new DatagramPacket(b, b.length);
try {
ds.receive(dp);// 接收之前一直阻塞
String ip = dp.getAddress().getHostName();// 獲取發送方的IP
int post = dp.getPort();// 獲取發送方的端口號
System.out.println(ip + ":" + post + "說:"
+ new String(dp.getData(), 0, dp.getLength()));
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
聊天端口一:
package udp;
import java.net.DatagramSocket;
import java.net.SocketException;
class Chat1 {
public static void main(String[] args) throws SocketException {
DatagramSocket ds=new DatagramSocket(9999);
new Thread(new ReceiveRunnable(ds)).start();
new Thread(new SendRunnable("localhost", 8888, ds),"白雪公主").start();
}
}
聊天端口二:
package udp;
import java.net.DatagramSocket;
import java.net.SocketException;
public class Chat2 {
public static void main(String[] args) throws SocketException {
DatagramSocket ds=new DatagramSocket(8888);
new Thread(new ReceiveRunnable(ds)).start();
new Thread(new SendRunnable("localhost", 9999, ds),"青蛙王子").start();
}
}
運行結果
白雪公主:127.0.0.1:8888說:你好,公主
你好,王子
白雪公主:127.0.0.1:8888說:你在幹什摸,公主
我在和你聊天
白雪公主:
:
青蛙王子:你好,公主
青蛙王子:127.0.0.1:9999說:你好,王子
你在幹什摸,公主
青蛙王子:127.0.0.1:9999說:我在和你聊天
Java學習總結(十三)——基於UDP協議網絡編程