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

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

基于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();

}

}

}


正在回答

5 回答

DatagramPacket packet1=new DatagramPacket(bytes1, 0, bytes1.length,address,port);這里只有4個參數吧?第二個參數0是什么作用?

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

Mardanof2 提問者

非常感謝!
2016-04-29 回復 有任何疑惑可以回復我~
?????//啟動服務器???????????
??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();???????????
????}


0 回復 有任何疑惑可以回復我~
?//啟動服務器????????????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();????????????}


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

兄弟,我也是這個問題,你是怎么解決的?

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

齾靊

看下面
2018-05-31 回復 有任何疑惑可以回復我~
#2

亞歷山魈 回復 齾靊

原因是什么,百思不得其解?。∏蟾嬷?/div>
2018-09-17 回復 有任何疑惑可以回復我~

http://img1.sycdn.imooc.com//571f8780000128f205060023.jpg0是offset是從第幾個byte開始的

但你有沒有看出我提出的問題

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

舉報

0/150
提交
取消

基于UDP的服務器實現多線程時,第一個客戶運行端不能在服務器登陸得到響應,第二個實行客戶端,第一次執行已停止的客戶端才能接受服務器的響應,服務器也才會得到第一個客戶端的信息

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

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

幫助反饋 APP下載

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

公眾號

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