老師的作業第一次運行一直不正常,還有socket關閉的問題,請幫忙看下
服務器端代碼
package?com.nettest;
import?java.io.IOException;
import?java.net.DatagramPacket;
import?java.net.DatagramSocket;
public?class?UDPserver?{
public?static?void?main(String[]?args)?throws?IOException?{
byte[]?data=null;
DatagramPacket?packet?=?null;
DatagramSocket?socket?=new?DatagramSocket(8800);
UDPThread?thread=null;
int?count?=1;
while(true){
data=new?byte[1024];
packet?=?new?DatagramPacket(data,?data.length);
System.out.println("服務器端已啟動,等待客戶端連接");
socket.receive(packet);
System.out.println("客戶端連接");
System.out.println("客戶端連接數量為:"+count);
thread=new?UDPThread(packet,socket,data);
thread.start();
count++;
}
}
}客戶端代碼
package?com.nettest;
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?UDPClient?{
public?static?void?main(String[]?args)?throws?IOException?{
InetAddress?add=InetAddress.getByName("localhost");
int?port=8800;
byte[]?data="用戶名:admin;密碼:123".getBytes();
DatagramPacket?packet=new?DatagramPacket(data,?data.length,add,port);
DatagramSocket?socket=new?DatagramSocket();
socket.send(packet);
byte[]?data2=new?byte[1024];
DatagramPacket?packe2=new?DatagramPacket(data2,?data2.length);
socket.receive(packe2);
String?s=new?String(data2,0,packe2.getLength());
System.out.println(s);
socket.close();
}
}線程代碼
package?com.nettest;
import?java.io.IOException;
import?java.net.DatagramPacket;
import?java.net.DatagramSocket;
import?java.net.InetAddress;
import?java.net.SocketException;
public?class?UDPThread?extends?Thread?{
byte[]?data=null;
DatagramPacket?packet?=?null;
DatagramSocket?socket?=?null;
DatagramPacket?packet2=null;
byte[]?data2=null;
UDPThread(DatagramPacket?packet,DatagramSocket?socket,byte[]?data){
this.packet=packet;
this.socket=socket;
this.data=data;
}
public?synchronized?void?run(){
try?{
String?s=new?String(data,0,packet.getLength());
System.out.println("客戶端說:"+s);
InetAddress?add=packet.getAddress();??
System.out.println("客戶端IP:"+add);
data2="歡迎您".getBytes();
int?port=packet.getPort();
packet2=new?DatagramPacket(data2,?data2.length,add,port);
socket.send(packet2);
}
catch?(SocketException?e)?{
e.printStackTrace();
}?catch?(IOException?e)?{
e.printStackTrace();
}
finally{
//socket.close();
}
}
}第一運行結果一直是這樣:
“服務器端已啟動,等待客戶端連接”這一句出現了兩次,客戶端正常。
還有如果我在線程代碼中的finally里設置關閉datapramsocket在運行的時候會報錯,請問老師應該怎么解決?

2016-08-02
你把UDPServer中的:DatagramSocket socket=new DatagramSocket(8800),改為DatagramSocket socket=null;然后在死循環中初始化socket=new DatagramSocket(8800);這是因為UDP是一種臨時的協議,每次傳輸完數據close之后,都必須再次創建
2016-07-06
使用UDP協議時,socket是通用的,所以不能再線程UDPThread中關閉,應該在服務器UDPserver代碼中關閉
2016-04-25
使用線程的話,服務器端要一直阻塞啊,socket怎么能關閉呢是吧?
2015-12-16
沒有閉關Socket