在网络上的通讯需要使用协议,常见的通讯协议: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培训、期待与您交流! ----------------------