• TCP(Socket基础编程)


    1、TCP特点:

      面向连接、可靠安全、传输量大、速度较慢

    2、socket编程主要依靠两个类:socket 、serversocket

      example1:客户端可以不停输入字符串,服务端返回字符串的大写

    客户端代码:

     1 public static void main(String[] args) throws Exception{
     2             //建立socket连接 连接一旦建立成功 就可以获得 输入流 和 写出流
     3             Socket s = new Socket(InetAddress.getLocalHost(),10001);
     4             //客户端从键盘输入字符
     5             BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
     6             //从服务端获取的输入流,可以获取从服务端返回的信息
     7             BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
     8             //写出流  方式一 把信息发送到服务端
     9             PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
    10             //写出流 方式二
    11             //BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
    12             
    13             String line = null;
    14             while((line=br.readLine())!=null){
    15                 //写到服务端 方式一
    16                 pw.println(line);
    17                 //写到服务端 方式二
    18                 /*
    19                     bw.write(line);
    20                     bw.newLine();
    21                     bw.flush();
    22                 */
    23                 //读取服务端返回信息(这是一个阻塞方法)
    24                 String result = in.readLine();
    25                 
    26                 System.out.println(result);
    27             }
    28             s.close();
    29             br.close();
    30    }

    服务端代码:

      

    1 public static void main(String[] args) throws Exception {
    2         ServerSocket ss = new ServerSocket(10001);
    3         while(true){
    4             //此方法是阻塞式方法
    5             Socket s = ss.accept();
    6             //服务端这儿需要使用线程 每次接受一个客户端就为其开启一个线程,防止多个客户端访问出现阻塞情况
    7             new Thread(new ServerThread(s)).start();
    8         }
    9   }
     1 class ServerThread implements Runnable{
     2     
     3     private Socket socket;
     4     
     5     public ServerThread(Socket socket) {
     6         this.socket = socket;
     7     }
     8     
     9     @Override
    10     public void run() {
    11         try {
    12             System.out.println(socket.getInetAddress().getHostAddress()+"is connecting");
    13             BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    14             PrintWriter pw = new PrintWriter(socket.getOutputStream(),true);
    15             String line =null;
    16             while((line = br.readLine())!=null){
    17                 //如果接收到结束标志 则结束
    18                 if("over".equals(line)){
    19                     break;
    20                 }
    21                 System.out.println(line);
    22                 pw.println(line.toUpperCase());
    23             }
    24         } catch (IOException e) {
    25             // TODO Auto-generated catch block
    26             e.printStackTrace();
    27         }
    28         
    29     }
    30 }
    View Code

    Example2:上传文件——客户端将文件内容写到服务端,服务端 将内容保存到其他位置,实现从服务端上传文件的功能

      客户端代码:

     1 public static void main(String[] args) throws Exception {
     2             Socket s = new Socket(InetAddress.getLocalHost(),10001);
     3             BufferedReader br = new BufferedReader(new FileReader(new File("D:/baichuanyu/HelloWorld/src/com/action/Hello.java")));
     4             BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
     5             PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
     6             String line = null;
     7             while((line=br.readLine())!=null){
     8                 pw.println(line);
     9             }
    10             //文件内容写到服务器完成后,服务端没有接受到结束标志,会继续readline()下去
    11             //通过shutdownOutput()方法 可以向服务器写-1结束标志 从而结束服务端的readline()方法
    12             s.shutdownOutput();
    13             String result = in.readLine();
    14             System.out.println(result);
    15             s.close();
    16             br.close();
    17         }

      服务端代码:

      

     1 class UploadThread implements Runnable{
     2 
     3     private Socket socket;
     4     
     5     public UploadThread(Socket socket) {
     6         this.socket = socket;
     7     }
     8     
     9     @Override
    10     public void run() {
    11         try {
    12             System.out.println(socket.getInetAddress().getHostAddress()+" is connecting....");
    13             BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    14             PrintWriter pw = new PrintWriter(new FileWriter(new File("E:\Hello.txt")),true);
    15             PrintWriter os = new PrintWriter(socket.getOutputStream(),true);
    16             String line =null;
    17             while((line = br.readLine())!=null){
    18                 pw.println(line);
    19             }
    20             os.println("over");
    21             pw.close();
    22         } catch (IOException e) {
    23             // TODO Auto-generated catch block
    24             e.printStackTrace();
    25         }
    26         
    27     }
    28 }
    View Code
    1 public static void main(String[] args) throws Exception {
    2         ServerSocket ss = new ServerSocket(10001);
    3         while(true){
    4             //此方法是阻塞式方法
    5             Socket s = ss.accept();
    6             //服务端这儿需要使用线程 每次接受一个客户端就为其开启一个线程,防止多个客户端访问出现阻塞情况
    7             new Thread(new UploadThread(s)).start();
    8         }
    9      }
  • 相关阅读:
    虚拟机中硬盘扩展方法
    ubuntu postgresql install
    vim python
    oe7报表的中文乱码
    文件导入 import
    How do I list user defined types in a SQL Server database
    修改表结构
    查询数据库中所有的表和数据库架构
    Dev chartControl添加提示层信息
    最简单的日志
  • 原文地址:https://www.cnblogs.com/Wen-yu-jing/p/4077918.html
Copyright © 2020-2023  润新知