zoukankan      html  css  js  c++  java
  • 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      }
  • 相关阅读:
    关于32位操作系统和64位操作系统对InstallShield打包的影响
    NEWS: Symantec宣布Wise Package Studio将终止
    InstallShield 2012新功能试用(2) 调用MsiGetProperty等MSI API发生变化
    Basic INFO 在命令行Build InstallShield安装包工程获得压缩安装包
    NEWS InstallShield 2012 Service Pack 1发布
    Basic INFO InstallShield Basic MSI工程中如何在SetupCompleteSuccess界面中启动Readme
    Basic INFO InstallShield的脚本编辑器中如何显示代码行号
    Basic INFO 关于在InstallShield制作的安装包界面中删除InstallShield文字的厂商回复
    Basic INFO InstallShield工程中如何让产品的快捷方式名称始终与产品名保持一致
    Basic INFO: 创建隐藏文件夹
  • 原文地址:https://www.cnblogs.com/Wen-yu-jing/p/4077918.html
Copyright © 2011-2022 走看看