java网络编程----例子
网络编程创建时间:2012-6-30 10:55更新时间:2012-7-2 22:11
IP地址划分网段
网络模型OSI参考模型TCP/IP参考模型
URL与URI的区别
网络通讯要素
IP地址: InetAddress 以计算机名称为参数得到InetAddress,需要一个解析的过程。
端口号:有效端口0~65535,其中0~1024系统使用或保留端口
传输协议:TCP、UDP UDP传输: 面向无连接的,发数据前不需要建立连接,是不可靠的协议,每个数据包的大小限制在64k以内。速度快 用途:聊天软件,网络视频。类似生活中的邮局邮寄信件;
TCP传输: 面向连接的可靠协议,通过三次握手建立连接,在连接中进行大数据量传输 缺点:建立连接耗时 应用:下载软件。类似生活中的打电话
Socket通信网络通信两端都有Socket,网络通信就是Socket之间的通信
- UDP的Socket服务:广播,同一个网段? 发送端和接收端都是DatagramSocket对象 /*发送端*/ public class UdpSend { public static void main(String[] args) throws Exception { // 1. 创建udp服务 DatagramSocket ds = new DatagramSocket();
BufferedReader bufr = new BufferedReader(new InputStreamReader( System. in)); // 2. 确定数据,并封装成数据报 String line = null; while ((line = bufr.readLine()) != null) { if (line.equals("88" )) break; byte[] buf = line.getBytes(); DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress . getByName("192.168.1.255"), 10000); // 255是广播
// 3.通过socket服务,将已有的数据包发送出去 ds.send(dp); } // 4.关闭资源 ds.close(); } }
/* 接收端 * 1. 创建一个UDP Socket服务,定义一个端口,其实就是给这个接收网络应用程序定义一个数字标识, * 方便明确哪些数据过来该应用程序可以处理 * 2. 定义一个数据包,因为要存储接收到的字节数据,因为数据包对象中有更多的功能可以提取字节数据中的不同数据信息 * 3. 通过socket服务的receive方法将受到的数据存入已定义好的数据包中 * 4. 通过数据包对象的特有功能,将这些不同的数据取出,打印到控制台上 * 5. 关闭资源 * */public class UdpReceive { public static void main(String[] args) throws Exception { // 1. 创建UDP Socket DatagramSocket ds = new DatagramSocket(10000); // 2. 定义数据包,用于存储数据 while (true ) { byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf, buf.length); // 3.通过Socket服务的receive方法将受到的数据存入数据包中 ds.receive(dp);// 注意:这是一个阻塞方法 // 4. 通过数据包的方法获取其中的数据 String ip = dp.getAddress().getHostAddress(); String data = new String(dp.getData(), 0, dp.getLength()); int port = dp.getPort(); System. out.println(ip + ":" + data + ":" + port); } // 5. 关闭资源 //ds.close();
}- TCP的Socket服务 客户端是Socket,服务端是ServerSocket ServerSocket(int port , int backlog) backlog表示允许连接的最大客户端数 ---------------------------------------------------- 例1:键盘输入信息发送到服务端 ----------------------------------------------------
/* * 客户端 * 功能:键盘输入发送信息到服务端 * 1. IO流使用BufferedReader/PrintWriter * 2. PrintWriter构造函数的第二个参数是true时,对象的pintln()方法自动flush缓存 * 3. 如果使用BufferedWriter作为输出流,则必须额外加上newLine()和flush()操作 * */public class TCPClient1 { public static void main(String[] args) throws Exception { Socket client = new Socket("localhost" , 10001); // 键盘输入流 BufferedReader bufr = new BufferedReader(new InputStreamReader( System. in)); // socket 输出流 方式1 BufferedWriter bufOut = new BufferedWriter( new OutputStreamWriter( client.getOutputStream())); // socket 输入流 BufferedReader bufin = new BufferedReader(new InputStreamReader(client .getInputStream())); // socket 输出流 方式2 PrintWriter out = new PrintWriter(client.getOutputStream(), true);//true表示调用 println()方法时会自动flush String line = null; while ((line = bufr.readLine()) != null) { if ("88" .equals(line)) break; // bufOut.write(line); // 服务器端用readLine()方法读取数据时是以回车换行为结尾的,所以这里发送数据时,需要发一个回车换行 // bufOut.newLine(); // bufOut.flush(); out.println(line); String serverReturn = bufin.readLine(); System. out.println(serverReturn); } bufr.close(); client.close(); } }
/* * 服务端 * */public class TCPServer1 { public static void main(String[] args) throws Exception { ServerSocket ss = new ServerSocket(10001); Socket client = ss.accept(); // socket 输入流 BufferedReader bufIn = new BufferedReader(new InputStreamReader(client .getInputStream())); // socket 输出流 方式1 BufferedWriter bufOut = new BufferedWriter( new OutputStreamWriter( client.getOutputStream())); // socket 输出流 方式2 PrintWriter out = new PrintWriter(client.getOutputStream(), true); String line = null; while ((line = bufIn.readLine()) != null) { // 注意:readLine方法接收到回车换行才会返回,所以,客户端发送数据时需要out.newLine() System. out.println(line); // bufOut.write(line.toUpperCase()); // bufOut.newLine(); // bufOut.flush(); out.println(line.toUpperCase()); } client.close(); ss.close(); } } ----------------------------------------------------------- 例2 文本文件传输 -----------------------------------------------------------
/* * 客户端 * 功能: 文本文件传输 * 1. 文本文件传输用BufferedReader/PrintWriter * 2. 文件传送结束后,要显示告知服务端传递结束,即s.shutdownOutput() * */public class FileClient { public static void main(String[] args) throws Exception, IOException { Socket s = new Socket("localhost" , 10001); BufferedReader bufr = new BufferedReader(new FileReader( "FileServer.java")); PrintWriter out = new PrintWriter(s.getOutputStream(),true); String line = null; while ((line = bufr.readLine()) != null) { out.println(line); } s.shutdownOutput(); // 关闭客户端输出流,相当于在流中加入结束标记 -1 BufferedReader bufIn = new BufferedReader(new InputStreamReader(s .getInputStream())); String serverResult = bufIn.readLine(); System. out.println(serverResult); s.close(); } }
/* * 服务端 * 功能:接收客户端文本文件上传 * 1. 文本文件的IO操作使用BufferedReader/PrintWriter * */public class FileServer { public static void main(String[] args) throws Exception { ServerSocket ss = new ServerSocket(10001); Socket client = ss.accept(); BufferedReader bufIn = new BufferedReader(new InputStreamReader(client .getInputStream())); System. out.println("ip:" +client.getInetAddress().getHostAddress()); PrintWriter pw = new PrintWriter(new FileWriter("save.txt"), true); String line = null; while ((line = bufIn.readLine()) != null) { System. out.println(line); pw.println(line); } PrintWriter out = new PrintWriter(client.getOutputStream()); out.println( "上传成功" ); out.close(); pw.close(); client.close(); ss.close(); } } ------------------------------------------------- 例3 服务端并发接收图片文件上传 -------------------------------------------------
/* * 客户端 * 功能:发送图片文件 * */public class ConcurrentPicClient { public static void main(String[] args) throws Exception { Socket s = new Socket("localhost" , 10001); InputStream in = s.getInputStream(); OutputStream out = s.getOutputStream(); //读文件 FileInputStream is = new FileInputStream(new File("test.gif" )); byte[] buf = new byte[1024]; int len = 0; while ((len = is.read(buf)) != -1) { out.write(buf, 0, len); } s.shutdownOutput(); // 标记文件传递结束 len = in.read(buf); System. out.println(new String(buf, 0, len)); is.close(); s.close(); } }
/* * 服务端 * 功能:并发接收图片上传 * 图片文件使用Stream进行读写,不适用Reader/Writer * */public class ConcurrentServer { public static void main(String[] args) throws Exception { ServerSocket ss = new ServerSocket(10001); while (true ) { new Thread(new ServerThread(ss.accept())).start(); } } } class ServerThread implements Runnable { private Socket s ; public ServerThread(Socket s) { this.s = s; } public void run() { int count = 1; String ip = s.getInetAddress().getHostAddress(); System. out.println(ip + "...connected" ); try { InputStream in = s.getInputStream(); OutputStream out = s.getOutputStream(); // 保证file不重名 File file = new File(ip + "(" + count + ").jpg"); while (file.exists()) { count++; file = new File(ip + "(" + count + ").jpg"); } // 写文件 FileOutputStream fo = new FileOutputStream(file); byte[] buf = new byte[1024]; int len = 0; while ((len = in.read(buf)) != -1) { fo.write(buf, 0, len); } out.write( "上传成功" .getBytes()); fo.close(); s.close(); } catch (Exception e) { } } }