码迷,mamicode.com
首页 > 编程语言 > 详细

黑马程序员-Java基础之网络编程

时间:2015-12-24 01:59:39      阅读:285      评论:0      收藏:0      [点我收藏+]

标签:

  

                                  网络编程

  实现计算机互联的三要素:

1、IP地址

        本机回路IP:127.0.0.1

2、端口号(逻辑端口):用于标识应用程序。

       端口号0~65535之间的整数;0~1024之间大部分已被用于一些知名的网络服务和应用,所以现在开发的网络应用程序端口号一般是1024以后的整数。

3、通信协议

       TCP:三次握手机制,面向连接,稍慢。可靠

       UDP:无连接,每个数据报大小限制在64K内。传输快。不可靠。

 

网络参考模型

TCP/IP参考模型

技术分享

应用层:javaWeb开发

传输层:TCP/UDP

网际层:IP

主机至网络层:有线还是无线,光纤还是电话线等

 

描述IP的java包:java.net 下的InetAddress类。

 

[java] view plaincopy
  1. mport java.net.InetAddress;  
  2. import java.util.Arrays;  
  3.   
  4. public class IPDemo {  
  5.   
  6.     public static void main(String[] args) throws Exception {  
  7.         /*InetAddress i = InetAddress.getLocalHost(); 
  8.          
  9.         //本机主机地址、主机名 
  10.         String ip = i.getHostAddress() + "..." + i.getHostName(); 
  11.         System.out.println(ip);*/  
  12.           
  13.         //获取任意一台主机信息  
  14.         InetAddress[] ias = InetAddress.getAllByName("www.baidu.com");  
  15.         for(InetAddress ia : ias) {  
  16.             System.out.println(ia.getHostAddress() + "..." + ia.getHostName());  
  17.         }  
  18.     }  
  19.   
  20. }  

 

网络编程:其实就是Socket编程

通信的两端都有Socket, 数据在两个Socket间通过IO传输。

 

UDP传输:DatagramSocket和DatagramPacket

 一个简单的UDP通信示例

[java] view plaincopy
  1. class UDPsend {  
  2.     public static void main(String[] args) throws Exception {  
  3.         //创建UDP socket端点,可以指定固定端口发送数据,不指定则系统随机产生  
  4.         DatagramSocket ds = new DatagramSocket();  
  5.         //确定数据,并封装成数据包  
  6.         byte[] buf = "Hello, java".getBytes();  
  7.         DatagramPacket dp = new DatagramPacket(buf, 0, buf.length, InetAddress.getByName("127.0.0.1"), 8888);  
  8.           
  9.         //通过UDP socket的sent方法发送数据  
  10.         ds.send(dp);  
  11.         System.out.println("发送成功");  
  12.     }  
  13. }  
  14.   
  15. class UDPreceive {  
  16.     public static void main(String[] args) throws Exception {  
  17.         //创建UDP socket端点,指定用于接收数据的端口  
  18.         DatagramSocket ds = new DatagramSocket(8888);  
  19.         //定义数据包用于接收数据  
  20.         byte[] buf = new byte[1024];  
  21.         DatagramPacket dp = new DatagramPacket(buf, 0, buf.length);  
  22.         //接收数据存入于数据包中  
  23.         ds.receive(dp);  
  24.           
  25.         String ip = dp.getAddress().getHostAddress();  
  26.         String data = new String(dp.getData(), 0, dp.getLength());  
  27.         int port = dp.getPort();  
  28.         System.out.println(ip + ", " + port + ", " + data);  
  29.           
  30.         ds.close();  
  31.     }  
  32. }  

 

 需求:用TCP完成一个英文文本大小写转换的客户端和服务器端

客户端发送一个英文字符串到服务端,服务端返回一个将字符串转为全大写后的信息到客户端

[java] view plaincopy
  1. import java.net.*;  
  2. import java.io.*;  
  3. /* 
  4.  * 建立一个文本转换器 
  5.  *  
  6.  * 分析:操作的是客户端发来的文本信息数据,所以要用到IO流技术。 
  7.  *  
  8.  * 步骤: 
  9.  * 1、建立服务 
  10.  * 2、获取键盘录入 
  11.  * 3、将数据发给服务端 
  12.  * 4、服务端将小写字母全部转换为大写后发送给客户端 
  13.  * 5、关闭资源 
  14.  * */  
  15. public class TCPTextCast {  
  16.   
  17.     public static void main(String[] args) {  
  18.   
  19.     }  
  20.   
  21. }  
  22. class TCPClient1 {  
  23.       
  24.     public static void main(String[] args) throws Exception {  
  25.         Socket s = new Socket("127.0.0.1", 10003);  
  26.         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
  27.           
  28.         BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));  
  29.         //优化:PrintWriter out =new PrintWriter(s.getOutputStream(), true);  
  30.         //将bufOut传入PrintWriter(bufOut)也行  
  31.         BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));  
  32.           
  33.         String line = null;  
  34.         while((line=br.readLine())!= null) {  
  35.             if("over".equals(line))  
  36.                 break;  
  37.             bufOut.write(line);  
  38.             bufOut.newLine();  
  39.             bufOut.flush();  
  40.             //三句变一句,用out.println(line);  
  41.               
  42.             System.out.println("Server: " + bufIn.readLine());  
  43.         }  
  44.           
  45.         br.close();  
  46.         s.close();  
  47.     }  
  48.       
  49. }  
  50. class TCPServer1 {  
  51.       
  52.     public static void main(String[] args) throws Exception {  
  53.         ServerSocket ss = new ServerSocket(10003);  
  54.         Socket s = ss.accept();  
  55.           
  56.         String ip = s.getInetAddress().getHostAddress();  
  57.         System.out.println(ip + "...connceted");  
  58.           
  59.         BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));  
  60.         BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));  
  61.           
  62.         String data = null;  
  63.         while((data=br.readLine()) != null) {  
  64.               
  65.             System.out.println(ip + "... : " + data);  
  66.               
  67.             bw.write(data.toUpperCase());  
  68.             bw.newLine();  
  69.             bw.flush();  
  70.         }  
  71.               
  72.         s.close();  
  73.         ss.close();  
  74.     }  
  75.       
  76. }  

 

 TCP上传文件实例代码:

[java] view plaincopy
  1. /* 
  2.  * 使用TCP协议写一个可以上传文件的服务器和客户端。 
  3.  *  
  4.  * 思路:网络编程与IO流相拼命 
  5.  * 客户端通过socket向其输出流中写入本地文件,用到FileInputStream读取文件,也可加上缓冲BufferedInputStream. 
  6.  *  还有通过socket的输入流读取服务器端的反馈信息。 
  7.  * 服务端通过socket从其输入流中读取文件,存入到服务器端,并返回文件复制情况信息  
  8.  * 资源关闭 
  9.  * */  
  10.   
  11. import java.net.*;  
  12. import java.io.*;  
  13. public class FileLoader {  
  14.   
  15.     public static void main(String[] args) {  
  16.   
  17.     }  
  18.   
  19. }  
  20.   
  21. //客户端  
  22. class client {  
  23.     public static void main(String[] args) throws Exception {  
  24.         //建立Socket服务  
  25.         Socket fileLoaderSocket = new Socket("127.0.0.1", 10005);  
  26.         //从客户端本地读取文件,并写入socket的输出流中  
  27.         OutputStream out = fileLoaderSocket.getOutputStream();  
  28.         InputStream fileRead = new FileInputStream("G:\\Demo.mp3");  
  29.           
  30.         byte[] buf = new byte[1024];  
  31.         int len = 0;  
  32.         while((len=fileRead.read(buf)) != -1) {  
  33.             out.write(buf, 0, len);  
  34.         }  
  35.         //告诉服务端,文件已传输完毕  
  36.         fileLoaderSocket.shutdownOutput();  
  37.           
  38.         //获取从服务端反馈的信息  
  39.         BufferedReader in = new BufferedReader(new InputStreamReader(fileLoaderSocket.getInputStream()));  
  40.         String serverBack = in.readLine();  
  41.         System.out.println(serverBack);  
  42.           
  43.         //资源关闭  
  44.         fileLoaderSocket.close();  
  45.         fileRead.close();  
  46.     }  
  47. }  
  48.   
  49. //服务端  
  50. class Server {  
  51.     public static void main(String[] args) throws Exception {  
  52.         //建立服务端Socket  
  53.         ServerSocket ss = new ServerSocket(10005);  
  54.         //接收客户端Socket  
  55.         Socket fileLoaderSocket = ss.accept();  
  56.           
  57.         //打印连接信息  
  58.         String ip = fileLoaderSocket.getInetAddress().getHostAddress();  
  59.         System.out.println(ip + "...conncected");  
  60.           
  61.         //接收文件,并保存  
  62.         InputStream in = fileLoaderSocket.getInputStream();  
  63.         OutputStream fileSave = new FileOutputStream("E:\\server.mp3");  
  64.         byte[] buf = new byte[1024];  
  65.         int len = 0;  
  66.         while((len=in.read(buf)) != -1) {  
  67.             fileSave.write(buf, 0, len);  
  68.             fileSave.flush();  
  69.         }  
  70.         //返回文件复制情况信息  
  71.         BufferedWriter out = new BufferedWriter(new OutputStreamWriter(fileLoaderSocket.getOutputStream()));  
  72.         out.write("文件上传成功");  
  73.         out.flush();  
  74.           
  75.         //资源关闭  
  76.         ss.close();  
  77.         fileLoaderSocket.close();  
  78.         fileSave.close();  
  79.     }  
  80. }  

 

 public Socket() 到底连接哪台主机?

 它是用

public void connect(SocketAddress endpoint,int timeout) throws IOException

SocketAddress是abstract类,它有个子类InetSocketAddress ,此类实现 IP 套接字地址(IP 地址 + 端口号)。

 

 ServerSocket可以指定能连接客户端的最大数:

public ServerSocket(int port,int backlog) throws IOException

 

 

域名解析:

1、首先找本机 C:\WINDOWS\system32\drivers\etc 下的hosts文件配对

2、若上述文件中不存在映射(域名-IP),则进行下面的步骤:

技术分享

黑马程序员-Java基础之网络编程

标签:

原文地址:http://www.cnblogs.com/dan-ran/p/5071761.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!