---------------------- android培訓、java培訓、期待與您交流! ----------------------
在網絡上的通訊需要使用協議,常見的通訊協議:TCP協議和UDP協議
· TCP協議:屬於可靠的連接,可以保證數據能夠完整的傳輸到目的地。
· UDP協議:屬於不可靠的連接,傳輸數據的時候 數據在中途可能會丟失、損壞。
對於網絡程序的開發有兩種常見架構:
· C/S: 客戶端/服務器端。
|- 需要開發兩套代碼 一個是客戶端,另一個是服務器端。
|- 比如 一般玩的網絡遊戲都需要下載客戶端。玩家們通過客戶端來和服務器端進行數據交換。
· B/S: 瀏覽器/服務器。
|- 只需要開發服務器端的代碼即可 用戶通過瀏覽器來與服務器端進行通訊。
|- 比如 現在玩的網頁遊戲 用戶只需要使用瀏覽器就可以開始遊戲。
在Java中所有的網絡編程有關類都保存在java.net包中。
範例1:使用udp協議向客戶端出送圖片
客戶端:
package org.hwh.udp;
import java.net.DatagramPacket; import java.net.DatagramSocket;
import javax.swing.*; import java.awt.*; import java.awt.event.*;
public class Client extends JFrame { JButton bu; JLabel lab; ImageIcon image; public Client() throws Exception { super("一個客戶端"); DatagramSocket socket=new DatagramSocket(999); byte by[]=new byte[new Server().read().length];//這裏不知道如何確定byte的大小。 DatagramPacket packet=new DatagramPacket(by,by.length); socket.receive(packet);//接收數據 by=packet.getData(); this.image=new ImageIcon(by); ActionListener al=new ActionListener() {
public void actionPerformed(ActionEvent arg0) { lab=new JLabel(image); Client.this.add(BorderLayout.CENTER,lab); Client.this.validate(); } }; bu=new JButton("獲取圖片"); bu.addActionListener(al); add(BorderLayout.NORTH,bu);
this.setSize(500,600); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } public static void main(String[] args) throws Exception { new Client(); }
} |
package org.hwh.udp;
import java.io.*; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress;
public class Server { public static void main(String[] args) throws Exception { byte[] by=new Server().read(); DatagramSocket socket=new DatagramSocket(998); DatagramPacket packet=new DatagramPacket(by, 0,by.length,InetAddress.getLocalHost(),999); socket.send(packet);//發送數據 System.out.println("正在等待");
} //讀取圖片數據 public byte[] read()throws Exception { File file=new File("E:"+File.separator+"123.jpg");
FileInputStream fi=new FileInputStream(file); BufferedInputStream bi=new BufferedInputStream(fi); int i; byte by[]=new byte[(int) file.length()]; while((i=bi.read(by))!=-1) { } bi.close(); return by; }
} |
範例2:一個tcp協議程序(使用多線程開發服務器)
服務器:
package mytcp;
import java.net.*; /** * 服務器端代碼,加入多線程。 */ public class Server { public static void main(String args[]) throws Exception { ServerSocket server=new ServerSocket(8899);//監聽8899端口 boolean flage=true; while(flage) { System.out.println("等待連接...."); new ServerThread(server.accept()).start();//得到客戶端就開啓一個服務器線程 System.out.println("來了個客戶端連接"); } server.close(); } }
服務器線程:
package mytcp;
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Socket;
/** * 服務器的線程 */ public class ServerThread extends Thread { private Socket client; public ServerThread(Socket client) { this.client=client;//得到客戶端 } public void run() { boolean flage=true; BufferedReader bf=null; PrintStream ps=null; String msg = null; while(flage) { try { //得到客戶端的輸入流,裏面有客戶端輸入的內容 bf=new BufferedReader(new InputStreamReader(client.getInputStream())); //得到客戶端的輸出流,可向其放入信息 ps=new PrintStream(client.getOutputStream(),true); msg=bf.readLine();//讀出客戶端輸入的信息 if(msg.equals("end")) { flage=false; } } catch (IOException e) { e.printStackTrace(); } System.out.println(msg); ps.println("resive");//向客戶端迴應 } try { bf.close(); ps.close(); client.close(); } catch (IOException e) { e.printStackTrace(); } } }
客戶端:
package mytcp;
import java.net.*; import java.util.Scanner; import java.io.*; /** * 客戶端代碼, * 任務是向服務器輸入信息 */ public class Client { public static void main(String args[]) { Socket client=null; try { client=new Socket("localhost",8899);//連接8899端口 Scanner sc=new Scanner(System.in); System.out.println("請輸入信息:"); String msg; boolean flage=true; //得到客戶端的輸出流,裏面可存放客戶端輸入的信息 PrintStream ps=new PrintStream(client.getOutputStream(),true); //得到客戶端的輸入流,裏面有服務器迴應的內容 BufferedReader br=new BufferedReader(new InputStreamReader(client.getInputStream())); while(flage) { msg=sc.next(); if(msg.equals("end")) { flage=false; } ps.println(msg);//向客戶端的輸出流寫東西 System.out.println(br.readLine());//輸出服務器迴應的內容 } ps.close(); sc.close(); client.close(); }catch(Exception e) { e.printStackTrace(); } } }
----------------------
android培訓、java培訓、期待與您交流! ----------------------