十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
程序客戶端代碼也與此類似 客戶端采用循環(huán)不斷地讀取用戶鍵盤(pán)輸入 每當(dāng)讀到用戶輸入內(nèi)容后就將該內(nèi)容封裝成DatagramPacket數(shù)據(jù)報(bào) 再將該數(shù)據(jù)報(bào)發(fā)送出去 接著把DatagramSocket中的數(shù)據(jù)讀入接收用的DatagramPacket中(實(shí)際上是讀入該DatagramPacket所封裝的字節(jié)數(shù)組中) 客戶端代碼如下
成都創(chuàng)新互聯(lián)自2013年創(chuàng)立以來(lái),是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元任縣做網(wǎng)站,已為上家服務(wù),為任縣各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18980820575
程序清單 codes/ / /UdpClient java
public class UdpClient
{
//定義發(fā)送數(shù)據(jù)報(bào)的目的地
public static final int DEST_PORT = ;
public static final String DEST_IP = ;
//定義每個(gè)數(shù)據(jù)報(bào)的最大大小為 K
private static final int DATA_LEN = ;
//定義該客戶端使用的DatagramSocket
private DatagramSocket socket = null;
//定義接收網(wǎng)絡(luò)數(shù)據(jù)的字節(jié)數(shù)組
byte[] inBuff = new byte[DATA_LEN];
//以指定字節(jié)數(shù)組創(chuàng)建準(zhǔn)備接受數(shù)據(jù)的DatagramPacket對(duì)象
private DatagramPacket inPacket =
new DatagramPacket(inBuff inBuff length)
//定義一個(gè)用于發(fā)送的DatagramPacket對(duì)象
private DatagramPacket outPacket = null;
public void init()throws IOException
{
try
{
//創(chuàng)建一個(gè)客戶端DatagramSocket 使用隨機(jī)端口
socket = new DatagramSocket()
//初始化發(fā)送用的DatagramSocket 它包含一個(gè)長(zhǎng)度為 的字節(jié)數(shù)組
outPacket = new DatagramPacket(new byte[ ]
InetAddress getByName(DEST_IP) DEST_PORT)
//創(chuàng)建鍵盤(pán)輸入流
Scanner scan = new Scanner(System in)
//不斷讀取鍵盤(pán)輸入
while(scan hasNextLine())
{
//將鍵盤(pán)輸入的一行字符串轉(zhuǎn)換字節(jié)數(shù)組
byte[] buff = scan nextLine() getBytes()
//設(shè)置發(fā)送用的DatagramPacket里的字節(jié)數(shù)據(jù)
outPacket setData(buff)
//發(fā)送數(shù)據(jù)報(bào)
socket send(outPacket)
//讀取Socket中的數(shù)據(jù) 讀到的數(shù)據(jù)放在inPacket所封裝的字節(jié)數(shù)組里
socket receive(inPacket)
System out println(new String(inBuff
inPacket getLength()))
}
}
//使用finally塊保證關(guān)閉資源
finally
{
if (socket != null)
{
socket close()
}
}
}
public static void main(String[] args)
throws IOException
{
new UdpClient() init()
}
}
上面程序的粗體字代碼同樣也是通過(guò)DatagramSocket發(fā)送 接收DatagramPacket的關(guān)鍵代碼 這些代碼與服務(wù)器的代碼基本相似 而客戶端與服務(wù)器端的唯一區(qū)別在于 服務(wù)器所在IP地址 端口是固定的 所以客戶端可以直接將該數(shù)據(jù)報(bào)發(fā)送給服務(wù)器 而服務(wù)器則需要根據(jù)接收到的數(shù)據(jù)報(bào)來(lái)決定將 反饋 數(shù)據(jù)報(bào)的目的地
讀者可能會(huì)發(fā)現(xiàn) 使用DatagramSocket進(jìn)行網(wǎng)絡(luò)通信時(shí) 服務(wù)器端無(wú)須 也無(wú)法保存每個(gè)客戶端的狀態(tài) 客戶端把數(shù)據(jù)報(bào)發(fā)送到服務(wù)器后 完全有可能立即退出 但不管客戶端是否退出 服務(wù)器無(wú)法知道客戶端的狀態(tài)
當(dāng)使用UDP協(xié)議時(shí) 如果想讓一個(gè)客戶端發(fā)送的聊天信息可被轉(zhuǎn)發(fā)到其他所有客戶端則比較困難 可以考慮在服務(wù)器使用Set來(lái)保存所有客戶端信息 每當(dāng)接收到一個(gè)客戶端的數(shù)據(jù)報(bào)之后 程序檢查該數(shù)據(jù)報(bào)的源SocketAddress是否在Set集合中 如果不在就將該SocketAddress添加到該Set集合中 但這樣一來(lái)又涉及一個(gè)問(wèn)題 可能有些客戶端發(fā)送一個(gè)數(shù)據(jù)報(bào)之后永久性地退出了程序 但服務(wù)器端還將該客戶端的SocketAddress保存在Set集合中……總之 這種方式需要處理的問(wèn)題比較多 編程比較煩瑣 幸好Java為UDP協(xié)議提供了MulticastSocket類 通過(guò)該類可以輕松實(shí)現(xiàn)多點(diǎn)廣播
返回目錄 瘋狂Java講義
編輯推薦
Java程序性能優(yōu)化 讓你的Java程序更快 更穩(wěn)定
新手學(xué)Java 編程
Java程序設(shè)計(jì)培訓(xùn)視頻教程
lishixinzhi/Article/program/Java/hx/201311/27260
java中的接口是一種特殊的類,使用關(guān)鍵字interface創(chuàng)建。接口功能完全實(shí)現(xiàn)后,可以打成jar包,提供給其他公司使用。
要返回json格式數(shù)據(jù),可以把接口中抽象方法的返回值類型規(guī)定為JSONObject或JSONString類型。這樣當(dāng)其他公司調(diào)用時(shí),得到的數(shù)據(jù)就是json數(shù)據(jù)了。
另外,以jar形式提供的接口,可以通過(guò)反編譯得到你的源碼,如果你不希望開(kāi)源,就要加密了。
public class TalkServer{
public static void main(String args[]) {
try{
ServerSocket server=null;
try{
server=new ServerSocket(4700);
//創(chuàng)建一個(gè)ServerSocket在端口4700監(jiān)聽(tīng)客戶請(qǐng)求
}catch(Exception e) {
System.out.println("can not listen to:"+e);
//出錯(cuò),打印出錯(cuò)信息
}
Socket socket=null;
try{
socket=server.accept();
//使用accept()阻塞等待客戶請(qǐng)求,有客戶
//請(qǐng)求到來(lái)則產(chǎn)生一個(gè)Socket對(duì)象,并繼續(xù)執(zhí)行
}catch(Exception e) {
System.out.println("Error."+e);
//出錯(cuò),打印出錯(cuò)信息
}
String line;
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//由Socket對(duì)象得到輸入流,并構(gòu)造相應(yīng)的BufferedReader對(duì)象
PrintWriter os=newPrintWriter(socket.getOutputStream());
//由Socket對(duì)象得到輸出流,并構(gòu)造PrintWriter對(duì)象
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
//由系統(tǒng)標(biāo)準(zhǔn)輸入設(shè)備構(gòu)造BufferedReader對(duì)象
System.out.println("Client:"+is.readLine());
//在標(biāo)準(zhǔn)輸出上打印從客戶端讀入的字符串
line=sin.readLine();
//從標(biāo)準(zhǔn)輸入讀入一字符串
while(!line.equals("bye")){
//如果該字符串為 "bye",則停止循環(huán)
os.println(line);
//向客戶端輸出該字符串
os.flush();
//刷新輸出流,使Client馬上收到該字符串
System.out.println("Server:"+line);
//在系統(tǒng)標(biāo)準(zhǔn)輸出上打印讀入的字符串
System.out.println("Client:"+is.readLine());
//從Client讀入一字符串,并打印到標(biāo)準(zhǔn)輸出上
line=sin.readLine();
//從系統(tǒng)標(biāo)準(zhǔn)輸入讀入一字符串
} //繼續(xù)循環(huán)
os.close(); //關(guān)閉Socket輸出流
is.close(); //關(guān)閉Socket輸入流
socket.close(); //關(guān)閉Socket
server.close(); //關(guān)閉ServerSocket
}catch(Exception e){
System.out.println("Error:"+e);
//出錯(cuò),打印出錯(cuò)信息
}
}
}