• 黑马程序员_<<TCP>>


    ---------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! --------------------


    1. TCP/IP

         1.概述

               要建立连接,可以传输大量数据  通过三次握手玩成连接是可靠协议   必须建立连接,效率低,例如:下载,打电话

               步骤:Socket和ServerSocket

    简介:建立客户端和服务器端

             通过Socket中的IO流进行数据传输

             关闭socket

             同样,客户端和服务器端是两个独立的应用程序

         2.传输

               客户端(Socket)和服务器端(ServerSocket)

          客户端:在该对象创建的时候,就指定了主机地址,因为要先TCP必须要建立好连接,进行传输,或者使用connet方法来制定端口

     

         客户端对象里面封装了字节读取流和写入流。这样更方便发送和接受数据。不断是服务端还是客户端,只要是对其传输的数据进行访问,那么就在Socket对象中获取流。

    步骤:

    1.创建服务,指定连接的主机和端口

    2.获得输出流 然后输出数据

    3.关闭服务

    服务端:

    1建立服务端的服务,ServerSocket,绑定端口

    2获取连接过来的客户端对象 ServerSocket的accept方法。

    3客户端如果发过来数据,那么服务端要使用对应的客户端对象,然后客户端对象的读取流来读取发过来的数据,打印在控制台上

    4关闭服务端。

     

         3.单向发出和读取

              模拟客户端向服务端发数据,服务端读取客户端发送的数据后,然后输出。

               

     import java.io.OutputStream;
    import java.net.Socket;
    /**
     * 客户端
     * 1.定义服务端服务,指定目的地址和端口号
     * 2.获得写入流,然后发发送的数据,并且发出
     * 3.关闭客户端
     *
     */
    public class CilentTcp {
      public static void main(String[] args) throws Exception{
        /*创建了客户端服务,并且指定目的主机和端口号*/
        Socket client=new Socket("192.168.1.101",10005);
        /*获取输出流,用来发送数据*/
        OutputStream out=client.getOutputStream();
        out.write("hello world".getBytes());
        client.close();
      }
     
    }
     

     

    import java.io.InputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    /**
     * 服务端
     * 1.定义服务端,然后指定服务端口
     * 2.使用accept()方法获得客户端对象,然后获取读取流
     * 3.然后读取客户端发送的数据
     */
    public class ServerTcp {
      public static void main(String[] args) throws Exception {
        /* 创建了服务端,并且指定端口号 */
        ServerSocket server = new ServerSocket(10005);
        Socket socket = server.accept();// 获得了发送端对象
        InputStream in = socket.getInputStream();// 获得读取流,用来读取发送端发送过来的数据
        byte[] buf = new byte[1024];
        int r = in.read(buf);//读取
        System.out.println(new String(buf, 0, r));
      }
     
    }
     
    结果:
    hello world
    


    必须要先启动服务端,然后运行客户端,否则会连接失败

    2. 客户端和服务端互访

         客户端:

             步骤:

    1.建立Socket服务,并且指定要连接的主机和端口。

    2.获得Socket流中的输出流,将数据写到流中,通过网络发送给服务端

    3.获取Socket流中的输入流,将服务端反馈回来的数据获取到,并且打印

    4.关闭客户端资源

     

    mportjava.io.InputStream;
    importjava.io.OutputStream;
    import java.net.Socket;
    importjava.net.InetAddress;
    /**
     * 客戶端
     */
    public class ClientTcp {
          public static void main(String[]args) throws Exception {
               /*获得客户端服务*/
               Socketclient = new Socket("192.168.32.17", 25000);
               /*
                * 获得客户端流中的输出流,并且把数据写到流中,然后传给的服务端
                */
               OutputStreamout = client.getOutputStream();
               out.write("服务端,你在吗".getBytes());
               /**
                * 获得客户端总的输出流,然后或得服务端反馈回来的数据,并且打印
                */
               InputStreamin=client.getInputStream();
               byte [] buf=new byte[1024];
               int len=in.read(buf);
               System.out.println(newString(buf,0,len));
               client.close();
          }
     
    }
     


         服务端:

            步骤:

    1.建立ServerSocket服务,并且指定端口号。

    2.获得客户端服务对象,输出客户端的地址

    3.获得客户端的输入流,读取客户端发送的数据,并且打印。

    4.获得客户端的输出流,给客户端发送反馈信息。

    5.关闭服务端服务和客户端服务。

     

     

    import java.io.InputStream;
    importjava.io.OutputStream;
    importjava.net.ServerSocket;
    import java.net.Socket;
    /**
     * 服务端
     */
    public class ServerTcp {
          public static void main(String[]args) throws Exception {
               /* 创建了服务端,并且指定端口号 */
               ServerSocketserver = new ServerSocket(25000);
               Socketsocket =server.accept();// 获得了发送端对象
               System.out.println(socket.getLocalAddress()+"connectsuccess");
               /**
                * 或得客户端的输入流,读取客户端发送的数据,并且打印
                */
               InputStreamin = socket.getInputStream();// 获得读取流,用来读取发送端发送过来的数据
               byte[] buf = new byte[1024];
               int r = in.read(buf);// 读取
               System.out.println(new String(buf, 0,r));
               /**
                * 获得客户端的输出流,给客户端反馈信息
                */
               OutputStream  out=socket.getOutputStream();
               out.write("客户端,我在呢?要干嘛啊!!".getBytes());
               socket.close();
               server.close();
          }
    }


    accept()和read()方法都是阻塞方法。

    对于双方都通信的话,那么循环读取的话,用到IO读取,那么必须注意换行符,和刷新缓冲区。通常都是读取一行的话,那么要注意是否有换行符,newLine().

    3.  上传文件

          在网络传输文件

           客户端:

              步骤:1.定义服务端,同样也要指定目标地址和端口号。

                    2.定义对文件相应的流,读取文件。

                    3.获取客户端的输出流,和文件的读取交替读取和写入。

                    4.获得客户端的输入流,获取服务端反馈的信息。

                    

     package www.fuxi.wangluo;
     
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
    /**
     * 客户端
     * @author yang
     */
    public class TextClient {
      public static void main(String[] args) throws Exception{
                 Socket socket=new Socket("192.168.1.101",25001);
                 /**
                  * 获得文件的读取流,然后循环的读取文件
                  */
                 BufferedReader br=new BufferedReader(new FileReader("copy.txt"));
                 /**
                  * 获得服务端的输入流,用来把要复制的文件内容,输入到网络流中
                  */
                 PrintWriter pr=newPrintWriter(socket.getOutputStream(),true);//true代表自动刷新
                
                 String line=null;
                 while((line=br.readLine())!=null){
                   pr.println(line);//println有自动刷新功能
                 }
                 socket.shutdownOutput();//关闭客户端的输出流,相当于结束标记
                
                 /**
                  * 获得文件的输出流,用来获得服务端反馈的信息
                  */
                 BufferedReader brs=new BufferedReader(new InputStreamReader(socket.getInputStream()));
                 String str=null;
                 str=brs.readLine();
                 System.out.println(str);
                
                 brs.close();
                 br.close();
                 socket.close();
      }
     
    }
     

          服务端:

                步骤:1.定义服务端服务,然后指定端口号。

                      2.获得客户端对象,然后从中获取读取流。

                      3.定义新文件的写入流,这样把读取流中的内容写入到新文件中。

                      4.获得客户端的写入流,反馈给客户端信息。

     

     

     

    package www.fuxi.wangluo;
     
    import java.io.BufferedReader;
    import java.io.FileWriter;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    /**
     * 服务端
     */
    public class TextServer {
      public static void main(String[] args) throws Exception {
        /**
         * 定义服务端,然后获得客户端服务对象
         */
        ServerSocket server = new ServerSocket(25001);
        Socket socket=server.accept();
        /**
         * 获得客户端的读取流,这样读取文件内容
         */
        BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        /**
         * 获得目标文件的写入流,用来写入文件内容
         */
        PrintWriter pr=new PrintWriter(new FileWriter("newCopy.txt"),true);
        String line=null;
        while((line=br.readLine())!=null){
          pr.println(line);
        }
        /**
         * 获得客户端的写入流,这样把信息反馈给客户端
         */
        PrintWriter prs=new PrintWriter(socket.getOutputStream());
        prs.println("上传成功!");
        pr.close();
        prs.close();
        br.close();
        server.close();
      }
     
    }
     
    结果:上传成功
     



    注意点:一定要定义结束标记,否则会不会停止上传,结束标记可以自定义,也可以使用Socket中自带的方法来结束。




    ---------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! --------------------


  • 相关阅读:
    Nodejs中的流
    Openstack Havana的两个排错过程
    Mongoose入门
    Promise
    CSS3中的动画
    MySql学习笔记(一)--安装配置
    应用Dubbo框架打造仿猫眼项目(二) 影片模块开发
    应用Dubbo框架打造仿猫眼项目(一) 用户模块开发
    4种事务的隔离级别
    JAVA面试题解惑系列(一)——类的初始化顺序
  • 原文地址:https://www.cnblogs.com/james1207/p/3395234.html
Copyright © 2020-2023  润新知