基于UDP的服務器實現多線程時,第一個客戶運行端不能在服務器登陸得到響應,第二個實行客戶端,第一次執行已停止的客戶端才能接受服務器的響應,服務器也才會得到第一個客戶端的信息
import?java.io.IOException;
import?java.net.DatagramPacket;
import?java.net.DatagramSocket;
import?java.net.InetAddress;
import?java.net.SocketException;
import?java.net.UnknownHostException;
public?class?UDPCilent?{
public?static?void?main(String[]?args)?{
try?{
/*
?*?向服務器端發送信息
?*/
//定義服務器ip,端口,信息
InetAddress?address=InetAddress.getByName("localhost");
int?port=8000;
byte?[]data="用戶名:kuerban;密碼:668858".getBytes();
//建立DatagramPacket
DatagramPacket?packet=new?DatagramPacket(data,?0,?data.length,?address,?port);
//建立DatagramSocket
DatagramSocket?socket=new?DatagramSocket();
socket.send(packet);
/*
?*?獲取服務端發送信息
?*/
//建立數據包接受信息
byte?bytes[]=new?byte[1024];
DatagramPacket?packet1=new?DatagramPacket(bytes,?bytes.length);
socket.receive(packet1);
String?info=new?String(bytes,?0,?packet1.getLength());
System.out.println(info);
socket.close();
}?catch?(UnknownHostException?|?SocketException?e)?{
e.printStackTrace();
}?catch?(IOException?e)?{
e.printStackTrace();
}
}
}
import?java.io.IOException;
import?java.net.DatagramPacket;
import?java.net.DatagramSocket;
import?java.net.InetAddress;
/*
?*?服務器端,基于UDP實現用戶登錄
?*/
public?class?UDPServer?{
public?static?void?main(String[]?args)?{
try?{
/*
?*?接受信息
?*/
//建立一個DatagramSocket,指定端口
DatagramSocket?socket=new?DatagramSocket(8000);
byte?[]bytes=new?byte[1024];
//建立一個Datagrampacket,以接受數據
DatagramPacket?packet=new?DatagramPacket(bytes,?bytes.length);
/*
?*?發送數據
?*/
//啟動服務器
System.out.println("服務器已啟動");
while(true){
????socket.receive(packet);
????//建立客戶端ip,端口
InetAddress?address=packet.getAddress();
int?port=packet.getPort();
UDPthread?thread=new?UDPthread(socket,packet,address,port,bytes);
thread.start();
}
}?catch?(IOException?e)?{
e.printStackTrace();
}
}
}import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPthread extends Thread{
DatagramPacket packet=null;
InetAddress address=null;
byte bytes[];
int port=0;
DatagramSocket socket=null;
public UDPthread(DatagramSocket socket,DatagramPacket packet,InetAddress address,int port,byte[] bytes) {
this.packet =packet;
this.address=address;
this.port=port;
this.socket=socket;
this.bytes=bytes;
}
public void run(){
//讀取信息,輸出信息
String info=new String(bytes, 0, packet.getLength());
System.out.println(info);
//建立信息,并發送
byte bytes1[]="登陸成功".getBytes();
DatagramPacket packet1=new DatagramPacket(bytes1, 0, bytes1.length,address,port);
//向客戶端響應
try {
socket.send(packet1);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2016-04-26
DatagramPacket packet1=new DatagramPacket(bytes1, 0, bytes1.length,address,port);這里只有4個參數吧?第二個參數0是什么作用?
2018-05-31
?????//啟動服務器??????????? ??System.out.println("服務器已啟動");???????????? ??while(true){?? ??????packet?=?new?DatagramPacket(bytes,?bytes.length);?????????????? ??????socket.receive(packet);???????????????? ??????//建立客戶端ip,端口???????????????? ??????InetAddress?address=packet.getAddress();???????????????? ??????int?port=packet.getPort();???????????????? ??????UDPthread?thread=new?UDPthread(socket,packet,address,port,bytes);??????????????? ??????thread.start();??????????? ????}2018-05-31
?//啟動服務器????????????System.out.println("服務器已啟動");????????????while(true){????????????????socket.receive(packet);????????????????//建立客戶端ip,端口????????????????InetAddress?address=packet.getAddress();????????????????int?port=packet.getPort();????????????????UDPthread?thread=new?UDPthread(socket,packet,address,port,bytes);????????????????thread.start();????????????}這里要每次new一個新的packet,即
?//啟動服務器????????????System.out.println("服務器已啟動");????????????while(true){???????????????packet?=?new?DatagramPacket(bytes,?bytes.length);?socket.receive(packet);????????????????//建立客戶端ip,端口????????????????InetAddress?address=packet.getAddress();????????????????int?port=packet.getPort();????????????????UDPthread?thread=new?UDPthread(socket,packet,address,port,bytes);????????????????thread.start();????????????}2016-11-26
兄弟,我也是這個問題,你是怎么解決的?
2016-04-26
但你有沒有看出我提出的問題