zoukankan      html  css  js  c++  java
  • 黑马程序员_<<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培训、期待与您交流! --------------------


  • 相关阅读:
    高盛、沃尔玛 题做出来还挂了的吐槽
    amazon师兄debrief
    到所有人家距离之和最短的中点 296. Best Meeting Point
    问问题没人回答的情况怎么办终于有解了
    找名人 277. Find the Celebrity
    数组生存游戏 289. Game of Life
    547. Number of Provinces 省份数量
    428. Serialize and Deserialize Nary Tree 序列化、反序列化n叉树
    alias别名简介和使用
    面试官:线程池执行过程中遇到异常会发生什么,怎样处理? Vincent
  • 原文地址:https://www.cnblogs.com/james1207/p/3395234.html
Copyright © 2011-2022 走看看