Socket编程
时间:2019-12-18
本文章向大家介绍Socket编程,主要包括Socket编程使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、前提
多台客户端 / 服务器 之间传递实体类的序列化对象
需要实现四个类,即服务器类,线程类,客户端类及实体类
注:实体类需实现接口:implements Serializable
二、服务器类
服务器类,需要实现两个类:ServerSocket 和 Socket 。且 ServerSocket 初始化需要给个参数(端口号)
.accept() 方法是阻塞当前 socket 对象(socket 在最后是需要关闭的)。处于等待状态,直到客户端发过来信息唤醒它
1 public class Servlet {
2
3 public static void main(String[] args) {
4 // 服务器
5 try {
6
7 ServerSocket serverSocket = new ServerSocket(5000);
8 Socket socket = new Socket();
9
10 // 无限循环,服务器保持开启状态
11 while(true){
12 socket = serverSocket.accept();
13 ScoktThread st = new ScoktThread(socket);
14 st.start();
15 }
16 } catch (IOException e) {
17 e.printStackTrace();
18 }
19 }
20 }
三、线程类
在有参构造方法中初始化 Socket 对象。此线程类根据启动该线程对象来对该对象进行一系列操作。
1 public class ScoktThread extends Thread{
2
3 private Socket socket;
4
5 public ScoktThread(Socket socket) {
6 super();
7 this.socket = socket;
8 }
9
10 @Override
11 public void run() {
12 // TODO Auto-generated method stub
13 super.run();
14 InputStream is = null;
15 ObjectInputStream ois =null;
16 OutputStream os =null;
17
18 try {
19 // 获取客户端发来的信息
20 is = socket.getInputStream();
21 ois = new ObjectInputStream(is);
22 User user = (User) ois.readObject();
23 System.out.println("成功接收到客户端信息:"+user.getUserName()+"-"+user.getPwd());
24
25 // 获取客户端信息
26 InetAddress id = socket.getInetAddress();
27 String ip = id.getHostAddress();
28 System.out.println("客户 ip 地址:"+ip);
29
30 // 反馈信息
31 String restr = "我是服务器,欢迎你加入";
32 os = socket.getOutputStream();
33 os.write(restr.getBytes());
34
35 } catch (IOException e) {
36 e.printStackTrace();
37 } catch (ClassNotFoundException e) {
38 e.printStackTrace();
39 } finally {
40 try {
41 ois.close();
42 is.close();
43 socket.close();
44 } catch (IOException e) {
45 e.printStackTrace();
46 }
47 }
48 }
49 }
四、客户端类
客户端类,需要实现 Socket 类。初始化时需要两个参数:要连接服务器的 ip 地址(localhost,即127.0.0.1 是本地地址)+对应的端口号
1 public static void main(String[] args) {
2 // 客户端
3 Socket socket;
4 try {
5 socket = new Socket("localhost",5000);
6
7 OutputStream os = socket.getOutputStream();
8 ObjectOutputStream oos = new ObjectOutputStream(os);
9 User user = new User("小居","居先生");
10 oos.writeObject(user);
11
12 // 成功发送后需要暂时关闭输出流
13 socket.shutdownOutput();
14
15 InputStream in = socket.getInputStream();
16 BufferedReader br = new BufferedReader(new InputStreamReader(in));
17 String str = null;
18 while((str = br.readLine())!=null){
19 System.out.println(str);
20 }
21
22 br.close();
23 in.close();
24 oos.close();
25 os.close();
26 socket.close();
27
28
29 } catch (UnknownHostException e1) {
30 e1.printStackTrace();
31 } catch (IOException e1) {
32 e1.printStackTrace();
33 }
34 }
五、实体类(不重要)
实体类仅需注意,要实现 Serializable 接口。
1 /**
2 * 用户类
3 * @author ice_debj
4 *
5 */
6 public class User implements Serializable{
7
8 /**
9 *
10 */
11 private static final long serialVersionUID = 3144628657162072787L;
12 private String userName;
13 private String pwd;
14
15 public User() {
16 super();
17 }
18 public User(String userName, String pwd) {
19 super();
20 this.userName = userName;
21 this.pwd = pwd;
22 }
23
24 public String getUserName() {
25 return userName;
26 }
27 public void setUserName(String userName) {
28 this.userName = userName;
29 }
30 public String getPwd() {
31 return pwd;
32 }
33 public void setPwd(String pwd) {
34 this.pwd = pwd;
35 }
36 }
六、总结
原文地址:https://www.cnblogs.com/debjJava/p/12061709.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用Azure人脸API对图片进行人脸识别
- 视频综合管理平台EasyNVS显示的rtsp和rtmp穿透地址错误如何解决?
- 开发RTSP协议视频平台EasyNVR采用ffmpeg集成fdk-aac报no member named “encoderDelay”
- 微信小程序开发实战(17):用画布画一张笑脸
- PHP中Session ID的实现原理分析和实例解析
- 【好文推荐】黑莓OS手册是如何详细阐述底层的进程和线程模型的?
- 简析Spark Streaming/Flink的Kafka动态感知
- 微信小程序开发实战(19):页面导航
- Kotlin:02-函数的声明
- 「MoreThanJava」Day 5:面向对象进阶—继承详解
- 要点1:指针、数组和复合字面量
- akka-typed(9) - 业务分片、整合,谈谈lagom, 需要吗?
- com-IFileDlg 进行文件的 打开或者保存
- 哆啦A梦?不好记!安利一下Prometheus这款开源的企业监控报警平台
- Kotlin:03-变量、常量、数据类型