亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

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

	}

}

第一運行結果一直是這樣:http://img1.sycdn.imooc.com//565552b70001336404200223.jpg

“服務器端已啟動,等待客戶端連接”這一句出現了兩次,客戶端正常。

還有如果我在線程代碼中的finally里設置關閉datapramsocket在運行的時候會報錯,請問老師應該怎么解決?

http://img1.sycdn.imooc.com//565553e60001ea4710410157.jpg


正在回答

4 回答

你把UDPServer中的:DatagramSocket socket=new DatagramSocket(8800),改為DatagramSocket socket=null;然后在死循環中初始化socket=new DatagramSocket(8800);這是因為UDP是一種臨時的協議,每次傳輸完數據close之后,都必須再次創建

0 回復 有任何疑惑可以回復我~

使用UDP協議時,socket是通用的,所以不能再線程UDPThread中關閉,應該在服務器UDPserver代碼中關閉


0 回復 有任何疑惑可以回復我~

使用線程的話,服務器端要一直阻塞啊,socket怎么能關閉呢是吧?


0 回復 有任何疑惑可以回復我~

沒有閉關Socket

0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

老師的作業第一次運行一直不正常,還有socket關閉的問題,請幫忙看下

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號