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 }
成果:
Socket实战与应用的更多相关文章
- C#网络编程技术微软Socket实战项目演练(三)
一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的第三部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理 ...
- Java Socket实战之一 单线程通信
本文地址:http://blog.csdn.net/kongxx/article/details/7259436 现在做Java直接使用Socket的情况是越来越少,因为有很多的选择可选,比如说可以用 ...
- Java Socket实战之一 单线程通信基础socket
现在做Java直接使用Socket的情况是越来越少,因为有很多的选择可选,比如说可以用spring,其中就可以支持很多种远程连接的操作,另外jboss的remoting也是不错的选择,还有Apache ...
- Java Socket实战之三 传输对象
首先需要一个普通的对象类,由于需要序列化这个对象以便在网络上传输,所以实现java.io.Serializable接口就是必不可少的了,入下: public class User implements ...
- Java Socket实战之五:使用加密协议传输对象
转自:http://developer.51cto.com/art/201202/317547.htm 前面几篇博文提到了Socket中一些常用的用法,但是对于一些有安全要求的应用就需要加密传输的数据 ...
- Java Socket实战之四:传输压缩对象
转自:http://developer.51cto.com/art/201202/317546.htm 上一篇文章说到了用Java Socket来传输对象,但是在有些情况下比如网络环境不好或者对象比较 ...
- Java Socket实战之三:传输对象
转自:https://i.cnblogs.com/EditPosts.aspx?opt=1 前面两篇文章介绍了怎样建立Java Socket通信,这一篇说一下怎样使用Java Socket来传输对象. ...
- Java Socket实战之二:多线程通信
转自:http://developer.51cto.com/art/201202/317544.htm 上一篇文章说到怎样写一个最简单的Java Socket通信,但是在上一篇文章中的例子有一个问题就 ...
- Java Socket实战之一:单线程通信
转自:http://developer.51cto.com/art/201202/317543.htm 现在做Java直接使用Socket的情况是越来越少,因为有很多的选择可选,比如说可以用sprin ...
- Java Socket实战之七 使用Socket通信传输文件
http://blog.csdn.net/kongxx/article/details/7319410 package com.googlecode.garbagecan.test.socket.ni ...
随机推荐
- [每日算法 - 华为机试] LeetCode 475. 供暖器
入口 力扣https://leetcode.cn/problems/heaters/submissions/ 题目描述 冬季已经来临. 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖. 在加热 ...
- 【Unity】改变游戏运行时Window的窗口标题
[Unity]改变游戏运行时Window的窗口标题 零.需求 Unity打包好的Windows程序,启动后如何更改窗口标题?因为看着英文的感觉不太好,故有此想法.什么?你说为啥不改项目产品名?产品名会 ...
- 【Python】批量导出word文档中的图片、嵌入式文件
Python 批量导出word文档中的图片.嵌入式文件 需求 学生试卷中的题目有要提交截图的,也有要提交文件的,为了方便学生考试,允许单独交或者嵌入Word中提交,那么事后如何整理学生的答案?单独提交 ...
- 面试题:Linux 系统基础 (二)
Linux系统中的定时任务有哪些类型,它们是如何配置的? Linux系统中的定时任务主要有两种类型:Cron作业和at作业. 1.Cron作业: 使用crontab命令配置和管理. 配置周期性执行的任 ...
- sorting order 和sorting layer
根据unity的api文档 https://docs.unity3d.com/ScriptReference/Renderer-sortingOrder.html Renderer's order w ...
- Python合成多个视频为一个脚本
编写背景: 由于线上用户反馈媒体添加页加载时间很长,猜测是由于本地视频内存过大引起,于是编写此脚本以便快速生成内存很大的视频 代码如下: # coding=utf-8 from moviepy.edi ...
- zk源码—6.Leader选举的实现原理
大纲 1.zk是如何实现数据一致性的 (1)数据一致性分析 (2)实现数据一致性的广播模式 (3)实现数据一致性的恢复模式 2.zk是如何进行Leader选举的 (1)服务器启动时的Leader选举 ...
- RocketMQ消息是如何存储的
RocketMQ的消息存储是一个复杂而高效的过程,设计上充分考虑了性能和扩展性, 消息存储的主要组件包括CommitLog文件.消费队列文件(ConsumerQueue).以及索引文件(IndexFi ...
- FastAPI与SQLAlchemy同步数据库集成
title: FastAPI与SQLAlchemy同步数据库集成 date: 2025/04/15 01:27:37 updated: 2025/04/15 01:27:37 author: cmdr ...
- GeoIP库商业版调研-支持IPV6
背景 因需要支持ipv6网络,目前所使用的GeoIP库无法解析或者很少量的能解析出IPV6的IP地址位置信息,所以需要更新最新的GeoIP库文件.目的配置在Nginx或者服务直接调用使用,从而获取城市 ...