zoukankan      html  css  js  c++  java
  • Java学习之网络编程(TCP协议实例)

    传输控制协议(TCP,Transmission Control Protocol):字面意思传输那就会有源和目的地,TCP中的源和目的地就是客户端和服务端

    两个核心类型

    1、Socket:客户端套接字

    2、ServerSocket:服务端套接字

    一、创建客户端思路

      1、创建tcp客户端socket服务,通过Socket对象
        建议一创建就就明确目的地,要连接主机
      2、如果连接建立成功,说明数据传输通道已建立。
        可以通过getOutputStream()和getInputStream()来获取两个字节流
      3、使用输出流,将数据写出
      4、关闭资源
     1 public class ClientDeo {
     2     public static void main(String[] args) throws UnknownHostException, IOException {
     3     //创建客户端socket服务
     4     Socket socket=new Socket("",10002);
     5     //获取socket流中的输出流
     6     
     7     OutputStream out=socket.getOutputStream();
     8     out.write("tcp演示".getBytes());
     9     
    10     socket.close();
    11     }
    12 }

    二、创建服务端思路

      1、创建服务的socket服务,通过ServerSocket对象
      2、服务端必须对我提供一个端口,否则客户端无法连接
      3、获取连接过来的客户端对象
      4、通过客户端对象获取socket流读取客户端发送的数据
      5、关闭资源(关闭客户端和服务端)

     1 public class ServerDemo {
     2     public static void main(String[] args) throws IOException {
     3     //创建服务端对象
     4     ServerSocket ss=new ServerSocket(10002);
     5     //获取连接过来的客户端对象
     6     Socket s=ss.accept();
     7     //通过客户端对象获取输入流,要读取客户端发送的数据
     8     InputStream in=s.getInputStream();
     9     BufferedReader br=new BufferedReader(new InputStreamReader(in));
    10     
    11     String line=null;
    12     while((line=br.readLine())!=null) {
    13         System.out.println(s.getInetAddress().getHostAddress()+":"+line);
    14     }
    15     
    16     s.close();
    17     ss.close();
    18     }
    19 }

    结果:

     分析:

    代码展示:

    服务端代码

     1 public class ServerDemo2 {
     2     public static void main(String[] args) throws IOException {
     3     //创建服务端对象
     4     ServerSocket ss=new ServerSocket(10003);
     5     //获取连接过来的客户端对象
     6     Socket s=ss.accept();
     7     
     8     //通过客户端对象获取输入流,要读取客户端发送的数据
     9     InputStream in=s.getInputStream();
    10     byte[] buf=new byte[1024];
    11     int len = in.read(buf);
    12     System.out.println(new String(buf,0,len));
    13     OutputStream out=s.getOutputStream();
    14     out.write("Response...".getBytes());
    15     s.close();
    16     ss.close();
    17     }
    18 
    19 }

    客户端代码:

     1 public class ClientDemo2 {
     2 
     3     /**
     4      * @param args
     5      * @throws IOException 
     6      * @throws UnknownHostException 
     7      */
     8     public static void main(String[] args) throws UnknownHostException, IOException {
     9     //创建客户端socket服务
    10     Socket socket=new Socket("172.28.188.168",10003);
    11     //获取socket流中的输出流
    12     
    13     OutputStream out=socket.getOutputStream();
    14     out.write("tcp演示,request...".getBytes());
    15     out.flush();
    16     InputStream in=socket.getInputStream();
    17     byte[] buf=new byte[1024];
    18     int len = in.read(buf);
    19 
    20     String text=new String(buf,0,len);
    21     System.out.println(text);
    22     socket.close();
    23     }
    24 
    25 }

    同时上传图片(使用多线线程)

    定义线程任务类(实现Runnable接口的类)

     1 public class UploadTask implements Runnable {
     2 
     3     private Socket s;
     4 
     5     public UploadTask(Socket s) {
     6     this.s = s;
     7     }
     8 
     9     @Override
    10     public void run() {
    11     int count = 0;
    12     String ip = s.getInetAddress().getHostAddress();
    13     try {
    14         // 读取客户端发送来的数据
    15         InputStream in = s.getInputStream();
    16 
    17         // 将读取到数据存储到一个文件中
    18         File dir = new File("pic");
    19         if (!dir.exists()) {
    20         dir.mkdirs();
    21         }
    22         File file = new File(dir, ip + ".png");
    23 
    24         //判断文件是否存在
    25         if (file.exists()) {
    26         file = new File(dir, ip + "(" + (++count) + ").png");
    27         }
    28 
    29         FileOutputStream fos = new FileOutputStream(file);
    30         byte[] buf = new byte[1024];
    31         int len = 0;
    32         while ((len = in.read(buf)) != -1) {
    33         fos.write(buf, 0, len);
    34         }
    35 
    36         OutputStream out = s.getOutputStream();
    37         out.write("Upload Finish...".getBytes());
    38         fos.close();
    39         s.close();
    40     } catch (Exception e) {
    41         // TODO: handle exception
    42     }
    43     }
    44 }

    客户端

     1 public class UploadPicClient {
     2 
     3     /**
     4      * @param args
     5      * @throws IOException 
     6      * @throws UnknownHostException 
     7      */
     8     public static void main(String[] args) throws UnknownHostException, IOException {
     9     // 1、创建客户端socket
    10     Socket socket = new Socket("172.28.188.168", 10005);
    11     // 2、读取客户端要上传的图片文件
    12     FileInputStream fis=new FileInputStream("0.png");
    13     // 3、获取socket输出流,将图片数据发送给服务器
    14     OutputStream out=socket.getOutputStream();
    15     // 4、循环写入数据到socket输出流
    16     byte[] buf=new byte[1024];
    17     int len = 0;
    18     while((len=fis.read(buf))!=-1) {
    19         out.write(buf,0,len);
    20     }
    21     // 5、告诉服务器,数据发送完毕,服务器停止读取
    22     socket.shutdownOutput();
    23 
    24     // 读取服务端返回的内容
    25     InputStream in=socket.getInputStream();
    26     byte[] bufin=new byte[1024];
    27     int lenin=in.read(bufin);
    28     System.out.println(new String(bufin,0,lenin));
    29     // 关闭资源
    30     fis.close();
    31     socket.close();
    32     }
    33 }

    服务端

     1 public class UploadPicServer {
     2 
     3     /**
     4      * @param args
     5      * @throws IOException
     6      * @throws UnknownHostException
     7      */
     8     public static void main(String[] args) throws UnknownHostException, IOException {
     9     // 创建tcp的socket服务端
    10     ServerSocket ss = new ServerSocket(10005);
    11 
    12     while (true) {
    13         // 获取客户端
    14         Socket s = ss.accept();
    15         new Thread(new UploadTask(s)).start();
    16     }
    17 //    ss.close();
    18     }
    19 
    20 }
  • 相关阅读:
    服务器性能剖析
    事务
    计算机中信息表示
    Git初识
    Redis 概述
    Jedis源码浅析
    Spring 初识
    责任链模式
    观察者模式
    【支付签名失败问题】
  • 原文地址:https://www.cnblogs.com/WarBlog/p/12145100.html
Copyright © 2011-2022 走看看