TCP通信

第二十一章 网络通信

本章节主要讲解的是TCP和UDP两种通信方式它们都有着自己的优点和缺点  这两种通讯方式不通的地方就是TCP是一对一通信  UDP是一对多的通信方式  接下来会一一讲解

8a996695c59941fb9f652e11c6b2d6b0.png

TCP通信

TCP通信方式呢  主要的通讯方式是一对一的通讯方式,也有着优点和缺点  它的优点对比于UDP来说就是可靠一点  因为它的通讯方式是需要先发送消息 看看客户端是否能够接收到消息 如果没有回复消息的话 服务端  就不会发出文件 等待客户端回复消息,这个握手模式的话  就会非常可靠  以下代码进行讲解:

客户端代码:

 
  1. package tcp;

  2.  
  3. import java.io.*;

  4. import java.net.Socket;

  5. import java.util.Scanner;

  6.  
  7. /**

  8. * Socket客户端

  9. **/

  10. public class SocketClient {

  11. public static void main(String[] args) {

  12. Socket s = null;

  13. try {

  14. // 与ip为127.0.0.1、端口为12345的服务端建立连接

  15. s = new Socket("127.0.0.1", 12345);

  16.  
  17. // 创建输入流接收服务端发送的消息(字节流)

  18. InputStream is = s.getInputStream();

  19. // 将服务端返回的字节流转化为字符流

  20. InputStreamReader isr = new InputStreamReader(is);

  21. // 创建字符流读取缓冲区,方便每行读取

  22. BufferedReader br = new BufferedReader(isr);

  23.  
  24. // 创建输出流返回消息

  25. OutputStream os = s.getOutputStream();

  26. // 创建输出流缓冲

  27. PrintWriter pw = new PrintWriter(os);

  28.  
  29. // 创建发送消息的线程

  30. Runnable rOut = () -> {

  31. boolean flag = true;

  32. while (flag) {

  33. try {

  34. // 接收控制台输入

  35. Scanner scan = new Scanner(System.in);

  36. String msg = scan.nextLine();

  37. // 将输入写入缓冲

  38. pw.println(msg);

  39. // 将缓冲内的数据推送至服务端并清空缓冲区

  40. pw.flush();

  41. } catch (Exception e) {

  42. flag = false;

  43. e.printStackTrace();

  44. }

  45. }

  46. };

  47.  
  48. // 创建接收消息的线程

  49. Runnable rIn = () -> {

  50. boolean flag = true;

  51. while (flag) {

  52. try {

  53. // 逐行读取服务端返回的消息并打印

  54. String str = br.readLine();

  55. System.out.println("服务端的消息:" + str);

  56. } catch (IOException e) {

  57. flag = false;

  58. e.printStackTrace();

  59. }

  60. }

  61. };

  62.  
  63. // 启动两个线程

  64. Thread tOut = new Thread(rOut);

  65. Thread tIn = new Thread(rIn);

  66. tOut.start();

  67. tIn.start();

  68. }catch (IOException e) {

  69. try {

  70. // 释放资源

  71. s.close();

  72. } catch (Exception exception) {

  73. exception.printStackTrace();

  74. }

  75. e.printStackTrace();

  76. }

  77. }

  78. }

服务端代码:

 
  1. package tcp;

  2. import java.io.*;

  3. import java.net.ServerSocket;

  4. import java.net.Socket;

  5. import java.util.Scanner;

  6.  
  7. /**

  8. * Socket服务端

  9. **/

  10. public class SocketServer {

  11. public static void main(String[] args) {

  12. ServerSocket ss = null;

  13. Socket s = null;

  14. try {

  15. // 创建监听端口为12345的Socket服务端

  16. ss = new ServerSocket(12345);

  17. System.out.println("服务端Socket服务已建立,等待客户端连接...");

  18. // 通过ss.accept()开始持续监听12345端口,当有连接时获取收到的包装成Socket的客户端对象

  19. s = ss.accept();

  20. // 获取客户端的IP地址和端口号

  21. String ip = s.getInetAddress().getHostAddress();

  22. int port = s.getPort();

  23. System.out.println("服务端与 " + ip + ":" + port + " 已建立连接");

  24.  
  25. // 创建输入流接收客户端发送的消息(字节流)

  26. InputStream is = s.getInputStream();

  27. // 将客户端发送的字节流转化为字符流

  28. InputStreamReader isr = new InputStreamReader(is);

  29. // 创建字符流读取缓冲区,方便每行读取

  30. BufferedReader br = new BufferedReader(isr);

  31.  
  32. // 创建输出流返回消息

  33. OutputStream os = s.getOutputStream();

  34. // 创建输出流缓冲

  35. PrintWriter pw = new PrintWriter(os);

  36.  
  37. // 创建接受信息的线程

  38. Runnable rIn = () -> {

  39. boolean flag = true;

  40. while (flag) {

  41. try {

  42. // 逐行读取客户端发送的消息并打印

  43. String str = br.readLine();

  44. System.out.println("客户端的消息:" + str);

  45. } catch (IOException e) {

  46. flag = false;

  47. e.printStackTrace();

  48. }

  49. }

  50. };

  51.  
  52. // 创建发送消息的线程

  53. Runnable rOut = () -> {

  54. boolean flag = true;

  55. while (flag) {

  56. try {

  57. // 接收控制台输入

  58. Scanner scan = new Scanner(System.in);

  59. String msg = scan.nextLine();

  60. // 将输入写入缓冲

  61. pw.println(msg);

  62. // 将缓冲内的数据推送至客户端并清空缓冲区

  63. pw.flush();

  64. } catch (Exception e) {

  65. flag = false;

  66. e.printStackTrace();

  67. }

  68. }

  69. };

  70.  
  71. // 开启两个线程

  72. Thread tIn = new Thread(rIn);

  73. Thread tOut = new Thread(rOut);

  74. tIn.start();

  75. tOut.start();

  76. } catch (IOException e) {

  77. try {

  78. // 释放资源

  79. ss.close();

  80. s.close();

  81. } catch (Exception exception) {

  82. exception.printStackTrace();

  83. }

  84. e.printStackTrace();

  85. }

  86. }

  87. }

服务端代码图已经客户端的代码图:

7a40ff7afd7a4db7b8f54456e428f240.png

 4a36eea0dd024e2c91fc1873be87455b.png

运行结果图如下所示:

 e4a12583c30549789236fe4e8530e8b0.png

缺点也从而发现 TCP程序是一对一的通信而如果碰到了需要发通知给好几个的话 这样的话需要重复这些操作这样就会很麻烦  所以这里就需要使用到UDP通信 一对多来通信 下一个博客将会讲解UDP一对多通信

 

你可能感兴趣的:(java)