网络编程 p4 TCP编程

打印 上一主题 下一主题

主题 539|帖子 539|积分 1617

TCP编程


  • 基本介绍

    • 基于客户端——服务端的网络通信;
    • 底层使用的是TCP/IP协议;
    • 应用场景举例:客户端发送数据,服务端接收并显示在控制台;
    • 基于Socket的TCP编程;

  • 示意图


  • netstat指令

    • netstat -an可以查看当前主机网络情况,包括端口监听情况和网络连接情况;
    • netstat -an|more可以分页显示;
    • 要求在dos控制台下执行 (win+r)
      说明:

      • Listening 表示某个端口在监听;
      • 如果有一个外部程序(客户端)连接到该端口,就会显示一条连接信息;



  • 注意事项

    • 当客户端连接到服务端后,实际上客户端也是通过一个端口和服务端进行通讯的,这端口是TCP/IP来分配的,是随机的;


  • 应用案例


    • 客户端
      1. package com.hspedu.socket;
      2. import java.io.*;
      3. import java.net.InetAddress;
      4. import java.net.Socket;
      5. /**
      6. * @author: 86199
      7. * @date: 2023/5/15 15:18
      8. * @description: 字符流
      9. */
      10. public class SocketTCP03Client {
      11.     public static void main(String[] args) throws IOException {
      12.         //思路
      13.         //1. 连接服务端(ip,端口)
      14.         //解读:连接本机的 9999 端口,如果连接成功,返回Socket对象
      15.         Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
      16.         System.out.println("客户端 socket返回 = " + socket.getClass());
      17.         //2. 连接上后,生成Socket,通过socket.getOutputStream()
      18.         //  得到和socket对象关联的输出流对象
      19.         BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
      20.         //3. 通过输出流,写入数据到 数据通道
      21.         bufferedWriter.write("hello, server");
      22.         bufferedWriter.newLine();//写入一个换行符,表示写入内容结束,要求对方使用readLine的方式来读
      23.         bufferedWriter.flush();//如果使用的字符流,需要手动刷新否则数据不会写入数据通道
      24.         //4. 通过socket.个体InputStream()读取客户端写入到数据通道的数据,显示
      25.         BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
      26.         String s = bufferedReader.readLine();
      27.         System.out.println(s);
      28.         //5. 关闭流对象和socket,必须关闭
      29.         bufferedReader.close();
      30.         bufferedWriter.close();
      31.         socket.close();
      32.     }
      33. }
      复制代码
    • 服务端
      1. package com.hspedu.socket;
      2. import java.io.*;
      3. import java.net.ServerSocket;
      4. import java.net.Socket;
      5. /**
      6. * @author: 86199
      7. * @date: 2023/5/15 15:18
      8. * @description: 字符流
      9. */
      10. public class SocketTCP03Server {
      11.     public static void main(String[] args) throws IOException {
      12.         //思路
      13.         //1. 在本机的9999端口监听,等待连接
      14.         //   细节:要求本机没有其他服务在监听9999
      15.         //   这个 ServerSocket 可以通过accept() 返回多个Socket[多个客户端连接服务器的并发]
      16.         ServerSocket serverSocket = new ServerSocket(9999);
      17.         System.out.println("服务端,在9999端口监听,等待连接...");
      18.         //2. 当没有客户端连接9999端口时程序会阻塞,等待连接
      19.         //   如果有客户端连接,则会返回Socket对象,程序继续
      20.         Socket accept = serverSocket.accept();
      21.         System.out.println("服务端 socket = " + accept.getClass());
      22.         //3. 通过socket.个体InputStream()读取客户端写入到数据通道的数据,显示
      23.         BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(accept.getInputStream()));//读不到内容会阻塞
      24. //4. IO读取
      25.         String s = bufferedReader.readLine();
      26.         System.out.println(s);
      27.         //5. 通过输出流,写入数据到 数据通道
      28.         BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));
      29.         bufferedWriter.write("hello, client");
      30.         bufferedWriter.newLine();//写入一个换行符,表示写入内容结束,要求对方使用readLine的方式来读
      31.         bufferedWriter.flush();//如果使用的字符流,需要手动刷新否则数据不会写入数据通道
      32.         //设置结束标记
      33.         //6. 关闭流对象和socket,必须关闭
      34.         bufferedWriter.close();
      35.         bufferedReader.close();
      36.         accept.close();
      37.         serverSocket.close();
      38.     }
      39. }
      复制代码


    • StreamUtils类
      1. package com.hspedu.upload;
      2. import java.io.BufferedReader;
      3. import java.io.ByteArrayOutputStream;
      4. import java.io.InputStream;
      5. import java.io.InputStreamReader;
      6. /**
      7. * @author: 86199
      8. * @date: 2023/5/16 14:57
      9. * @description: 工具类
      10. */
      11. public class StreamUtils {
      12.     public static byte[] streamToByteArray(InputStream is) throws Exception {
      13.         // 创建输出流对象
      14.         ByteArrayOutputStream bos = new ByteArrayOutputStream();
      15.         // 字节数组
      16.         byte[] b = new byte[1024];
      17.         int len;
      18.         while ((len = is.read(b)) != -1) {
      19.             // 循环读取
      20.             // 把读取到的数据,写入 bos
      21.             bos.write(b, 0, len);
      22.         }
      23.         byte[] array = bos.toByteArray();
      24.         bos.close();
      25.         return array;
      26.     }
      27.     public static String streamToString(InputStream is) throws Exception {
      28.         BufferedReader reader = new BufferedReader(new InputStreamReader(is));
      29.         StringBuilder builder = new StringBuilder();
      30.         String line;
      31.         while ((line = reader.readLine()) != null) {
      32.             builder.append(line + "\r\n");
      33.         }
      34.         return builder.toString();
      35.     }
      36. }
      复制代码
    • 服务端
      1. package com.hspedu.upload;
      2. import java.io.*;
      3. import java.net.ServerSocket;
      4. import java.net.Socket;
      5. /**
      6. * @author: 86199
      7. * @date: 2023/5/15 16:24
      8. * @description:
      9. */
      10. public class TCPFileUploadServer {
      11.     public static void main(String[] args) throws Exception {
      12.         ServerSocket serverSocket = new ServerSocket(8888);
      13.         System.out.println("服务端在8888等待连接......");
      14.         Socket accept = serverSocket.accept();
      15.         String filePath = "D:\\program\\javaProject\\Idea_Java_Project\\chapter21\\src\\copy.jpg";
      16.         BufferedInputStream bis = new BufferedInputStream(accept.getInputStream());
      17.         BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath));
      18.         byte[] bytes = StreamUtils.streamToByteArray(bis);
      19.         bos.write(bytes);
      20.         bos.close();
      21.         //向客户端回复“收到图片”
      22.         BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));
      23.         bufferedWriter.write("收到图片");
      24.         bufferedWriter.flush();
      25.         accept.shutdownOutput();
      26.         //关闭流和socket
      27.         bis.close();
      28.         accept.close();
      29.         serverSocket.close();
      30.     }
      31. }
      复制代码
    • 客户端
      1. package com.hspedu.upload;
      2. import java.io.*;
      3. import java.net.InetAddress;
      4. import java.net.Socket;
      5. /**
      6. * @author: 86199
      7. * @date: 2023/5/15 16:24
      8. * @description:
      9. */
      10. public class TCPFileUploadClient {
      11.     public static void main(String[] args) throws Exception {
      12.         Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
      13.         String filePath = "e:\\qie.jpg";
      14.         BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
      15.         BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath));
      16.         byte[] bytes = StreamUtils.streamToByteArray(bis);
      17.         bos.write(bytes);
      18.         bos.flush();
      19.         //没有手动调用flush方法,也没有调用close方法关闭流,数据复制失败,
      20.         //因为数据还在内部缓冲区,并没有输出 (因为内部缓冲区没有被放满,不调用flush方法,不会输出)
      21.         bis.close();
      22.         socket.shutdownOutput();
      23.         //接收消息
      24.         InputStream inputStream = socket.getInputStream();
      25.         String s = StreamUtils.streamToString(inputStream);
      26.         System.out.println(s);
      27.         //关闭流和socket
      28.         inputStream.close();
      29.         bos.close();
      30.         socket.close();
      31.     }
      32. }
      复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

光之使者

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表