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 }
成果: