Java实现简易聊天室

在学习《Java从入门到精通》这本书,网络通信,基于TCP实现的简易聊天室,我这里对书中的代码略做了修改,做个记录。

这里先放一下运行效果图,代码放在最后。

运行效果:

先启动服务器端:

启动客户端:

发送数据:

主要的功能就是上面那些,在代码中我还添加一些功能,比如说给JTextField添加了焦点监听器,以及输入框为空的检查和提示,但总的来说还是比较简单,如果要实现健壮的聊天室程序还需要再做些修改。

下面放下代码,比较简单,就服务器端和客户端两个代码。

服务器端代码:

  1. import java.io.BufferedReader;
  2. import java.io.InputStreamReader;
  3. import java.net.ServerSocket;
  4. import java.net.Socket;
  5. import static java.lang.System.out;
  6.  
  7. public class MyTcp {
  8.  
  9. private BufferedReader reader;
  10. private ServerSocket server;
  11. private Socket socket;
  12.  
  13. void getServer(){
  14. try {
  15. server=new ServerSocket(8998); //实例化Socket对象
  16. out.println("服务器套接字已创建成功");
  17.  
  18. while(true) {
  19. out.println("等待客户机的连接");
  20. socket=server.accept(); //accept()方法会返回一个和客户端Socket对象相连的Socket对象
  21. reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
  22. getClientMessage();
  23. }
  24. }catch(Exception e) {
  25. e.printStackTrace();
  26. }
  27. }
  28.  
  29. //读取客户端发送过来的信息
  30. private void getClientMessage() {
  31. try {
  32. while(true) {
  33. //获得客户端信息
  34. out.println("客户机:"+reader.readLine());
  35. }
  36. }catch(Exception e) {
  37. e.printStackTrace();
  38. }
  39. try {
  40. if(reader!=null) {
  41. reader.close();
  42. }
  43. if(socket!=null) {
  44. socket.close();
  45. }
  46. }catch(Exception e) {
  47. e.printStackTrace();
  48. }
  49. }
  50.  
  51. public static void main(String[] args) {
  52. MyTcp tcp=new MyTcp();
  53. tcp.getServer();
  54. }
  55.  
  56. }

客户端代码:

  1. import java.awt.BorderLayout;
  2. import java.awt.Color;
  3. import java.awt.Container;
  4. import java.awt.EventQueue;
  5. import java.awt.event.ActionEvent;
  6. import java.awt.event.ActionListener;
  7. import java.awt.event.FocusEvent;
  8. import java.awt.event.FocusListener;
  9. import java.io.PrintWriter;
  10. import java.net.Socket;
  11.  
  12. import javax.swing.JFrame;
  13. import javax.swing.JOptionPane;
  14. import javax.swing.JScrollPane;
  15. import javax.swing.JTextArea;
  16. import javax.swing.JTextField;
  17. import javax.swing.border.BevelBorder;
  18.  
  19. public class MyClient extends JFrame{
  20.  
  21. private PrintWriter writer;
  22. Socket socket;
  23. private JTextArea ta=new JTextArea();
  24. private JTextField tf=new JTextField();
  25. Container cc;
  26.  
  27. public MyClient(String title) {
  28. super(title);
  29. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  30. cc=this.getContentPane();
  31.  
  32. final JScrollPane scrollPane=new JScrollPane();
  33. scrollPane.setBorder(new BevelBorder(BevelBorder.RAISED));
  34. getContentPane().add(scrollPane,BorderLayout.CENTER);
  35. scrollPane.setViewportView(ta);
  36. cc.add(tf,"South");
  37.  
  38. tf.addFocusListener(new JTextFieldListener(tf,"请在此输入内容"));
  39. tf.addActionListener(new ActionListener() {
  40. public void actionPerformed(ActionEvent e) {
  41. if(tf.getText().isEmpty()) {
  42. JOptionPane.showMessageDialog(MyClient.this, "请输入内容!");
  43. }else {
  44. writer.println(tf.getText());
  45.  
  46. ta.append(tf.getText()+"\n");
  47. ta.setSelectionEnd(ta.getText().length());
  48. tf.setText("");
  49. }
  50.  
  51. }
  52. });
  53. }
  54.  
  55. //焦点监听器
  56. class JTextFieldListener implements FocusListener{
  57.  
  58. private String hintText; //提示文字
  59. private JTextField textField;
  60.  
  61. public JTextFieldListener(JTextField textField,String hintText) {
  62. this.textField=textField;
  63. this.hintText=hintText;
  64. textField.setText(hintText); //默认直接显示
  65. textField.setForeground(Color.GRAY);
  66. }
  67.  
  68. @Override
  69. public void focusGained(FocusEvent e) {
  70.  
  71. //获取焦点时,清空提示内容
  72. String temp=textField.getText();
  73. if(temp.equals(hintText)){
  74. textField.setText("");
  75. textField.setForeground(Color.BLACK);
  76. }
  77.  
  78. }
  79.  
  80. @Override
  81. public void focusLost(FocusEvent e) {
  82.  
  83. //失去焦点时,没有输入内容,显示提示内容
  84. String temp=textField.getText();
  85. if(temp.equals("")) {
  86. textField.setForeground(Color.GRAY);
  87. textField.setText(hintText);
  88. }
  89.  
  90. }
  91.  
  92. }
  93.  
  94. private void connect() {
  95. ta.append("尝试连接\n");
  96. try {
  97. socket=new Socket("127.0.0.1",8998);
  98. writer=new PrintWriter(socket.getOutputStream(),true);
  99.  
  100. ta.append("完成连接\n");
  101.  
  102. }catch(Exception e) {
  103. e.printStackTrace();
  104. }
  105. }
  106.  
  107. public static void main(String[] args) {
  108.  
  109. //EventQueue事件队列,封装了异步事件指派机制
  110. EventQueue.invokeLater(new Runnable(){
  111. public void run() {
  112. MyClient client=new MyClient("向服务器发送数据");
  113. client.setSize(400,400);
  114. client.setVisible(true);
  115. client.connect();
  116.  
  117. }
  118. });
  119.  
  120. }
  121.  
  122. }

启动的时候要注意先启动服务器端再启动客户端,不然会报错。

菜鸟还需要不断学习。

Java实现简易聊天室的更多相关文章

  1. 学习JavaSE TCP/IP协议与搭建简易聊天室

    一.TCP/IP协议 1.TCP/IP协议包括TCP.IP和UDP等 2.域名通过dns服务器转换为IP地址 3.局域网可以通过IP或者主机地址寻找到相应的主机 4.TCP是可靠的连接,效率低,且连接 ...

  2. Socket实现简易聊天室,Client,Server

    package seday08; import java.io.BufferedWriter;import java.io.OutputStream;import java.io.OutputStre ...

  3. php+websocket搭建简易聊天室实践

    1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短 ...

  4. node.js+websocket实现简易聊天室

    (文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) websocket提供了一种全双工客户端服务器的异步通信方法,这种通信方法使用ws或者wss协议,可 ...

  5. php_D3_“简易聊天室 ”实现的关键技术 详解

                      PHP+MySQL实现Internet上一个简易聊天室的关键技术  系统目标: 聊天室使用数据库汇集每个人的发言,并可将数据库内的发言信息显示在页面,让每个用户都可 ...

  6. Python开发【笔记】:aiohttp搭建简易聊天室

    简易聊天室: 1.入口main.py import logging import jinja2 import aiohttp_jinja2 from aiohttp import web from a ...

  7. 示例:Socket应用之简易聊天室

    在实际应用中,Server总是在指定的端口上监听是否有Client请求,一旦监听到Client请求,Server就会启动一个线程来响应该请求,而Server本身在启动完线程之后马上又进入监听状态. 示 ...

  8. node+websocket创建简易聊天室

    关于websocket的介绍太多,在这就不一一介绍了,本文主要实现通过websocket创建一个简易聊天室,就是90年代那种聊天室 服务端 1.安装ws模块,uuid模块,ws是websocket模块 ...

  9. 基于Node.js + WebSocket 的简易聊天室

    代码地址如下:http://www.demodashi.com/demo/13282.html Node.js聊天室运行说明 Node.js的本质就是运行在服务端的JavaScript.Node.js ...

随机推荐

  1. CF Educational Round 78 (Div2)题解报告A~E

    CF Educational Round 78 (Div2)题解报告A~E A:Two Rival Students​ 依题意模拟即可 #include<bits/stdc++.h> us ...

  2. 无旋treap大法好

    无旋Treap大法好 原理? 是一棵二叉查找树: 一个节点左子树权值都比他小,右子树权值都比他大 所以可以维护序列(以位置为权值),或数值(以数值为权值) 是一个堆: 每个节点除了上述提到的权值外,还 ...

  3. vue中异步请求渲染问题(swiper不轮播)(在开发过程中遇到过什么问题、踩过的坑)

    问题描述: 用vue封装一个swiper组件的时候,发现轮播图不能轮播了. 原因: 异步请求的时间远大于生命周期执行的时间,mounted初始化DOM时数据未返回,渲染数据是空数组,导致轮播图的容器层 ...

  4. selenium--操作JS弹框

    前戏 我们常见的弹框有三种,一种是alert弹框,一种是prompt弹框,还有一种是confirm弹框那他们有什么不同呢?不同点就是他们长的不一样,alert弹框有一段文字和一个确定按钮,如下 在来看 ...

  5. 洛谷P2341 [HAOI2006]受欢迎的牛|【模板】强连通分量

    https://www.luogu.org/problem/P2341 缩点之后唯一 一个出度为0的点 #include<cstdio> #include<iostream> ...

  6. Python、Spyder的环境搭建

    有什么不对欢迎大家指出,一起交流啊,只针对Windows!!!!(苹果买不起...)Python安装的话2.7版本和3.6版本都可以,虽然2.7比较全面,但还是建议安装3.6,这里以3.6为例进行介绍 ...

  7. 2017年计算语义相似度最新论文,击败了siamese lstm,非监督学习

    Page 1Published as a conference paper at ICLR 2017AS IMPLE BUT T OUGH - TO -B EAT B ASELINE FOR S EN ...

  8. [转帖]【mount】Linux根目录空间不足

    [mount]Linux根目录空间不足 2019.04.15 21:30:47字数 1094阅读 107 一.问题背景 一台数据库服务器,突然监控告警,报根目录空间不足(no space left o ...

  9. idea 添加默认注释

  10. VueTreeselect出现unknown解决方法

    VueTreeselect 控件显示[unknown]如图: treeselect 绑定的值需要与options输出的id相对应,若是空值,请不要给空字符串,0,等,因为会出现unknown,并且当选 ...