Java实现简易聊天室
Java实现简易聊天室
在学习《Java从入门到精通》这本书,网络通信,基于TCP实现的简易聊天室,我这里对书中的代码略做了修改,做个记录。
这里先放一下运行效果图,代码放在最后。
运行效果:
先启动服务器端:
启动客户端:
发送数据:
主要的功能就是上面那些,在代码中我还添加一些功能,比如说给JTextField添加了焦点监听器,以及输入框为空的检查和提示,但总的来说还是比较简单,如果要实现健壮的聊天室程序还需要再做些修改。
下面放下代码,比较简单,就服务器端和客户端两个代码。
服务器端代码:
- import java.io.BufferedReader;
- import java.io.InputStreamReader;
- import java.net.ServerSocket;
- import java.net.Socket;
- import static java.lang.System.out;
- public class MyTcp {
- private BufferedReader reader;
- private ServerSocket server;
- private Socket socket;
- void getServer(){
- try {
- server=new ServerSocket(8998); //实例化Socket对象
- out.println("服务器套接字已创建成功");
- while(true) {
- out.println("等待客户机的连接");
- socket=server.accept(); //accept()方法会返回一个和客户端Socket对象相连的Socket对象
- reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
- getClientMessage();
- }
- }catch(Exception e) {
- e.printStackTrace();
- }
- }
- //读取客户端发送过来的信息
- private void getClientMessage() {
- try {
- while(true) {
- //获得客户端信息
- out.println("客户机:"+reader.readLine());
- }
- }catch(Exception e) {
- e.printStackTrace();
- }
- try {
- if(reader!=null) {
- reader.close();
- }
- if(socket!=null) {
- socket.close();
- }
- }catch(Exception e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- MyTcp tcp=new MyTcp();
- tcp.getServer();
- }
- }
客户端代码:
- import java.awt.BorderLayout;
- import java.awt.Color;
- import java.awt.Container;
- import java.awt.EventQueue;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.awt.event.FocusEvent;
- import java.awt.event.FocusListener;
- import java.io.PrintWriter;
- import java.net.Socket;
- import javax.swing.JFrame;
- import javax.swing.JOptionPane;
- import javax.swing.JScrollPane;
- import javax.swing.JTextArea;
- import javax.swing.JTextField;
- import javax.swing.border.BevelBorder;
- public class MyClient extends JFrame{
- private PrintWriter writer;
- Socket socket;
- private JTextArea ta=new JTextArea();
- private JTextField tf=new JTextField();
- Container cc;
- public MyClient(String title) {
- super(title);
- setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- cc=this.getContentPane();
- final JScrollPane scrollPane=new JScrollPane();
- scrollPane.setBorder(new BevelBorder(BevelBorder.RAISED));
- getContentPane().add(scrollPane,BorderLayout.CENTER);
- scrollPane.setViewportView(ta);
- cc.add(tf,"South");
- tf.addFocusListener(new JTextFieldListener(tf,"请在此输入内容"));
- tf.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- if(tf.getText().isEmpty()) {
- JOptionPane.showMessageDialog(MyClient.this, "请输入内容!");
- }else {
- writer.println(tf.getText());
- ta.append(tf.getText()+"\n");
- ta.setSelectionEnd(ta.getText().length());
- tf.setText("");
- }
- }
- });
- }
- //焦点监听器
- class JTextFieldListener implements FocusListener{
- private String hintText; //提示文字
- private JTextField textField;
- public JTextFieldListener(JTextField textField,String hintText) {
- this.textField=textField;
- this.hintText=hintText;
- textField.setText(hintText); //默认直接显示
- textField.setForeground(Color.GRAY);
- }
- @Override
- public void focusGained(FocusEvent e) {
- //获取焦点时,清空提示内容
- String temp=textField.getText();
- if(temp.equals(hintText)){
- textField.setText("");
- textField.setForeground(Color.BLACK);
- }
- }
- @Override
- public void focusLost(FocusEvent e) {
- //失去焦点时,没有输入内容,显示提示内容
- String temp=textField.getText();
- if(temp.equals("")) {
- textField.setForeground(Color.GRAY);
- textField.setText(hintText);
- }
- }
- }
- private void connect() {
- ta.append("尝试连接\n");
- try {
- socket=new Socket("127.0.0.1",8998);
- writer=new PrintWriter(socket.getOutputStream(),true);
- ta.append("完成连接\n");
- }catch(Exception e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- //EventQueue事件队列,封装了异步事件指派机制
- EventQueue.invokeLater(new Runnable(){
- public void run() {
- MyClient client=new MyClient("向服务器发送数据");
- client.setSize(400,400);
- client.setVisible(true);
- client.connect();
- }
- });
- }
- }
启动的时候要注意先启动服务器端再启动客户端,不然会报错。
菜鸟还需要不断学习。
Java实现简易聊天室的更多相关文章
- 学习JavaSE TCP/IP协议与搭建简易聊天室
一.TCP/IP协议 1.TCP/IP协议包括TCP.IP和UDP等 2.域名通过dns服务器转换为IP地址 3.局域网可以通过IP或者主机地址寻找到相应的主机 4.TCP是可靠的连接,效率低,且连接 ...
- Socket实现简易聊天室,Client,Server
package seday08; import java.io.BufferedWriter;import java.io.OutputStream;import java.io.OutputStre ...
- php+websocket搭建简易聊天室实践
1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短 ...
- node.js+websocket实现简易聊天室
(文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) websocket提供了一种全双工客户端服务器的异步通信方法,这种通信方法使用ws或者wss协议,可 ...
- php_D3_“简易聊天室 ”实现的关键技术 详解
PHP+MySQL实现Internet上一个简易聊天室的关键技术 系统目标: 聊天室使用数据库汇集每个人的发言,并可将数据库内的发言信息显示在页面,让每个用户都可 ...
- Python开发【笔记】:aiohttp搭建简易聊天室
简易聊天室: 1.入口main.py import logging import jinja2 import aiohttp_jinja2 from aiohttp import web from a ...
- 示例:Socket应用之简易聊天室
在实际应用中,Server总是在指定的端口上监听是否有Client请求,一旦监听到Client请求,Server就会启动一个线程来响应该请求,而Server本身在启动完线程之后马上又进入监听状态. 示 ...
- node+websocket创建简易聊天室
关于websocket的介绍太多,在这就不一一介绍了,本文主要实现通过websocket创建一个简易聊天室,就是90年代那种聊天室 服务端 1.安装ws模块,uuid模块,ws是websocket模块 ...
- 基于Node.js + WebSocket 的简易聊天室
代码地址如下:http://www.demodashi.com/demo/13282.html Node.js聊天室运行说明 Node.js的本质就是运行在服务端的JavaScript.Node.js ...
随机推荐
- CF Educational Round 78 (Div2)题解报告A~E
CF Educational Round 78 (Div2)题解报告A~E A:Two Rival Students 依题意模拟即可 #include<bits/stdc++.h> us ...
- 无旋treap大法好
无旋Treap大法好 原理? 是一棵二叉查找树: 一个节点左子树权值都比他小,右子树权值都比他大 所以可以维护序列(以位置为权值),或数值(以数值为权值) 是一个堆: 每个节点除了上述提到的权值外,还 ...
- vue中异步请求渲染问题(swiper不轮播)(在开发过程中遇到过什么问题、踩过的坑)
问题描述: 用vue封装一个swiper组件的时候,发现轮播图不能轮播了. 原因: 异步请求的时间远大于生命周期执行的时间,mounted初始化DOM时数据未返回,渲染数据是空数组,导致轮播图的容器层 ...
- selenium--操作JS弹框
前戏 我们常见的弹框有三种,一种是alert弹框,一种是prompt弹框,还有一种是confirm弹框那他们有什么不同呢?不同点就是他们长的不一样,alert弹框有一段文字和一个确定按钮,如下 在来看 ...
- 洛谷P2341 [HAOI2006]受欢迎的牛|【模板】强连通分量
https://www.luogu.org/problem/P2341 缩点之后唯一 一个出度为0的点 #include<cstdio> #include<iostream> ...
- Python、Spyder的环境搭建
有什么不对欢迎大家指出,一起交流啊,只针对Windows!!!!(苹果买不起...)Python安装的话2.7版本和3.6版本都可以,虽然2.7比较全面,但还是建议安装3.6,这里以3.6为例进行介绍 ...
- 2017年计算语义相似度最新论文,击败了siamese lstm,非监督学习
Page 1Published as a conference paper at ICLR 2017AS IMPLE BUT T OUGH - TO -B EAT B ASELINE FOR S EN ...
- [转帖]【mount】Linux根目录空间不足
[mount]Linux根目录空间不足 2019.04.15 21:30:47字数 1094阅读 107 一.问题背景 一台数据库服务器,突然监控告警,报根目录空间不足(no space left o ...
- idea 添加默认注释
- VueTreeselect出现unknown解决方法
VueTreeselect 控件显示[unknown]如图: treeselect 绑定的值需要与options输出的id相对应,若是空值,请不要给空字符串,0,等,因为会出现unknown,并且当选 ...