• Java筑基33-网络编程01-TCP网络编程&Socket


    目录

    一、网络相关概念

    二、IP地址

    三、域名和端口

    四、网络协议

    五、 tcp和udp

    六、Java_InetAddress

    七、Socket

    八、tcp字节流编程

    1.应用案例01(单向通信)

    2.应用案例02(字节流双向通信)

    3.应用案例03(字符流双向通信)

    4.应用案例04(网络上传文件)


    一、网络相关概念

    二、IP地址

    0c0830819f18985208a3a4a832f287b1.png

    三、域名和端口

    bc34c3d4531e8dd65523422a9bf4d588.png

    四、网络协议

    6714720e28ba49b485fa6b457b8b9a6a.png

    2ca8fd9e9849b2c80abcf02972588061.png

    五、 tcp和udp

    e596b5eb266b5303b9070aa1a1c784a1.png

    六、Java_InetAddress

    1. package com.feiyang.basic16_net;
    2. import java.net.InetAddress;
    3. import java.net.UnknownHostException;
    4. /**
    5. * @author:飞扬
    6. * @公众hao:程序员飞扬
    7. * @description:InetAddress类API
    8. */
    9. public class InetAddress_ {
    10. public static void main(String[] args) throws UnknownHostException {
    11. //获取本机的InetAddress对象
    12. InetAddress localHost = InetAddress.getLocalHost();
    13. System.out.println("本机地址=" + localHost);//LAPTOP-VLF7OM29/192.168.191.1
    14. //根据主机名获取InetAddress对象
    15. InetAddress host1 = InetAddress.getByName("LAPTOP-VLF7OM29");
    16. System.out.println("host1=" + host1);//LAPTOP-VLF7OM29/192.168.0.102
    17. //根据域名返回InetAddress
    18. InetAddress host2 = InetAddress.getByName("www.baidu.com");
    19. System.out.println("host2=" + host2);//www.baidu.com/180.101.49.11
    20. //根据InetAddress对象获取主机地址(即IP)
    21. String hostAddress = host2.getHostAddress();
    22. System.out.println("host2对应IP=" + hostAddress);
    23. String hostName = host2.getHostName();
    24. System.out.println("host2对应主机名/域名=" + hostName);
    25. }
    26. }

    打印输出:

    本机地址=LAPTOP-VLF7OM29/192.168.0.102

    host1=LAPTOP-VLF7OM29/192.168.0.102

    host2=www.baidu.com/180.101.49.12

    host2对应IP=180.101.49.12

    host2对应主机名/域名=www.baidu.com

    七、Socket

    383ba9429e2d91f8648b8deabdb9f619.png

    八、tcp字节流编程

    1.应用案例01(单向通信)

    思路分析:

    1. package com.feiyang.basic16_net;
    2. import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
    3. import java.io.BufferedReader;
    4. import java.io.IOException;
    5. import java.io.InputStream;
    6. import java.io.InputStreamReader;
    7. import java.io.OutputStream;
    8. import java.io.OutputStreamWriter;
    9. import java.net.ServerSocket;
    10. import java.net.Socket;
    11. /**
    12. * @author:飞扬
    13. * @公众hao:程序员飞扬
    14. * @description: socke通信,服务端
    15. */
    16. public class SocketTCP01Server {
    17. public static void main(String[] args) throws IOException {
    18. //1.在本机9999端口监听
    19. ServerSocket serverSocket = new ServerSocket(9999);
    20. System.out.println("服务端在9999端口监听...");
    21. //2.当没有连接时,程序会阻塞,等待连接,如果有客户端连接,则会返回socket对象,程序继续
    22. Socket socket = serverSocket.accept();
    23. System.out.println("服务端socket=" + socket.getClass());
    24. //3.读取数据
    25. InputStream inputStream = socket.getInputStream();
    26. /*byte[] buf = new byte[1024];
    27. int readLen = 0;
    28. while((readLen=inputStream.read()) != -1){
    29. System.out.println(new String(buf,0,readLen));
    30. }*/
    31. //方式2:如果读取乱码,使用转换流读取
    32. InputStreamReader isr = new InputStreamReader(inputStream, "utf-8");
    33. BufferedReader bufferedReader = new BufferedReader(isr);
    34. String s = bufferedReader.readLine();
    35. System.out.println("服务端接收=" + s);
    36. //4.关闭流
    37. inputStream.close();
    38. socket.close();
    39. serverSocket.close();
    40. }
    41. }
    1. package com.feiyang.basic16_net;
    2. import java.io.IOException;
    3. import java.io.OutputStream;
    4. import java.net.InetAddress;
    5. import java.net.Socket;
    6. /**
    7. * @author:飞扬
    8. * @公众hao:程序员飞扬
    9. * @description: socke通信,客户端
    10. */
    11. public class SocketTCP01Client {
    12. public static void main(String[] args) throws IOException {
    13. //1.连接服务端(IP,端口)
    14. Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
    15. System.out.println("客户端socket=" + socket.getClass());
    16. //2.连接上之后会返回一个socket对象,得到和socket关联的输出流对象
    17. OutputStream outputStream = socket.getOutputStream();
    18. //3.写数据
    19. outputStream.write("hello,server".getBytes());
    20. System.out.println("客户端写数据。。。");
    21. //4.关闭io流,关闭socket连接
    22. outputStream.close();
    23. socket.close();
    24. System.out.println("客户端退出。");
    25. }
    26. }

    运行结果:

    2.应用案例02(字节流双向通信)

    2b84c64c5ca1159c411f5458454d5dda.png

    1. package com.feiyang.basic16_net;
    2. import java.io.BufferedReader;
    3. import java.io.IOException;
    4. import java.io.InputStream;
    5. import java.io.InputStreamReader;
    6. import java.io.OutputStream;
    7. import java.net.ServerSocket;
    8. import java.net.Socket;
    9. /**
    10. * @author:飞扬
    11. * @公众hao:程序员飞扬
    12. * @description: socke双向通信,服务端
    13. */
    14. public class SocketTCP02Server {
    15. public static void main(String[] args) throws IOException {
    16. //1.在本机9999端口监听
    17. ServerSocket serverSocket = new ServerSocket(9999);
    18. System.out.println("服务端在9999端口监听...");
    19. //2.当没有连接时,程序会阻塞,等待连接,如果有客户端连接,则会返回socket对象,程序继续
    20. Socket socket = serverSocket.accept();
    21. System.out.println("服务端socket=" + socket.getClass());
    22. //3.读取数据
    23. InputStream inputStream = socket.getInputStream();
    24. /*byte[] buf = new byte[1024];
    25. int readLen = 0;
    26. while((readLen=inputStream.read()) != -1){
    27. System.out.println(new String(buf,0,readLen));
    28. }*/
    29. //方式2:如果读取乱码,使用转换流读取
    30. InputStreamReader isr = new InputStreamReader(inputStream, "utf-8");
    31. BufferedReader bufferedReader = new BufferedReader(isr);
    32. String s = bufferedReader.readLine();
    33. System.out.println("服务端接收=" + s);
    34. //服务端发送消息
    35. OutputStream outputStream = socket.getOutputStream();
    36. outputStream.write("hello,client".getBytes());
    37. socket.shutdownOutput(); //输出结束标记
    38. //4.关闭流
    39. inputStream.close();
    40. socket.close();
    41. serverSocket.close();
    42. System.out.println("服务端退出。");
    43. }
    44. }

    1. package com.feiyang.basic16_net;
    2. import java.io.BufferedReader;
    3. import java.io.IOException;
    4. import java.io.InputStream;
    5. import java.io.InputStreamReader;
    6. import java.io.OutputStream;
    7. import java.net.InetAddress;
    8. import java.net.Socket;
    9. /**
    10. * @author:飞扬
    11. * @公众hao:程序员飞扬
    12. * @description: socke双向通信,客户端
    13. */
    14. public class SocketTCP02Client {
    15. public static void main(String[] args) throws IOException {
    16. //1.连接服务端(IP,端口)
    17. Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
    18. System.out.println("客户端socket=" + socket.getClass());
    19. //2.连接上之后会返回一个socket对象,得到和socket关联的输出流对象
    20. OutputStream outputStream = socket.getOutputStream();
    21. //3.写数据
    22. outputStream.write("hello,server".getBytes());
    23. System.out.println("客户端写数据。。。");
    24. socket.shutdownOutput();//输出结束标记
    25. //接收数据
    26. InputStream inputStream = socket.getInputStream();
    27. InputStreamReader isr = new InputStreamReader(inputStream, "utf-8");
    28. BufferedReader bufferedReader = new BufferedReader(isr);
    29. String s = bufferedReader.readLine();
    30. System.out.println("客户端接收=" + s);
    31. //4.关闭io流,关闭socket连接
    32. outputStream.close();
    33. socket.close();
    34. System.out.println("客户端退出。");
    35. }
    36. }

    运行结果:

    3.应用案例03(字符流双向通信)

     
    
    1. package com.feiyang.basic16_net;
    2. import java.io.BufferedReader;
    3. import java.io.BufferedWriter;
    4. import java.io.IOException;
    5. import java.io.InputStream;
    6. import java.io.InputStreamReader;
    7. import java.io.OutputStream;
    8. import java.io.OutputStreamWriter;
    9. import java.net.ServerSocket;
    10. import java.net.Socket;
    11. /**
    12. * @author:飞扬
    13. * @公众hao:程序员飞扬
    14. * @description: socke通信,字符流,服务端
    15. */
    16. public class SocketTCP03Server {
    17. public static void main(String[] args) throws IOException {
    18. //1.在本机9999端口监听
    19. ServerSocket serverSocket = new ServerSocket(9999);
    20. System.out.println("服务端在9999端口监听...");
    21. //2.当没有连接时,程序会阻塞,等待连接,如果有客户端连接,则会返回socket对象,程序继续
    22. Socket socket = serverSocket.accept();
    23. System.out.println("服务端socket=" + socket.getClass());
    24. //3.读取数据
    25. InputStream inputStream = socket.getInputStream();
    26. BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
    27. String s = bufferedReader.readLine();
    28. System.out.println("服务端接收=" + s);
    29. //服务端发送消息
    30. OutputStream outputStream = socket.getOutputStream();
    31. BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
    32. bufferedWriter.write("hello,client,字符流");
    33. bufferedWriter.newLine();
    34. bufferedWriter.flush();
    35. //4.关闭流
    36. bufferedReader.close();
    37. bufferedWriter.close();
    38. socket.close();
    39. serverSocket.close();
    40. System.out.println("服务端退出。");
    41. }
    42. }
    1. package com.feiyang.basic16_net;
    2. import java.io.BufferedReader;
    3. import java.io.BufferedWriter;
    4. import java.io.IOException;
    5. import java.io.InputStream;
    6. import java.io.InputStreamReader;
    7. import java.io.OutputStream;
    8. import java.io.OutputStreamWriter;
    9. import java.net.InetAddress;
    10. import java.net.Socket;
    11. /**
    12. * @author:飞扬
    13. * @公众hao:程序员飞扬
    14. * @description: socke通信,字符流,客户端
    15. */
    16. public class SocketTCP03Client {
    17. public static void main(String[] args) throws IOException {
    18. //1.连接服务端(IP,端口)
    19. Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
    20. System.out.println("客户端socket=" + socket.getClass());
    21. //2.连接上之后会返回一个socket对象,得到和socket关联的输出流对象
    22. OutputStream outputStream = socket.getOutputStream();
    23. //3.写数据
    24. BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
    25. bufferedWriter.write("hello,server,字符流");
    26. bufferedWriter.newLine();
    27. bufferedWriter.flush();
    28. //接收数据
    29. InputStream inputStream = socket.getInputStream();
    30. BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
    31. String s = bufferedReader.readLine();
    32. System.out.println("客户端接收=" + s);
    33. //4.关闭io流,关闭socket连接
    34. bufferedReader.close();
    35. bufferedWriter.close();
    36. socket.close();
    37. System.out.println("客户端退出。");
    38. }
    39. }

    e1376a6e5aebf7e51369011b605c57d5.png

    4.应用案例04(网络上传文件)

    cb6aa7ff43dfd65870c831dbcecb2711.png

    思路分析:

    1. package com.feiyang.basic16_net;
    2. import java.io.BufferedReader;
    3. import java.io.ByteArrayOutputStream;
    4. import java.io.IOException;
    5. import java.io.InputStream;
    6. import java.io.InputStreamReader;
    7. /**
    8. * @author:飞扬
    9. * @公众hao:程序员飞扬
    10. * @description:
    11. */
    12. public class StreamUtils {
    13. /**
    14. * stream流转换成字节数组
    15. * @param is
    16. * @return
    17. * @throws IOException
    18. */
    19. public static byte[] streamtoByteArray(InputStream is) throws IOException {
    20. ByteArrayOutputStream bos = new ByteArrayOutputStream();
    21. byte[] b = new byte[1024];
    22. int len;
    23. while((len=is.read(b)) != -1){
    24. bos.write(b,0,len);
    25. }
    26. byte[] array = bos.toByteArray();
    27. bos.close();
    28. return array;
    29. }
    1. /**
    2. * 将stream转换成String
    3. * @param is
    4. * @return
    5. * @throws IOException
    6. */
    7. public static String streamToString(InputStream is) throws IOException {
    8. BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is));
    9. StringBuilder stringBuilder = new StringBuilder();
    10. String line;
    11. while((line = bufferedReader.readLine()) != null){
    12. stringBuilder.append(line + "\r\n");
    13. }
    14. return stringBuilder.toString();
    15. }
    16. }

    1. package com.feiyang.basic16_net;
    2. import java.io.BufferedInputStream;
    3. import java.io.BufferedOutputStream;
    4. import java.io.BufferedWriter;
    5. import java.io.FileOutputStream;
    6. import java.io.IOException;
    7. import java.io.OutputStreamWriter;
    8. import java.net.ServerSocket;
    9. import java.net.Socket;
    10. /**
    11. * @author:飞扬
    12. * @公众hao:程序员飞扬
    13. * @description:
    14. */
    15. public class TCPFileUploadServer {
    16. public static void main(String[] args) throws IOException {
    17. ServerSocket serverSocket = new ServerSocket(8888);
    18. Socket socket = serverSocket.accept();
    19. BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
    20. byte[] bytes = StreamUtils.streamtoByteArray(bis);
    21. String destPath = "src\\bbb.png";
    22. BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destPath));
    23. bos.write(bytes);
    24. System.out.println("服务端,写入完毕");
    25. bos.close();
    26. BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    27. writer.write("服务端收到图片");
    28. System.out.println("服务端:服务端收到图片");
    29. writer.flush();
    30. socket.shutdownOutput();
    31. bis.close();
    32. socket.close();
    33. serverSocket.close();
    34. }
    35. }

    1. package com.feiyang.basic16_net;
    2. import java.io.BufferedInputStream;
    3. import java.io.BufferedOutputStream;
    4. import java.io.BufferedReader;
    5. import java.io.BufferedWriter;
    6. import java.io.ByteArrayOutputStream;
    7. import java.io.FileInputStream;
    8. import java.io.IOException;
    9. import java.io.InputStream;
    10. import java.io.InputStreamReader;
    11. import java.io.OutputStreamWriter;
    12. import java.net.InetAddress;
    13. import java.net.Socket;
    14. import java.net.UnknownHostException;
    15. /**
    16. * @author:飞扬
    17. * @公众hao:程序员飞扬
    18. * @description:
    19. */
    20. public class TCPFileUploadClient {
    21. public static void main(String[] args) throws IOException {
    22. Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
    23. String file = "d:\\bbb.png";
    24. BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
    25. byte[] bytes = StreamUtils.streamtoByteArray(bis);
    26. BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
    27. bos.write(bytes);
    28. bis.close();
    29. socket.shutdownOutput();
    30. String s = StreamUtils.streamToString(socket.getInputStream());
    31. System.out.println("客户端:" + s);
    32. bos.close();
    33. socket.close();
    34. }
    35. }

    运行结果:

  • 相关阅读:
    采用sFlow工具实现流量监控--实验
    重磅发布 | 更快、更强的 .NET 7
    【制作数字人】零门槛通过三维重建技术生成个人三维模型
    泰森多边形
    VS Code 常用快捷键
    数据密集型应用存储与检索设计
    ✔ ★【备战实习(面经+项目+算法)】 10.16学习时间表(总计学习时间:5h)
    关于安卓SVGA浅尝(二)加载数据
    visual studio code配置anaconda3的python虚拟环境
    aqs源码分析
  • 原文地址:https://blog.csdn.net/lu_xin5056/article/details/127135539