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实现简易聊天室的更多相关文章

  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. 【oracle】drop,truncate,delete用法

    drop: drop table 表名:删表 truncate: truncate table 表名:清空数据 delete: delete table 表名 [where 条件]:删某数据 日志:d ...

  2. Springboot之自定义配置

    SpringBoot自定义配置 springboot在这里就不过多介绍了,大家都应该了解springboot零配置文件,所以配置信息都装配在属性文件(properties.yml.yaml)中,有时我 ...

  3. 【BigData】Java基础_方法的定义与使用

    1.概念 Java语言中的“方法”(Method)在其他语言当中也可能被称为“函数”(Function).对于一些复杂的代码逻辑,如果希望重复使用这些代码,并且做到“随时任意使用”,那么就可以将这些代 ...

  4. Salesforce 开发整理(三)权限共享

    Salesforce提供对象的访问权限可以通过 安全性控制 → 共享设置,可以查看每个对象在系统内部默认的访问权限 共用读写:对象的记录任何用户都可以进行读写操作 公用只读:对象的记录任何用户都可以查 ...

  5. Java设计模式-Builder构造者模式

    介绍: 构造者模式,又称之为建造者模式,建造者模式,单例模式以及工厂模式都属于创建型模式1应用场景 今天学mybatis的时候,知道了SQLSessionFactory使用的是builder模式来生成 ...

  6. Certification information不能过大

    /* If certification information is too big this event can't be transmitted as it would cause failure ...

  7. 【技术博客】Django中文件下载的实现

    开发组在开发过程中,都不可避免地遇到了一些困难或问题,但都最终想出办法克服了.我们认为这样的经验是有必要记录下来的,因此就有了[技术博客]. Django中文件下载的实现 1.背景 在VisualPy ...

  8. 冰多多团队Gamma阶段发布说明

    Bingduoduo 语音Coding(Gamma):项目Github地址 Gamma版本新功能介绍 在gamma阶段我们推出了一个更加完整的IDE,完善了部分编辑器功能,并且优化了UI,增添了新的s ...

  9. shell (二) shell for循环

    for循环 基本示例 for i in var1 var2 var2 do echo $i done for i in {1..100} do echo $i done 列表中复杂值,可以使用引号或者 ...

  10. 【python学习案例】python判断自身是否正在运行

    需要引入psutil包: 实现思路: 1)用os.getpid()获取当前程序运行PID,将PID存入文件中 2)用psutil模块获取当前系统所有正在运行的pid 3)读取之前存入的PID,判断该P ...