java网络编程

1. 网络编程概述

网络编程中有两个主要的问题:

  1. 如何准确地定位网络上一台或多台主机;定位主机上的特定的应用
  2. 找到主机后如何可靠高效地进行数据传输

2. 网络通信要素概述

网络编程中的两个要素:

  1. 对应问题一:IP和端口号
  2. 对应问题二:提供网络通信协议:TCP/IP参考模型(应用层、传输层、网络层、物理+数据链路层)

3. 通信要素1:IP和端口号

  1. IP:唯一的标识 Internet 上的计算机(通信实体)

  2. 在Java中使用InetAddress类代表IP

  3. IP分类:IPv4 和 IPv6 ; 公网地址(万维网使用)和私有地址(局域网使用)。192.168. 开头的就是私有址址,范围即为192.168.0.0—192.168.255.255,专门为组织机 构内部使用

  4. 域名: www.baidu.com www.mi.com www.sina.com www.jd.com www.vip.com

  5. 本地回路地址:127.0.0.1 对应着:localhost

  6. 如何实例化InetAddress:两个方法:getByName(String host) 、 getLocalHost()
    两个常用方法:getHostName() / getHostAddress()

    1. public class InetAddressTest {
    2. public static void main(String[] args) {
    3. try {
    4. //File file = new File("hello.txt");
    5. InetAddress inet1 = InetAddress.getByName("192.168.10.14");
    6. System.out.println(inet1);
    7. InetAddress inet2 = InetAddress.getByName("www.atguigu.com");
    8. System.out.println(inet2);
    9. InetAddress inet3 = InetAddress.getByName("127.0.0.1");
    10. System.out.println(inet3);
    11. //获取本地ip
    12. InetAddress inet4 = InetAddress.getLocalHost();
    13. System.out.println(inet4);
    14. //getHostName()
    15. System.out.println(inet2.getHostName());
    16. //getHostAddress()
    17. System.out.println(inet2.getHostAddress());
    18. } catch (UnknownHostException e) {
    19. e.printStackTrace();
    20. }
    21. }
    22. }
  1. 端口号:标识正在计算机上运行的进程(程序)

    • 要求:不同的进程有不同的端口号
    • 范围:被规定为一个 16 位的整数 0~65535。
  2. 端口号与IP地址的组合得出一个网络套接字:Socket

4. 通信要素2:网络协议

5. TCP网络编程

例题1:客户端发送内容给服务端,服务端将内容打印到控制台上。

  1. /**
  2. * 实现TCP的网络编程
  3. * 例子1:客户端发送信息给服务端,服务端将数据显示在控制台上
  4. *
  5. * @author shkstart
  6. * @create 2019 下午 3:30
  7. */
  8. public class TCPTest1 {
  9. //客户端
  10. @Test
  11. public void client() {
  12. Socket socket = null;
  13. OutputStream os = null;
  14. try {
  15. //1.创建Socket对象,指明服务器端的ip和端口号
  16. InetAddress inet = InetAddress.getByName("192.168.14.100");
  17. socket = new Socket(inet,8899);
  18. //2.获取一个输出流,用于输出数据
  19. os = socket.getOutputStream();
  20. //3.写出数据的操作
  21. os.write("你好,我是客户端mm".getBytes());
  22. } catch (IOException e) {
  23. e.printStackTrace();
  24. } finally {
  25. //4.资源的关闭
  26. if(os != null){
  27. try {
  28. os.close();
  29. } catch (IOException e) {
  30. e.printStackTrace();
  31. }
  32. }
  33. if(socket != null){
  34. try {
  35. socket.close();
  36. } catch (IOException e) {
  37. e.printStackTrace();
  38. }
  39. }
  40. }
  41. }
  42. //服务端
  43. @Test
  44. public void server() {
  45. ServerSocket ss = null;
  46. Socket socket = null;
  47. InputStream is = null;
  48. ByteArrayOutputStream baos = null;
  49. try {
  50. //1.创建服务器端的ServerSocket,指明自己的端口号
  51. ss = new ServerSocket(8899);
  52. //2.调用accept()表示接收来自于客户端的socket
  53. socket = ss.accept();
  54. //3.获取输入流
  55. is = socket.getInputStream();
  56. //不建议这样写,可能会有乱码
  57. // byte[] buffer = new byte[1024];
  58. // int len;
  59. // while((len = is.read(buffer)) != -1){
  60. // String str = new String(buffer,0,len);
  61. // System.out.print(str);
  62. // }
  63. //4.读取输入流中的数据
  64. baos = new ByteArrayOutputStream();
  65. byte[] buffer = new byte[5];
  66. int len;
  67. while((len = is.read(buffer)) != -1){
  68. baos.write(buffer,0,len);
  69. }
  70. System.out.println(baos.toString());
  71. System.out.println("收到了来自于:" + socket.getInetAddress().getHostAddress() + "的数据");
  72. } catch (IOException e) {
  73. e.printStackTrace();
  74. } finally {
  75. if(baos != null){
  76. //5.关闭资源
  77. try {
  78. baos.close();
  79. } catch (IOException e) {
  80. e.printStackTrace();
  81. }
  82. }
  83. if(is != null){
  84. try {
  85. is.close();
  86. } catch (IOException e) {
  87. e.printStackTrace();
  88. }
  89. }
  90. if(socket != null){
  91. try {
  92. socket.close();
  93. } catch (IOException e) {
  94. e.printStackTrace();
  95. }
  96. }
  97. if(ss != null){
  98. try {
  99. ss.close();
  100. } catch (IOException e) {
  101. e.printStackTrace();
  102. }
  103. }
  104. }
  105. }
  106. }

例题2:客户端发送文件给服务端,服务端将文件保存在本地。

  1. /**
  2. *
  3. * 实现TCP的网络编程
  4. * 例题2:客户端发送文件给服务端,服务端将文件保存在本地。
  5. *
  6. * @author shkstart
  7. * @create 2019 下午 3:53
  8. */
  9. public class TCPTest2 {
  10. /*
  11. 这里涉及到的异常,应该使用try-catch-finally处理
  12. */
  13. @Test
  14. public void client() throws IOException {
  15. //1.
  16. Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9090);
  17. //2.
  18. OutputStream os = socket.getOutputStream();
  19. //3.
  20. FileInputStream fis = new FileInputStream(new File("beauty.jpg"));
  21. //4.
  22. byte[] buffer = new byte[1024];
  23. int len;
  24. while((len = fis.read(buffer)) != -1){
  25. os.write(buffer,0,len);
  26. }
  27. //5.
  28. fis.close();
  29. os.close();
  30. socket.close();
  31. }
  32. /*
  33. 这里涉及到的异常,应该使用try-catch-finally处理
  34. */
  35. @Test
  36. public void server() throws IOException {
  37. //1.
  38. ServerSocket ss = new ServerSocket(9090);
  39. //2.
  40. Socket socket = ss.accept();
  41. //3.
  42. InputStream is = socket.getInputStream();
  43. //4.
  44. FileOutputStream fos = new FileOutputStream(new File("beauty1.jpg"));
  45. //5.
  46. byte[] buffer = new byte[1024];
  47. int len;
  48. while((len = is.read(buffer)) != -1){
  49. fos.write(buffer,0,len);
  50. }
  51. //6.
  52. fos.close();
  53. is.close();
  54. socket.close();
  55. ss.close();
  56. }
  57. }

例题3:从客户端发送文件给服务端,服务端保存到本地。并返回“发送成功”给 客户端。并关闭相应的连接。

  1. /**
  2. * 实现TCP的网络编程
  3. * 例题3:从客户端发送文件给服务端,服务端保存到本地。并返回“发送成功”给客户端。
  4. * 并关闭相应的连接。
  5. * @author shkstart
  6. * @create 2019 下午 4:13
  7. */
  8. public class TCPTest3 {
  9. /*
  10. 这里涉及到的异常,应该使用try-catch-finally处理
  11. */
  12. @Test
  13. public void client() throws IOException {
  14. //1.
  15. Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9090);
  16. //2.
  17. OutputStream os = socket.getOutputStream();
  18. //3.
  19. FileInputStream fis = new FileInputStream(new File("beauty.jpg"));
  20. //4.
  21. byte[] buffer = new byte[1024];
  22. int len;
  23. while((len = fis.read(buffer)) != -1){
  24. os.write(buffer,0,len);
  25. }
  26. //关闭数据的输出
  27. socket.shutdownOutput();
  28. //5.接收来自于服务器端的数据,并显示到控制台上
  29. InputStream is = socket.getInputStream();
  30. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  31. byte[] bufferr = new byte[20];
  32. int len1;
  33. while((len1 = is.read(buffer)) != -1){
  34. baos.write(buffer,0,len1);
  35. }
  36. System.out.println(baos.toString());
  37. //6.
  38. fis.close();
  39. os.close();
  40. socket.close();
  41. baos.close();
  42. }
  43. /*
  44. 这里涉及到的异常,应该使用try-catch-finally处理
  45. */
  46. @Test
  47. public void server() throws IOException {
  48. //1.
  49. ServerSocket ss = new ServerSocket(9090);
  50. //2.
  51. Socket socket = ss.accept();
  52. //3.
  53. InputStream is = socket.getInputStream();
  54. //4.
  55. FileOutputStream fos = new FileOutputStream(new File("beauty2.jpg"));
  56. //5.
  57. byte[] buffer = new byte[1024];
  58. int len;
  59. while((len = is.read(buffer)) != -1){
  60. fos.write(buffer,0,len);
  61. }
  62. System.out.println("图片传输完成");
  63. //6.服务器端给予客户端反馈
  64. OutputStream os = socket.getOutputStream();
  65. os.write("你好,美女,照片我已收到,非常漂亮!".getBytes());
  66. //7.
  67. fos.close();
  68. is.close();
  69. socket.close();
  70. ss.close();
  71. os.close();
  72. }
  73. }

6. UDP网络编程

  1. /**
  2. * UDP协议的网络编程
  3. * @author shkstart
  4. * @create 2019 下午 4:34
  5. */
  6. public class UDPTest {
  7. //发送端
  8. @Test
  9. public void sender() throws IOException {
  10. DatagramSocket socket = new DatagramSocket();
  11. String str = "我是UDP方式发送的导弹";
  12. byte[] data = str.getBytes();
  13. InetAddress inet = InetAddress.getLocalHost();
  14. DatagramPacket packet = new DatagramPacket(data,0,data.length,inet,9090);
  15. socket.send(packet);
  16. socket.close();
  17. }
  18. //接收端
  19. @Test
  20. public void receiver() throws IOException {
  21. DatagramSocket socket = new DatagramSocket(9090);
  22. byte[] buffer = new byte[100];
  23. DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
  24. socket.receive(packet);
  25. System.out.println(new String(packet.getData(),0,packet.getLength()));
  26. socket.close();
  27. }
  28. }

7. URL编程

URL(Uniform Resource Locator):统一资源定位符,它表示 Internet 上某一 资源的地址。它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate 这个资源。

  1. /**
  2. * URL网络编程
  3. * 1.URL:统一资源定位符,对应着互联网的某一资源地址
  4. * 2.格式:
  5. * http://localhost:8080/examples/beauty.jpg?username=Tom
  6. * 协议 主机名 端口号 资源地址 参数列表
  7. *
  8. * @author shkstart
  9. * @create 2019 下午 4:47
  10. */
  11. public class URLTest {
  12. public static void main(String[] args) {
  13. try {
  14. URL url = new URL("http://localhost:8080/examples/beauty.jpg?username=Tom");
  15. // public String getProtocol( ) 获取该URL的协议名
  16. System.out.println(url.getProtocol());
  17. // public String getHost( ) 获取该URL的主机名
  18. System.out.println(url.getHost());
  19. // public String getPort( ) 获取该URL的端口号
  20. System.out.println(url.getPort());
  21. // public String getPath( ) 获取该URL的文件路径
  22. System.out.println(url.getPath());
  23. // public String getFile( ) 获取该URL的文件名
  24. System.out.println(url.getFile());
  25. // public String getQuery( ) 获取该URL的查询名
  26. System.out.println(url.getQuery());
  27. } catch (MalformedURLException e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. }
  1. public class URLTest1 {
  2. public static void main(String[] args) {
  3. HttpURLConnection urlConnection = null;
  4. InputStream is = null;
  5. FileOutputStream fos = null;
  6. try {
  7. URL url = new URL("http://localhost:8080/examples/beauty.jpg");
  8. urlConnection = (HttpURLConnection) url.openConnection();
  9. urlConnection.connect();
  10. is = urlConnection.getInputStream();
  11. fos = new FileOutputStream("day10\\beauty3.jpg");
  12. byte[] buffer = new byte[1024];
  13. int len;
  14. while((len = is.read(buffer)) != -1){
  15. fos.write(buffer,0,len);
  16. }
  17. System.out.println("下载完成");
  18. } catch (IOException e) {
  19. e.printStackTrace();
  20. } finally {
  21. //关闭资源
  22. if(is != null){
  23. try {
  24. is.close();
  25. } catch (IOException e) {
  26. e.printStackTrace();
  27. }
  28. }
  29. if(fos != null){
  30. try {
  31. fos.close();
  32. } catch (IOException e) {
  33. e.printStackTrace();
  34. }
  35. }
  36. if(urlConnection != null){
  37. urlConnection.disconnect();
  38. }
  39. }
  40. }
  41. }