网络编程

网络编程

  1. 计算机网络:不同地理区域的计算机,通过通信线路互连成一个规模大、功能强的网络系统。
  2. 网络编程的目的:直接或间接的通过网络协议与其他计算机实现数据交换,进行通讯。
  3. 网络编程中有两个主要的问题:
    1. 如何准确的定位网络上的一台或多台主机,定位主机上特定的应用。
      1. IP
      2. 端口号
    2. 找到主机后如何可靠,高效的进行网络传输
      1. 网络通信协议
  4. 网络编程的两个要素
    1. IP和端口号
      1. IP
        1. IP:唯一的标识Internet上的计算机(通信实体)
        2. 在java中使用InetAddress类表示
        3. IP分类:IPV4、IPV6|万维网、局域网(192.168.255.255-192.168.0.0)
        4. 域名:www.baidu.com、通过DNS域名解析服务器返回IP地址,然后访问对应的IP地址。
        5. 本地回路地址:127.0.0.1本机localhost
      2. 端口号
        1. 标识计算机上正在运行的程序
        2. 不同的进程有不同的端口号
        3. 16位二进制表示:0-65535
        4. 端口分类:
          1. 公认端口:0-1023。被预先定义的服务通信占用,HTTP:80、HTTPS:443、FTP:21、telnet:23
          2. 注册端口:1024-49151.分配给用户进程或应用程序。Tomcat:8080、mysql:3306、Oracle:1521
          3. 动态/私有端口:49152-65535
      3. 网络套接字Socket:端口号与IP地址的组合
    2. 网络通信协议:TCP/IP参考模型(应用层、传输层、网络层、物理+数据链路层)
      1. 概念:计算机网络中实现通信必须要有一些约定、即通讯协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准。
      2. 传输层:
        1. TCP协议
          1. 使用TCP协议前,需要先建立TCP连接,形成传输数据通道
          2. 传输前,采用三次握手方式,点对点通信,是可靠的
          3. TCP协议进行通信的两个应用程序:客户端、服务端
          4. 在连接中可以进行大数据量的传输
          5. 传输完毕,需要释放已经建立的连接,效率低
        2. UDP协议
          1. 将数据、源、目的封装成数据包,不需要建立连接
          2. 每个数据包的大小限制在64K内
          3. 发送不管对方是否准备好,接收方也不确认,故而是不可靠的
          4. 可以广播发送
          5. 发送结束时无需释放资源,开销小速度快

            TCP示例

  1. //客户端
  2. @Test
  3. public void client() {
  4. Socket socket = null;
  5. OutputStream outputStream = null;
  6. try {
  7. InetAddress inet = InetAddress.getByName("10.138.93.75");
  8. socket = new Socket(inet,8881);
  9. outputStream = socket.getOutputStream();
  10. outputStream.write("你好我是客户端".getBytes());
  11. } catch (IOException e) {
  12. e.printStackTrace();
  13. } finally {
  14. if(socket!=null) {
  15. try {
  16. outputStream.close();
  17. } catch (IOException e) {
  18. e.printStackTrace();
  19. }
  20. }
  21. if (outputStream!=null){
  22. try {
  23. socket.close();
  24. } catch (IOException e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. }
  29. }
  30. //服务器
  31. @Test
  32. public void server(){
  33. ServerSocket serverSocket =null;
  34. ByteArrayOutputStream byteArrayOutputStream = null;
  35. Socket socket = null;
  36. InputStream inputStream = null;
  37. try {
  38. serverSocket = new ServerSocket(8881);
  39. socket = serverSocket.accept();
  40. inputStream = socket.getInputStream();
  41. byteArrayOutputStream = new ByteArrayOutputStream();
  42. //可能会有乱码
  43. // byte[] bytes = new byte[16];
  44. // int len;
  45. // while ((len = inputStream.read(bytes))!=-1){
  46. // System.out.print(new String(bytes,0,len));
  47. // }
  48. byte[] bytes = new byte[16];
  49. int len;
  50. while ((len = inputStream.read(bytes))!=-1){
  51. byteArrayOutputStream.write(bytes,0,len);
  52. }
  53. System.out.println(byteArrayOutputStream.toString());
  54. } catch (IOException e) {
  55. e.printStackTrace();
  56. } finally {
  57. if (serverSocket!=null){
  58. try {
  59. serverSocket.close();
  60. } catch (IOException e) {
  61. e.printStackTrace();
  62. }
  63. }
  64. if(byteArrayOutputStream!=null){
  65. try {
  66. byteArrayOutputStream.close();
  67. } catch (IOException e) {
  68. e.printStackTrace();
  69. }
  70. }
  71. if(socket!=null){
  72. try {
  73. socket.close();
  74. } catch (IOException e) {
  75. e.printStackTrace();
  76. }
  77. }
  78. if(inputStream!=null){
  79. try {
  80. inputStream.close();
  81. } catch (IOException e) {
  82. e.printStackTrace();
  83. }
  84. }
  85. }
  86. }

UDP示例

  1. //客户端
  2. @Test
  3. public void client(){
  4. DatagramSocket datagramSocket = null;
  5. try {
  6. datagramSocket = new DatagramSocket();
  7. String data = "我是客户端";
  8. byte[] bytes = data.getBytes();
  9. InetAddress inetAddress = InetAddress.getLocalHost();
  10. DatagramPacket datagramPacket = new DatagramPacket(bytes,0,bytes.length,inetAddress,8899);
  11. datagramSocket.send(datagramPacket);
  12. } catch (IOException e) {
  13. e.printStackTrace();
  14. } finally {
  15. if(datagramSocket!=null){
  16. datagramSocket.close();
  17. }
  18. }
  19. }
  20. //服务器
  21. @Test
  22. public void server(){
  23. DatagramSocket datagramSocket = null;
  24. try {
  25. datagramSocket = new DatagramSocket(8899);
  26. byte[] bytes = new byte[20];
  27. InetAddress inetAddress = InetAddress.getLocalHost();
  28. DatagramPacket datagramPacket = new DatagramPacket(bytes,0,bytes.length);
  29. datagramSocket.receive(datagramPacket);
  30. System.out.println(new String(datagramPacket.getData()));
  31. } catch (IOException e) {
  32. e.printStackTrace();
  33. } finally {
  34. if(datagramSocket!=null){
  35. datagramSocket.close();
  36. }
  37. }
  38. }