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 }

  成果:

Socket实战与应用的更多相关文章

  1. C#网络编程技术微软Socket实战项目演练(三)

    一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的第三部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理 ...

  2. Java Socket实战之一 单线程通信

    本文地址:http://blog.csdn.net/kongxx/article/details/7259436 现在做Java直接使用Socket的情况是越来越少,因为有很多的选择可选,比如说可以用 ...

  3. Java Socket实战之一 单线程通信基础socket

    现在做Java直接使用Socket的情况是越来越少,因为有很多的选择可选,比如说可以用spring,其中就可以支持很多种远程连接的操作,另外jboss的remoting也是不错的选择,还有Apache ...

  4. Java Socket实战之三 传输对象

    首先需要一个普通的对象类,由于需要序列化这个对象以便在网络上传输,所以实现java.io.Serializable接口就是必不可少的了,入下: public class User implements ...

  5. Java Socket实战之五:使用加密协议传输对象

    转自:http://developer.51cto.com/art/201202/317547.htm 前面几篇博文提到了Socket中一些常用的用法,但是对于一些有安全要求的应用就需要加密传输的数据 ...

  6. Java Socket实战之四:传输压缩对象

    转自:http://developer.51cto.com/art/201202/317546.htm 上一篇文章说到了用Java Socket来传输对象,但是在有些情况下比如网络环境不好或者对象比较 ...

  7. Java Socket实战之三:传输对象

    转自:https://i.cnblogs.com/EditPosts.aspx?opt=1 前面两篇文章介绍了怎样建立Java Socket通信,这一篇说一下怎样使用Java Socket来传输对象. ...

  8. Java Socket实战之二:多线程通信

    转自:http://developer.51cto.com/art/201202/317544.htm 上一篇文章说到怎样写一个最简单的Java Socket通信,但是在上一篇文章中的例子有一个问题就 ...

  9. Java Socket实战之一:单线程通信

    转自:http://developer.51cto.com/art/201202/317543.htm 现在做Java直接使用Socket的情况是越来越少,因为有很多的选择可选,比如说可以用sprin ...

  10. Java Socket实战之七 使用Socket通信传输文件

    http://blog.csdn.net/kongxx/article/details/7319410 package com.googlecode.garbagecan.test.socket.ni ...

随机推荐

  1. OSPF各类LSA

    一.域内路由 路由器将接口宣告进OSPF进程后,形成的链路状态放入1类LSA中,用于描述路由器自身的直连状态. 1. 区域0为骨干区域,非0为非骨干区域. 2. 骨干区域有且只能存在一个. 3. 非骨 ...

  2. oracle修改用户密码的方法

    Oracle用户名及默认密码 修改oracle用户的密码有以下方法: 普通用户 (1)通过alter user语法来进行修改 ,这也是最常见的方式: (2) 第二种方式,是通过password命令来修 ...

  3. Ubuntu更换cuda版本,gcc,g++版本

    Ubuntu更换cuda版本,gcc,g++版本 更换cuda版本 这个比较简单 可以看到 /usr/local下面有一个软链接,更换到我们需要的版本即可,cuda对应版本安装可参考官网. 创建软连接 ...

  4. English interview - how to show your skills in English during the interview process?(probably used in resume,cover letter)

    Formula We can use the formula below to express our skills in English. Formula: adv/adj + verb phras ...

  5. GitLab 服务器宕机时的项目代码恢复方法

    重要前提:GitLab 数据挂载盘必须能够正常读取,且 /var/opt/gitlab/git-data/repositories 目录下的数据可以完整拷贝. 当 GitLab 服务器意外宕机且没有备 ...

  6. HTB打靶记录-EscapeTwo

    信息收集 nmap -sV -sC -O 10.10.11.51 Starting Nmap 7.95 ( https://nmap.org ) at 2025-04-05 14:52 CST Sta ...

  7. Windows IntelliJ IDEA 快捷键终极大全

    自动代码 常用的有fori/sout/psvm+Tab即可生成循环.System.out.main方法等boilerplate样板代码 . 例如要输入for(User user : users)只需输 ...

  8. LinkedBlockingQueue的poll方法底层原理

    一.LinkedBlockingQueue的poll方法底层原理 LinkedBlockingQueue 的 poll 方法用于从队列头部移除并返回元素.如果队列为空,poll 方法会立即返回 nul ...

  9. 关于while循环与for循环

    首先看for循环 def test(): print('1') print('2') for i in range(3): test() 执行后的结果,按照下图所示,for循环就是把指定的函数重复执行 ...

  10. 使用 Go 构建一个最小的 API 应用

    最近有项目要使用 Go 开发,作为一个. NET Core 选手,准备先撸一个包含 CRUD 的最小 MVP 项目练手. 要创建一个 TODO 应用,会创建下面这些接口: API Descriptio ...