热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java聊天室之使用Socket实现传递对象

这篇文章主要为大家详细介绍了Java简易聊天室之使用Socket实现传递对象功能,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以了解一下

一、题目描述

题目实现:使用网络编程时,需要通过Socket传递对象。

二、解题思路

创建一个类:Student,实现序列化

​ Student类包含两个属性及对应的get()和set()方法

创建一个服务器类:ServerSocketFrame,继承JFrame类

写一个getserver() 方法,实例化Socket对象,启用9527当服务的端口。

创建输入流对象,用来接收客户端信息。

再定义一个getClientInfo()方法,用于接收客户端发送的信息。

对文本框添加一个事件:实现向客户端发磅信息。

创建一个客户端类:ClientSocketFrame,继承JFrame类。

写一个connect() 方法,实例化Socket对象,连接本地服务的9527端口服务。

再定义一个getClientInfo()方法,用于接收服务端发送的信息。

技术重点:

在Java中使用Socket传递对象时,该对象必须是序列化的,在Java中实现Serializable接口的类,创建的对象就是序列化对象,可以通过Socket进行传递,从而实现了使用Socket传递对象的功能。 Serializable接口在javaio包中,该接口没有方法,只是用于标识对象是可序列化的。该接口的定义如下: public interface Serializable 使用Serializable接口,可以创建序列化类。

三、代码详解

Student

package com.xiaoxuzhu;
import java.io.Serializable;
/**
 * Description: 
 *
 * @author xiaoxuzhu
 * @version 1.0
 *
 * 
 * 修改记录:
 * 修改后版本	        修改人		修改日期			修改内容
 * 2022/6/4.1	    xiaoxuzhu		2022/6/4		    Create
 * 
* @date 2022/6/4 */ public class Student implements Serializable { // 序列化对象类 private String id; // 类的成员变量 private String name;// 类的成员变量 public String getId() { // 成员变量的getter方法 return id; } public void setId(String id) {// 成员变量的setter方法 this.id = id; } public String getName() {// 成员变量的getter方法 return name; } public void setName(String name) {// 成员变量的setter方法 this.name = name; } }

ServerSocketFrame

package com.xiaoxuzhu;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.*;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
/**
 * Description: 
 *
 * @author xiaoxuzhu
 * @version 1.0
 *
 * 
 * 修改记录:
 * 修改后版本	        修改人		修改日期			修改内容
 * 2022/6/4.1	    xiaoxuzhu		2022/6/4		    Create
 * 
* @date 2022/6/4 */ public class ServerSocketFrame extends JFrame { private JTextField tf_name; private JTextField tf_id; private JTextArea ta_info; private ObjectOutputStream out = null; // 创建流对象 private ObjectInputStream in = null; // 创建流对象 private ServerSocket server; // 声明ServerSocket对象 private Socket socket; // 声明Socket对象socket public void getserver() { try { server = new ServerSocket(9527); // 实例化Socket对象 ta_info.append("服务器套接字已经创建成功\n"); // 输出信息 while (true) { // 如果套接字是连接状态 ta_info.append("等待客户机的连接......\n"); // 输出信息 socket = server.accept(); // 实例化Socket对象 ta_info.append("客户机连接成功\n"); // 输出信息 out = new ObjectOutputStream(socket.getOutputStream()); in = new ObjectInputStream(socket.getInputStream()); getClientInfo(); // 调用getClientInfo()方法 } } catch (Exception e) { e.printStackTrace(); // 输出异常信息 } } private void getClientInfo() { try { while (true) { // 如果套接字是连接状态 Student stud = (Student)in.readObject(); if (stud!=null) ta_info.append("接收到客户机发送的 编号为:" + stud.getId() + " 名称为:" +stud.getName() + "\n"); // 获得客户端信息 } } catch (Exception e) { ta_info.append("客户端已退出。\n"); // 输出异常信息 } finally { try { if (in != null) { in.close();// 关闭流 } if (socket != null) { socket.close(); // 关闭套接字 } } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) { // 主方法 ServerSocketFrame frame = new ServerSocketFrame(); // 创建本类对象 frame.setVisible(true); frame.getserver(); // 调用方法 } public ServerSocketFrame() { super(); setTitle("服务器端程序"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 379, 260); final JScrollPane scrollPane = new JScrollPane(); getContentPane().add(scrollPane, BorderLayout.CENTER); ta_info = new JTextArea(); scrollPane.setViewportView(ta_info); final JPanel panel = new JPanel(); getContentPane().add(panel, BorderLayout.NORTH); final JLabel label = new JLabel(); label.setText("编号:"); panel.add(label); tf_id = new JTextField(); tf_id.setPreferredSize(new Dimension(70,25)); panel.add(tf_id); final JLabel label_1 = new JLabel(); label_1.setText("名称:"); panel.add(label_1); tf_name = new JTextField(); tf_name.setPreferredSize(new Dimension(100,25)); panel.add(tf_name); final JButton button = new JButton(); button.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { Student stud = new Student(); stud.setId(tf_id.getText()); stud.setName(tf_name.getText()); try { out.writeObject(stud); } catch (IOException e1) { e1.printStackTrace(); } ta_info.append("服务器发送的 编号是:" + tf_id.getText() + " 名称是:"+tf_name.getText()+"\n"); // 将文本框中信息显示在文本域中 tf_id.setText(null); // 将文本框清空 tf_name.setText(null); } }); button.setText("发 送"); panel.add(button); } }

ClientSocketFrame

package com.xiaoxuzhu;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import javax.swing.*;

/**
 * Description: 
 *
 * @author xiaoxuzhu
 * @version 1.0
 *
 * 
 * 修改记录:
 * 修改后版本	        修改人		修改日期			修改内容
 * 2022/6/4.1	    xiaoxuzhu		2022/6/4		    Create
 * 
* @date 2022/6/4 */ public class ClientSocketFrame extends JFrame { // 创建类继承JFrame类 private JButton button; private JTextField tf_name; private JLabel label_1; private JLabel label; private JPanel panel; private ObjectInputStream in = null;// 创建流对象 private ObjectOutputStream out = null;// 创建流对象 private Socket socket;// 声明Socket对象 private JTextArea ta_info = new JTextArea();// 创建JtextArea对象 private JTextField tf_id = new JTextField();// 创建JtextField对象 private Container cc;// 声明Container对象 public ClientSocketFrame() { // 构造方法 super(); // 调用父类的构造方法 setTitle("客户端程序"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 373, 257); cc = this.getContentPane(); // 实例化对象 final JScrollPane scrollPane = new JScrollPane(); getContentPane().add(scrollPane, BorderLayout.CENTER); scrollPane.setViewportView(ta_info); getContentPane().add(getPanel(), BorderLayout.NORTH); } private void connect() { // 连接套接字方法 ta_info.append("尝试连接......\n"); // 文本域中信息信息 try { // 捕捉异常 socket = new Socket("127.0.0.1", 9527); // 实例化Socket对象 while (true){ out = new ObjectOutputStream(socket.getOutputStream()); in = new ObjectInputStream(socket.getInputStream()); ta_info.append("完成连接。\n"); // 文本域中提示信息 getClientInfo(); } } catch (Exception e) { e.printStackTrace(); // 输出异常信息 } } public static void main(String[] args) { // 主方法 ClientSocketFrame clien = new ClientSocketFrame(); // 创建本例对象 clien.setVisible(true); // 将窗体显示 clien.connect(); // 调用连接方法 } private void getClientInfo() { try { while (true) { // 如果套接字是连接状态 Student stud = (Student)in.readObject(); if (stud!=null) ta_info.append("接收到服务器发送的 编号为:" + stud.getId() + " 名称为:" +stud.getName() + "\n"); // 获得服务器信息 } } catch (Exception e) { e.printStackTrace(); } finally { try { if (in != null) { in.close();// 关闭流 } if (socket != null) { socket.close(); // 关闭套接字 } } catch (IOException e) { e.printStackTrace(); } } } /** * @return */ protected JPanel getPanel() { if (panel == null) { panel = new JPanel(); panel.add(getLabel()); tf_id.setPreferredSize(new Dimension(70, 25)); panel.add(tf_id); panel.add(getLabel_1()); panel.add(getTf_name()); panel.add(getButton()); } return panel; } /** * @return */ protected JLabel getLabel() { if (label == null) { label = new JLabel(); label.setText("编号:"); } return label; } /** * @return */ protected JLabel getLabel_1() { if (label_1 == null) { label_1 = new JLabel(); label_1.setText("名称:"); } return label_1; } /** * @return */ protected JTextField getTf_name() { if (tf_name == null) { tf_name = new JTextField(); tf_name.setPreferredSize(new Dimension(100, 25)); } return tf_name; } /** * @return */ protected JButton getButton() { if (button == null) { button = new JButton(); button.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { Student stud = new Student(); stud.setId(tf_id.getText()); stud.setName(tf_name.getText()); try { out.writeObject(stud); } catch (IOException e1) { e1.printStackTrace(); } ta_info.append("客户端发送的 编号是:" + tf_id.getText() + " 名称是:"+tf_name.getText()+"\n"); // 将文本框中信息显示在文本域中 tf_id.setText(null); // 将文本框清空 tf_name.setText(null); } }); button.setText("发 送"); } return button; } }

服务器启动

客户端连接

服务器发送学生信息

客户端接收学生信息

客户端发送学生信息

服务端接收学生信息

到此这篇关于Java聊天室之使用Socket实现传递对象的文章就介绍到这了,更多相关Java聊天室内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文介绍了一款名为TimeSelector的Android日期时间选择器,采用了Material Design风格,可以在Android Studio中通过gradle添加依赖来使用,也可以在Eclipse中下载源码使用。文章详细介绍了TimeSelector的构造方法和参数说明,以及如何使用回调函数来处理选取时间后的操作。同时还提供了示例代码和可选的起始时间和结束时间设置。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 本文介绍了如何使用elementui分页组件进行分页功能的改写,只需一行代码即可调用。通过封装分页组件,避免在每个页面都写跳转请求的重复代码。详细的代码示例和使用方法在正文中给出。 ... [详细]
  • 本文介绍了在Cpp中将字符串形式的数值转换为int或float等数值类型的方法,主要使用了strtol、strtod和strtoul函数。这些函数可以将以null结尾的字符串转换为long int、double或unsigned long类型的数值,且支持任意进制的字符串转换。相比之下,atoi函数只能转换十进制数值且没有错误返回。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
author-avatar
ian
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有