javaudp通信
❶ java udp如何通過一個對象完成接收和發送數據
//注意,本地ip以及埠,廣播Ip以及埠,可根據自己的電腦實際情況定.我的三段是2
//思路:我用的udp啟動服務端,進行偵聽,如果有消息,就該頻段廣播一次..
//客戶端使用多線程,一個發送服務端,一個接受廣播..就當我復習了一次...!
importjava.io.IOException;
importjava.net.DatagramPacket;
importjava.net.DatagramSocket;
importjava.net.InetAddress;
importjava.net.InetSocketAddress;
importjava.net.SocketAddress;
importjava.util.Scanner;
publicclassUdpTest{
classSendTest{
privateintcount=1;
privateScannersc;
privatebyte[]by,by2;
privateInetAddressip;
privateSocketAddresssd1,sd2;
privateDatagramSocketds,ds2;
privateDatagramPacketdp,dp2;
SendTest(StringipName,intport)throwsException{
sc=newScanner(System.in);
ip=InetAddress.getByName(ipName);
sd1=newInetSocketAddress(ip,port);//發送的目標:ip+埠
sd2=newInetSocketAddress(19823);//己方,省略ip,默認自己本地地址
ds=newDatagramSocket();//參數為自己的標識
//接受
by2=newbyte[1024];
ds2=newDatagramSocket(sd2);
send();
}
privatevoidsend()throwsIOException{
newThread(){
publicvoidrun(){
while(true){
by=sc.nextLine().getBytes();
dp=newDatagramPacket(by,by.length,sd1);//數組,數組長度,目標ip+埠
try{
ds.send(dp);
}catch(IOExceptione){
e.printStackTrace();
}//推送服務;
System.out.println("老馬第:"+count+++"條信息發送完成!");
}
}
}.start();
newThread(){
publicvoidrun(){
while(true){
dp2=newDatagramPacket(by2,by2.length);
try{
ds2.receive(dp2);
System.out.println("老馬接受到一條廣播可能來自老宋:"+newString(by2,0,dp2.getLength()));
}catch(IOExceptione){
e.printStackTrace();
}
}
}
}.start();
}
}
classAccepTest{
privatebyte[]by;
privateSocketAddresssd1,sd2;
privateDatagramSocketds;
privateDatagramPacketdp;
privateintcount=0;
AccepTest()throwsException{
by=newbyte[1024];
sd1=newInetSocketAddress("192.168.2.255",19823);//廣播
sd2=newInetSocketAddress(19822);//己方,省略ip,默認自己本地地址
ds=newDatagramSocket(sd2);//參數為自己的標識,這是用來接受的.....
accepts();
}
privatevoidaccepts()throwsIOException{
while(true){
count++;
System.out.println("老宋的伺服器接受第:"+count+"次數據:...");
dp=newDatagramPacket(by,by.length);//數組,數組長度,僅僅用來接收;
ds.receive(dp);//接受服務;
Stringstr=newString(by,0,dp.getLength());
System.out.println("老宋接受到數據--------->"+str);
System.out.println();
//廣播..
by=("插個廣播:"+str+"....誰發的??").getBytes();
dp=newDatagramPacket(by,by.length,sd1);
ds.send(dp);
}
}
}
publicstaticvoidmain(String[]args)throwsException{
newThread(){
publicvoidrun(){
try{
newUdpTest().newAccepTest();
}catch(Exceptione){
e.printStackTrace();
}
}
}.start();
newThread(){
publicvoidrun(){
try{
newUdpTest().newSendTest("127.0.0.1",19822);
}catch(Exceptione){
e.printStackTrace();
}
}
}.start();
}
}
❷ java 怎麼實現不指定埠號的UDP通信
解決了沒有?沒有就給個簡單的答案給你參考哈哈(記得給分哦): 思想就是你想的那樣用隨機埠的方案:(由於這個埠要求是1024以上的哈)在登錄頁面(LoginInterface.java)加上這個函數:public int getrandomport() {
int port = 0;
Random rm = new Random();
int j = 0;
for (i = 0; i < 10; i++) {
j = rm.nextInt(20000);
if (j > 1111) {
port = j;
}
}
return port;
} 將這個函數的返回值用一個靜態變數保存起,以備我們在日後UDPchat.java上使用,同時我們將其放入到用戶登錄時的USer表中port列下。 ...................................port =String.valueOf(getrandomport());
String updatesql = "update user set status='" + status + "',tmpip='" + tmpip + "',tmpport='" + port + "'where usr_id='" + usr_id + "' ";
st.executeUpdate(updatesql);.................................. 在UDPchat頁面的構造方法中new 以個thread:用來接收別人發來的數據。其監聽埠為自己登陸時所產生的那個隨機埠new Thread() {// receive data
public void run() {
DatagramSocket ds = null;
try {
int acceptport = Integer.parseInt(LoginInterface.port);
ds = new DatagramSocket(acceptport);
} catch (Exception e1) {
e1.printStackTrace();
}
byte[] data = new byte[1024];
DatagramPacket dp = new DatagramPacket(data, data.length);
while (true) {
try {
ds.receive(dp);
String ip = new String(dp.getAddress().getHostAddress());
String port = String.valueOf(dp.getPort());
String str = new String(dp.getData());
String sum = "From: " + ip + " Port:" + port
+ " receive data: " + str;
receives.add(sum, 0);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}.start(); 另外構造一個send 方法用來發送自己的消息:部分代碼如下:.............................try {
// send data
if (sends.getText().equals("")) {
JOptionPane.showMessageDialog(null, "輸入內容不能為空");
} else {
int port = Integer.parseInt(MainInterface.port);
byte[] buf = sends.getText().getBytes();
InetAddress address = InetAddress.getByName(MainInterface.ip);
DatagramPacket dp = new DatagramPacket(buf, buf.length,
address, port);// destinate port
ds.send(dp);
receives.add("我說: " + sends.getText(), 0);
sends.setText("");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
ds.close();
}................................此處的MainInterface.ip和MainInterface.port是當我們雙擊面板上的某個欲和他聊天的用戶(根據好友名字從資料庫中取出的好友的ip 和他機子所監聽的埠號) 實驗過了,沒有問題了哈。
❸ JAVA UDP通信為什麼只能接收一次數據,我想要時刻接收數據,並更新UI,大神們幫我看看程序吧
開始是使用
new udpReceiveThread()。。。。。。。。。
終止也是使用
new udpReceiveThread()
操作的是完全不同的一個線程 了
❹ java udp通信中文亂碼
java記住不要使用 xxxx.getBytes()
一定要使用 xxxx.getBytes("UTF-8") 或者 xxxx.getBytes("GBK")
解析時也要 new String(byte[] , "UTF-8")
❺ 一個簡單java實現udp通信
UDP也可以和TCP那樣遍歷list然後發送啊
客戶端向外面開一個UDP埠接受數據報
然後伺服器這邊要是有消息要發送就直接發送數據報包就可以了嘛
UDP都不用保持著連接的,比TCP還簡單些
另外也可以用組播來實現,搜索下java UDP 組播,你能找到不少實例性的代碼,也有聊天室的代碼
❻ TCP和UDP通信有什麼區別 如何分別用java實現
TCP是面向連接,UDP面向非連接,資料不復制,在這里簡單說下:x0dx0aTCP建立連接時需要傳說的三次握手,服務端與客戶端需要確認對方身份而已,建立好連接後,就開始傳遞消息,直到有一方斷開連接位置。 就好比兩個人打電話,要先通了才能說話。x0dx0aUDP只是數據報發送,它的優點速度快,並非要向TCP那樣麻煩建立,它只負責將信息發出,但是並不確保信息的准確完整性等,就好比發簡訊,簡訊是出去了,但是中間是否有問題,是否對方手機能收到就不管了。x0dx0a在java中想要實現上述兩種協議通信,可採用socket建立連接,socket可以理解為碼頭,其實是套接字,這里簡單說下,就好比兩個城市運輸貨物,通過碼頭走貨一樣。至於如何通過socket建立兩個連接,網上資料多的是,在這里不復制例子了。
❼ java中UDP通信,兩邊都怎麼也接收不了,都是阻塞狀態。
你要先運行UdpServer2,因為它是伺服器
❽ java udp 請求會阻塞嗎
java中UDP通信,兩邊都接收不了,都是阻塞狀態,要先運行UdpServer2,因為它是伺服器
❾ java中UDP文件傳輸怎麼實現
java UDP連接,如果要發送文件的話,你只能自己定義一系列的協議
因為TCP UDP 雙方發送都是二進制數據
那麼這個實現非常復雜
得不停的發送數據,寫數據,建議使用http協議
❿ java 中,udp 裡面的datagramsocket需不需要connect之後才能通信
不需要,udp是無連接的協議,在通信前不需要建立連接,這個函數基本上用不到。