zoukankan      html  css  js  c++  java
  • 网络编程之TCP

    TCP通信

    TCP通信是严格区分客户端与服务器端的,在通信时,必须先由客户端去连接服务器端才能实现通信,服务器端不可以主动连接客户端,并且服务器端程序需要事先启动,等待客户端的连接。

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

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

     ServerSocket类:该类的实例对象可以实现一个服务器段的程序。

      ServerSocket对象负责监听某台计算机的某个端口号,在创建ServerSocket对象后,需要继续调用该对象的accept()方法,接收来自客户端的请求。当执行了accept()方法之后,服务器端程序会发生阻塞,直到客户端发出连接请求,accept()方法才会返回一个Scoket对象用于和客户端实现通信,程序才能继续向下执行。

      

     Socket 类:  实现TCP客户端程序。

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

    要实现TCP通信需要创建一个服务器端程序和一个客户端程序,为了保证数据传输的安全性,首先需要实现服务器端程序。

     1 package udpdemo;
     2 
     3 import java.io.FileInputStream;
     4 import java.io.IOException;
     5 import java.io.InputStream;
     6 import java.io.OutputStream;
     7 import java.net.Socket;
     8 
     9 
    10 public class TCPClient {
    11     private static int port=9999;
    12     private static String ip="127.0.0.1";
    13     
    14     
    15     public static void main(String[] args) throws IOException, IOException {
    16          byte[] bytes = new byte[1024];
    17          int len=0;
    18          int l=0;
    19          byte[] b= new byte[1024];
    20         //创建客户端Socket,指定要连接的端口和ip;
    21         Socket socket = new Socket(ip,port);
    22     
    23         /**
    24          * 读取本地文件("E:\1\tx.jpg")
    25          * 向服务器上传文件
    26          */
    27         FileInputStream fis = new FileInputStream("E:\1\tx.jpg");
    28         OutputStream out = socket.getOutputStream();
    29         
    30         while((l=fis.read(b))!=-1) {
    31             out.write(b,0,l);
    32         }
    33         
    34         System.out.println("文件发送成功....");
    35         socket.shutdownOutput();//不加这句,上传的文件无法使用,还在被服务器占用,
    36                                     //shutdownOutput()发送消息告诉服务器,传送完毕,可以释放资源了
    37         
    38         
    39         /**
    40          * 读取服务器的反馈信息
    41          */
    42         //创建一个保存信息的字节数组
    43         //获取输入流
    44         InputStream in = socket.getInputStream();
    45         while((len=in.read(bytes))!=-1) {
    46             System.out.println(new String(bytes,0,len));
    47         }
    48         fis.close();
    49         in.close();
    50         socket.close();
    51     }
    52 }
    /**************************************输出结果***************************************/
    文件发送成功....
    恭喜,连接服务器成功...
     1 package udpdemo;
     2 
     3 import java.io.BufferedOutputStream;
     4 import java.io.FileOutputStream;
     5 import java.io.IOException;
     6 import java.io.InputStream;
     7 import java.io.OutputStream;
     8 import java.net.InetAddress;
     9 import java.net.ServerSocket;
    10 import java.net.Socket;
    11 
    12 /**
    13  * TCP通信     服务器端
    14  * ServerSocket
    15  * 
    16  *
    17  */
    18 public class TCPServer {
    19     public static void main(String[] args) throws IOException {
    20         //创建服务器对象,指定服务器端口号(9999)
    21         ServerSocket server=new ServerSocket(9999);
    22         //accept()开启服务器,等待客户端连接,连接后返回一个客户端Socket对象
    23         Socket socket = server.accept();
    24         //获取客户端连接对象
    25         InetAddress  ipObject=socket.getInetAddress();
    26 //        显示哪个ip连接了服务器
    27         System.out.println("客户端:"+ipObject.getHostAddress()+"连接上了服务器");
    28         BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("F:\a\a.jpg"));
    29         /**
    30          * 通过客户端socket对象获得输入流,从而可以实现读取数据,通过accept()方法获取正在连接服务器的客户端的对象,
    31          * 调用客户端对象的输入流去读取客户端输出的数据,
    32          * 
    33          */
    34         InputStream in = socket.getInputStream();
    35         //输入流循序读取客户端传来的数据,并通过输出流写入文件,实现上传功能
    36         byte[] bytes = new byte[1024];
    37         int len =0;
    38         while((len=in.read(bytes))!=-1) {
    39             bos.write(bytes,0,len);
    40         }
    41         System.out.println("文件上传成功...");
    42         /*
    43          *     服务器的反馈信息
    44          */
    45         //通过Socket对象,拿到getOutputStream(),获取输出流,回复客户端"连接服务器成功"
    46             OutputStream out=socket.getOutputStream();
    47             out.write("恭喜,连接服务器成功...".getBytes());
    48         //关闭流资源
    49             bos.close();
    50             out.close();
    51             socket.close();
    52     }
    53 }
    /****************************************输出结果***************************************/
    客户端:127.0.0.1连接上了服务器
    文件上传成功...

  • 相关阅读:
    Bootstrap UI层收藏介绍
    你为什么离开上家公司?三大经典面试问题剖析
    浅谈常用的Web安全技术手段
    C#中yield关键字理解
    中小型研发团队架构实践三要点(转自原携程架构师张辉清)
    你确实应该学习并使用的 10 个 C# 特性
    ASP.NET MVC 异步Excel数据选择导出
    表格中控制tr的display:block在火狐中显示错乱的解决方法
    切图笔记
    表单验证jquery.validate
  • 原文地址:https://www.cnblogs.com/lyjblogs/p/7891260.html
Copyright © 2011-2022 走看看