老師的作業第一次運行一直不正常,還有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