zoukankan      html  css  js  c++  java
  • Socket实战与应用

    1: Socket之序列化; 让对象能够通过socket进行传输

    服务端:

     1 package com.lv.study.am.first;
     2 
     3 import java.io.ObjectOutputStream;
     4 import java.io.OutputStream;
     5 import java.net.ServerSocket;
     6 import java.net.Socket;
     7 import java.util.ArrayList;
     8 import java.util.List;
     9 
    10 //我们现在需要将一个对象发送给客户端;
    11 public class DemoListServer {
    12 
    13     public static void main(String[] args) throws Exception {
    14 
    15         
    16         Goods goods1 = new Goods(1, "appler");
    17         Goods goods2 = new Goods(2, "pen");
    18         //需要将goods对象,发送给客户端;
    19         
    20         List<Goods> list = new ArrayList<Goods>();
    21         list.add(goods1);
    22         list.add(goods2);
    23         
    24         
    25         //当有客户端连接我的服务端的时候,
    26         //我发送我的商品信息给对方;
    27         
    28         //1:构建一个ServerSocket对象;等待客户端连接
    29         ServerSocket ss = new ServerSocket(8888);
    30         
    31         System.out.println("start ... watting...");
    32         
    33         //2: 来了连接以后,需要发送一个对象给对方;
    34         Socket server = ss.accept();
    35         
    36         //3:发送对象;使用输出流发送对象;
    37         OutputStream os = server.getOutputStream();
    38         
    39         //4:发送对象使用ObjectOutputStream
    40         ObjectOutputStream oos = new ObjectOutputStream(os);
    41         
    42         //一定要注意: 发送的对象,一定是可序列化的对象;  能够通过流在网络世界穿梭的对象;
    43         
    44         oos.writeObject(list);
    45         oos.flush(); //谁输出的,flush谁
    46         
    47         System.out.println("send object success....");
    48         
    49 //        os.flush();//没用的
    50         server.close();
    51     }
    52 
    53 }

    客户端:

     1 package com.lv.study.am.first;
     2 
     3 import java.io.InputStream;
     4 import java.io.ObjectInputStream;
     5 import java.net.Socket;
     6 import java.util.List;
     7 
     8 public class DemoListClient {
     9 
    10     static String ip = "127.0.0.1";
    11     static int port = 8888;
    12     
    13     public static void main(String[] args) throws Exception {
    14 
    15         //1:首先要根据ip和端口建立一个socket
    16         
    17         Socket client = new Socket(ip,port);
    18         
    19         System.out.println("connection server...");
    20         
    21         //2:接受服务端发送给我的对象;
    22         InputStream is = client.getInputStream();
    23         
    24         //is能够接受一个对象吗?使用对象字节流来读取一个对象;
    25         ObjectInputStream ois = new ObjectInputStream(is);
    26         
    27         //读取了一个对象
    28         Object goods1 = ois.readObject();
    29         
    30         List<Goods> list = (List)goods1;
    31         
    32         System.out.println(goods1);
    33         
    34         client.close();
    35     }
    36 
    37 }

    注:Goods实体类里面一定要实现​  implements Serializable(序列化的接口)

    2:Socket之 PrintWriter 与 Scanner应用 ; 专门用来处理字符串信息

      PrintWriter : 高级输出流,Scanner : 高级输入流

     1 package com.lv.study.pm.first;
     2 
     3 import java.io.File;
     4 import java.io.FileNotFoundException;
     5 import java.io.PrintWriter;
     6 import java.net.Socket;
     7 import java.util.Scanner;
     8 
     9 public class TestScanner {
    10 
    11     public static void main(String[] args) throws Exception {
    12 
    13         //给一个普通的输入流
    14         
    15         Socket socket=new Socket();
    16         
    17         Scanner scan1=new Scanner(System.in);//用作键盘录入
    18         
    19         Scanner scan2=new Scanner(new File("x.txt"));//用作文件读取
    20         
    21         Scanner scan3=new Scanner(socket.getInputStream());//用作网络通信里面的流
    22         
    23         scan1.nextLine();//读取键盘录入的信息
    24         scan2.nextLine();//读取文件里面的信息
    25         scan3.nextLine();//读取socket流里面的信息(客服端或者服务器端)法来的
    26         
    27         PrintWriter pw1=new PrintWriter(System.out);
    28         PrintWriter pw2=new PrintWriter("a.txt");
    29         PrintWriter pw3=new PrintWriter(socket.getOutputStream());
    30         
    31         
    32         pw1.println("控制台打印");pw1.flush();
    33         pw1.println("写在文件里面");pw2.flush();
    34         pw1.println("发给服务器或者客服端");pw3.flush();
    35         
    36         
    37     }
    38 
    39 }

    3:Socket 之 登录注册

      服务器端:

      1 package com.lv.study.pm.second;
      2 
      3 import java.io.IOException;
      4 import java.io.PrintWriter;
      5 import java.net.ServerSocket;
      6 import java.net.Socket;
      7 import java.util.Scanner;
      8 
      9 public class LoginServerMain {
     10 
     11     public static void main(String[] args) {
     12 
     13         try {
     14             // 构建一个ServerSocket对象
     15             ServerSocket ss = new ServerSocket(8888);
     16 
     17             // 无线连接客服端
     18             Socket server;
     19 
     20             Scanner scan;
     21             PrintWriter pw;
     22             System.out.println("start  i am server....");
     23             while (true) {
     24                 server = ss.accept();// 只能监听一次
     25 
     26                 System.out.println("client:" + server.getInetAddress().getHostAddress() + "connettion");
     27 
     28                 scan = new Scanner(server.getInputStream());
     29                 pw = new PrintWriter(server.getOutputStream());
     30 
     31                 while (true) {
     32                     // 让客户来选择要这行的功能
     33                     String msg = "请选择你要执行的功能:1:登录  2:注册  3:其他";
     34                     pw.println(msg);// 发送给客服端
     35                     pw.flush();
     36 
     37                     // 接收客服的选择
     38                     String choose = scan.nextLine();
     39 
     40                     switch (choose) {
     41                     case "1":
     42                         Login(scan, pw);// 执行登录功能
     43                         break;
     44                     case "2":
     45                         regist(scan, pw);// 执行注册功能
     46                         break;
     47 
     48                     default:
     49                         // 向客户端发送一条信息
     50                         pw.println("系统正在升级中.......");
     51                         pw.flush();
     52                         break;
     53                     }
     54                 }
     55 
     56             }
     57 
     58         } catch (IOException e) {
     59             e.printStackTrace();
     60         }
     61 
     62     }
     63 
     64     private static void regist(Scanner scan, PrintWriter pw) {
     65 
     66         // 向客服端获取这个信息
     67         pw.println("---------欢迎使用ABC注册功能---------");
     68         pw.println("请输入用户名");
     69         pw.flush();
     70 
     71         // 接受客服端输入的用户名
     72         String name = scan.nextLine();
     73 
     74         // 发送给客服端
     75         pw.println("请输入密码");
     76         pw.flush();
     77 
     78         // 从客户端接受密码
     79         String pass1 = scan.nextLine();
     80 
     81         pw.println("请再次输入密码");
     82         pw.flush();
     83         String pass2 = scan.nextLine();
     84 
     85         pw.println("注册成功");
     86         pw.flush();
     87 
     88     }
     89 
     90     private static void Login(Scanner scan, PrintWriter pw) {
     91 
     92         //写信息到客服端
     93         pw.println("-------欢迎使用ABC登录功能------
     请输入用户名");pw.flush();
     94         
     95         //读取客户端的信息
     96         String name=scan.nextLine();
     97         
     98         pw.println("------请输入密码--------");pw.flush();
     99         
    100         String pass=scan.nextLine();
    101         
    102         pw.println("登录成功");
    103         System.out.println(name+":"+ pass);
    104     }
    105 
    106 }

      客户端:

     1 package com.lv.study.pm.second;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.IOException;
     5 import java.io.InputStream;
     6 import java.io.InputStreamReader;
     7 import java.io.PrintWriter;
     8 import java.net.Socket;
     9 import java.net.UnknownHostException;
    10 import java.util.Scanner;
    11 
    12 public class LoginClientMain {
    13 
    14     public static void main(String[] args) {
    15 
    16         String ip = "";
    17         int port = 8888;
    18 
    19         // 客服端,能够登陆注册
    20 
    21         try {
    22             Socket client = new Socket(ip, port);
    23 
    24             // 用来读取服务端发给我的信息
    25             Scanner scan = new Scanner(client.getInputStream());
    26 
    27             // 用来向服务端发送消息
    28             PrintWriter pw = new PrintWriter(client.getOutputStream());
    29 
    30             // 进行注册登陆的动作
    31 
    32             while (true) {// 能够循环的接受服务器发给我饿消息,以及一直给服务器发送这个指令
    33                 // 1 接收服务端发给我的信息
    34                 String msg = scan.nextLine();
    35                 System.out.println(msg);
    36 
    37                 // 2 向服务器发送信息
    38 
    39                 // br:负责从键盘录入信息
    40                 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    41                 String clmsg = br.readLine();
    42 
    43                 pw.println(clmsg);// 这个地方发送的消息是键盘录入的
    44                 pw.flush();
    45             }
    46 
    47         } catch (UnknownHostException e) {
    48             e.printStackTrace();
    49         } catch (IOException e) {
    50             e.printStackTrace();
    51         }
    52 
    53     }
    54 
    55 }

      成果:

  • 相关阅读:
    大型网站应用之海量数据和高并发解决方案总结
    反转二叉树
    Spring bean循环依赖
    死磕Spring AOP (学习持续更新中。。)
    Context 初始化流程
    ConcurrentHashMap
    2-MySQL高级-事务-基本概念(1)
    1-MySQL高级-视图
    11-python基础—格式化的两种方式
    22-MySQL-Ubuntu-备份与恢复
  • 原文地址:https://www.cnblogs.com/dabu/p/12520407.html
Copyright © 2011-2022 走看看