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登录功能------\n 请输入用户名");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 }

  成果:

 

posted on 2020-03-18 21:23  代码吴彦祖  阅读(468)  评论(0编辑  收藏  举报