• 00107_TCP通信


    1、TCP通信的概述

      (1)TCP通信同UDP通信一样,都能实现两台计算机之间的通信,通信的两端都需要创建socket对象;

      (2)区别在于:

        ①UDP中只有发送端和接收端,不区分客户端与服务器端,计算机之间可以任意地发送数据;

        ②TCP通信是严格区分客户端与服务器端的。

      (3)在通信时,必须先由客户端去连接服务器端才能实现通信,服务器端不可以主动连接客户端,并且服务器端程序需要事先启动,等待客户端的连接;

      (4)在JDK中提供了两个类用于实现TCP程序,一个是ServerSocket类,用于表示服务器端,一个是Socket类,用于表示客户端;  

      (5)通信时,首先创建代表服务器端的ServerSocket对象,该对象相当于开启一个服务,并等待客户端的连接,然后创建代表客户端的Socket对象向服务器端发出连接请求,服务器端响应请求,两者建立连接开始通信

    2、ServerSocket

      (1)ServerSocket对象负责监听某台计算机的某个端口号,在创建ServerSocket对象后,需要继续调用该对象的accept()方法,接收来自客户端的请求;

      (2)当执行了accept()方法之后,服务器端程序会发生阻塞,直到客户端发出连接请求,accept()方法才会返回一个Scoket对象用于和客户端实现通信,程序才能继续向下执行。

    3、Socket

      (1)JDK提供了一个Socket类,用于实现TCP客户端程序;

      (2)在Socket类的常用方法中,getInputStream()和getOutStream()方法分别用于获取输入流和输出流。当客户端和服务端建立连接后,数据是以IO流的形式进行交互的,从而实现通信。

    4、简单的TCP网络程序

      (1)首先需要实现服务器端程序

     1 import java.io.IOException;
     2 import java.io.OutputStream;
     3 import java.net.ServerSocket;
     4 import java.net.Socket;
     5 
     6 /*
     7  * TCP 服务器端
     8  * 
     9  * 1,创建服务器ServerSocket对象(指定服务器端口号)
    10  * 2,开启服务器了,等待客户端的连接,当客户端连接后,可以获取到连接服务器的客户端Socket对象
    11  * 3,给客户端反馈信息
    12  * 4,关闭流资源
    13  */
    14 public class TCPServer {
    15     public static void main(String[] args) throws IOException {
    16         // 1,创建服务器ServerSocket对象(指定服务器端口号)
    17         ServerSocket ss = new ServerSocket(8888);
    18         // 2,开启服务器了,等待客户端的连接,当客户端连接后,可以获取到连接服务器的客户端Socket对象
    19         Socket s = ss.accept();
    20         // 3,给客户端反馈信息
    21         /*
    22          * a,获取客户端的输出流 b,在服务端端,通过客户端的输出流写数据给客户端
    23          */
    24         // a,获取客户端的输出流
    25         OutputStream out = s.getOutputStream();
    26         // b,在服务端端,通过客户端的输出流写数据给客户端
    27         out.write("你已经连接上了服务器".getBytes());
    28         // 4,关闭流资源
    29         out.close();
    30         s.close();
    31         // ss.close(); 服务器流 通常都是不关闭的
    32     }
    33 }

      (2)完成了服务器端程序的编写,接下来编写客户端程序

     1 import java.io.IOException;
     2 import java.io.InputStream;
     3 import java.net.Socket;
     4 
     5 /*
     6  * TCP 客户端
     7  * 
     8  * 1,创建客户端Socket对象,(指定要连接的服务器地址与端口号)
     9  * 2,获取服务器端的反馈回来的信息
    10  * 3,关闭流资源
    11  */
    12 public class TCPClient {
    13     public static void main(String[] args) throws IOException {
    14         // 1,创建客户端Socket对象,(指定要连接的服务器地址与端口号)
    15         Socket s = new Socket("192.168.0.4", 8888);
    16         // 2,获取服务器端的反馈回来的信息
    17         InputStream in = s.getInputStream();
    18         // 获取获取流中的数据
    19         byte[] buffer = new byte[1024];
    20         // 把流中的数据存储到数组中,并记录读取字节的个数
    21         int length = in.read(buffer);
    22         // 显示数据
    23         System.out.println(new String(buffer, 0, length));
    24         // 3,关闭流资源
    25         in.close();
    26         s.close();
    27     }
    28 }

      运行结果:

      

    5、文件上传

      (1)目前大多数服务器都会提供文件上传的功能,由于文件上传需要数据的安全性和完整性,很明显需要使用TCP协议来实现;

      (2)首先编写服务器端程序,用来接收图片

     1 import java.io.BufferedOutputStream;
     2 import java.io.FileOutputStream;
     3 import java.io.IOException;
     4 import java.io.InputStream;
     5 import java.io.OutputStream;
     6 import java.net.InetAddress;
     7 import java.net.ServerSocket;
     8 import java.net.Socket;
     9 
    10 /*
    11  * 文件上传  服务器端
    12  *
    13  */
    14 public class TCPServer {
    15     public static void main(String[] args) throws IOException {
    16         // 1,创建服务器,等待客户端连接
    17         ServerSocket serverSocket = new ServerSocket(8888);
    18         Socket clientSocket = serverSocket.accept();
    19         // 显示哪个客户端Socket连接上了服务器
    20         InetAddress ipObject = clientSocket.getInetAddress();// 得到IP地址对象
    21         String ip = ipObject.getHostAddress(); // 得到IP地址字符串
    22         System.out.println("测试已连接" + "IP:" + ip);
    23 
    24         // 7,获取Socket的输入流
    25         InputStream in = clientSocket.getInputStream();
    26         // 8,创建目的地的字节输出流 D:\upload\192.168.0.4(1).jpg
    27         BufferedOutputStream fileOut = new BufferedOutputStream(
    28                 new FileOutputStream("D:\upload\192.168.0.4(1).png"));
    29         // 9,把Socket输入流中的数据,写入目的地的字节输出流中
    30         byte[] buffer = new byte[1024];
    31         int len = -1;
    32         while ((len = in.read(buffer)) != -1) {
    33             // 写入目的地的字节输出流中
    34             fileOut.write(buffer, 0, len);
    35         }
    36 
    37         // -----------------反馈信息---------------------
    38         // 10,获取Socket的输出流, 作用:写反馈信息给客户端
    39         OutputStream out = clientSocket.getOutputStream();
    40         // 11,写反馈信息给客户端
    41         out.write("图片上传成功".getBytes());
    42 
    43         out.close();
    44         fileOut.close();
    45         in.close();
    46         clientSocket.close();
    47         // serverSocket.close();
    48     }
    49 }

      (3)编写客户端,完成上传图片

     1 import java.io.BufferedInputStream;
     2 import java.io.FileInputStream;
     3 import java.io.IOException;
     4 import java.io.InputStream;
     5 import java.io.OutputStream;
     6 import java.net.Socket;
     7 
     8 /*
     9  * 文件上传 客户端
    10  * 
    11  * public void shutdownOutput()  禁用此Socket的输出流,间接的相当于告知了服务器数据写入完毕
    12  */
    13 public class TCPClient {
    14     public static void main(String[] args) throws IOException {
    15         // 2,创建客户端Socket,连接服务器
    16         Socket socket = new Socket("192.168.0.4", 8888);
    17         // 3,获取Socket流中的输出流,功能:用来把数据写到服务器
    18         OutputStream out = socket.getOutputStream();
    19         // 4,创建字节输入流,功能:用来读取数据源(图片)的字节
    20         BufferedInputStream fileIn = new BufferedInputStream(
    21                 new FileInputStream("D:\Java\00Base\googlelogo.png"));
    22         // 5,把图片数据写到Socket的输出流中(把数据传给服务器)
    23         byte[] buffer = new byte[1024];
    24         int len = -1;
    25         while ((len = fileIn.read(buffer)) != -1) {
    26             // 把数据写到Socket的输出流中
    27             out.write(buffer, 0, len);
    28         }
    29         // 6,客户端发送数据完毕,结束Socket输出流的写入操作,告知服务器端
    30         socket.shutdownOutput();
    31 
    32         // -----------------反馈信息---------------------
    33         // 12,获取Socket的输入流 作用: 读反馈信息
    34         InputStream in = socket.getInputStream();
    35         // 13,读反馈信息
    36         byte[] info = new byte[1024];
    37         // 把反馈信息存储到info数组中,并记录字节个数
    38         int length = in.read(info);
    39         // 显示反馈结果
    40         System.out.println(new String(info, 0, length));
    41 
    42         // 关闭流
    43         in.close();
    44         fileIn.close();
    45         out.close();
    46         socket.close();
    47     }
    48 }
  • 相关阅读:
    用代码关闭 overlay弹出层
    Asp.net CheckBoxList 多选提示
    C#获取拼音简码
    Discuz!NT的上传头像功能(Silverlight)
    在项目中使用 Discuz!NT的上传头像功能
    用户控件和href,src及其css路径问题
    截取html字符长度,并保留html格式标记
    SSSE3指令集水平加法指令饱和字节乘加指令以及字节重排指令
    SSE2指令集系列之二整数运算相关指令
    SSE指令集系列之二浮点与整数转换指令
  • 原文地址:https://www.cnblogs.com/gzdlh/p/8157179.html
Copyright © 2020-2023  润新知