本文为大家分享了java实现简单聊天软件的具体代码,供大家参考,具体内容如下

介绍

这是我自己学习Socket时写的,用到了多线程,Socket的知识,还有Java的IO技术,并且做了一个Java的UI,废话不多说,先上效果图

SendThread

这个类是用来实现数据的发送的,当按键按下时,会调用sendMessage方法

public class SendThread {

ChatWindow chatWindow;

private String remoteIP = "";

private int port = 0;

private String message = "";

public SendThread(int port,ChatWindow window) {

chatWindow = window;

}

public void notRun() {

InetSocketAddress isa = new InetSocketAddress(remoteIP, port);

try {

Socket socket = new Socket();

socket.connect(isa);

OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream());

writer.write(message);

writer.flush();

writer.close();

System.out.println("将数据写入到流中");

} catch (IOException e) {

e.printStackTrace();

}finally{

message = "";

}

}

public void senMessage(String host,int port,String message){

remoteIP = host;

this.port = port;

this.message = message;

notRun();

}

}

ReceiveThread

这个类实现的功能是维护一个阻塞线程,来对端口进行监听,接受收到的信息,每当收到信息时,都会显示。

public class ReceiveThread extends Thread {

private ServerSocket server;

private ChatWindow window;

public ReceiveThread(ChatWindow window) {

this.window = window;

try {

server = new ServerSocket(0);

window.setLocalPort(server.getLocalPort());

start();

} catch (IOException e) {

// TODO Auto-generated catch block

window.printError("连接出错");

}

}

@Override

public void run() {

// TODO Auto-generated method stub

while(true){

Socket socket;

try {

socket = server.accept();

InputStreamReader reader = new InputStreamReader(socket.getInputStream());

int c;

StringBuilder sb = new StringBuilder();

while((c = reader.read()) != -1){

sb.append((char)c);

}

window.setReceive(sb.toString());

} catch (IOException e) {

// TODO Auto-generated catch block

System.out.println("线程将接受到的数据写入对话框出错");

}

}

}

}

ChatWindow

这个类是UI的实现,通过绑定各个按钮的操作来实现别的功能

public class ChatWindow extends JFrame {

private JButton sendButton;

private JButton cancelButton;

private JButton receiveButton;

private JTextArea receiveText;

private JTextField sendText;

private JLabel localPort;

private JTextField remoteAddress;

private JTextField remotePort;

private SendThread sendThread;

private ReceiveThread receiveThread;

private void GUIini(){

Container c = this.getContentPane();

c.setLayout(new BorderLayout());

setSize(400, 500);

//第一个panel

JPanel panel1 = new JPanel(new GridLayout(4, 2));

// JPanel panel1 = new JPanel(new (4, 2));

panel1.setSize(400, 75);

panel1.add(new JLabel("当前机器的IP地址是:"));

try {

panel1.add(new JLabel(InetAddress.getLocalHost().getHostAddress()));

} catch (UnknownHostException e) {

// TODO Auto-generated catch block

panel1.add(new JLabel("当前机器的IP地址是:" + "Unknown"));

}

panel1.add(new JLabel("当前对话的端口是:"));

panel1.add(localPort = new JLabel(""+0));

panel1.add(new JLabel("Remote Host IP Address:"));

remoteAddress = new JTextField();

remoteAddress.setColumns(0);

panel1.add(remoteAddress);

panel1.add(new JLabel("Remote Host Port:"));

remotePort = new JTextField();

remotePort.setColumns(0);

panel1.add(remotePort);

c.add(panel1,BorderLayout.NORTH);

//第二个panel

JPanel panel2 = new JPanel(new FlowLayout(FlowLayout.LEADING));

panel2.setSize(400,200);

panel2.add(new JLabel("收到的内容"));

receiveText = new JTextArea(15,30);

receiveText.setEditable(false);

receiveText.setAutoscrolls(true);

JScrollPane jsp = new JScrollPane(receiveText);

panel2.add(jsp);

//第三个panel

// JPanel panel3 = new JPanel(new GridLayout(2, 1));

panel2.add(new JLabel("请输入发送的内容"));

sendText = new JTextField(30);

sendText.setAutoscrolls(true);

panel2.add(sendText);

c.add(panel2,BorderLayout.CENTER);

//c.add(panel3);

//第四个panel

JPanel panel4 = new JPanel(new GridLayout(1, 0));

panel4.setSize(400,20);

receiveButton = new JButton("开始接受数据");

sendButton = new JButton("发送");

cancelButton = new JButton("取消");

panel4.add(receiveButton);

panel4.add(cancelButton);

panel4.add(sendButton);

c.add(panel4,BorderLayout.SOUTH);

//四个面板内容设置完毕

setVisible(true);

setResizable(false);

setDefaultCloseOperation(EXIT_ON_CLOSE);

}

private void ActionIni() {

//键盘动作

this.addKeyListener(new KeyListener() {

@Override

public void keyTyped(KeyEvent e) {

}

@Override

public void keyReleased(KeyEvent e) {

// TODO Auto-generated method stub

if(e.getKeyCode() == KeyEvent.VK_ENTER){

//发送文本

sendThread.senMessage(remoteAddress.getText(), Integer.parseInt(remotePort.getText()), sendText.getText());

receiveText.setText(receiveText.getText() + "\n" + "发送:" + sendText.getText());

}

}

@Override

public void keyPressed(KeyEvent e) {

// TODO Auto-generated method stub

}

});

//取消按钮的动作

cancelButton.addMouseListener(new MouseListener() {

@Override

public void mouseReleased(MouseEvent e) {

// TODO Auto-generated method stub

sendText.setText("");

}

@Override

public void mousePressed(MouseEvent e) {

// TODO Auto-generated method stub

}

@Override

public void mouseExited(MouseEvent e) {

// TODO Auto-generated method stub

}

@Override

public void mouseEntered(MouseEvent e) {

// TODO Auto-generated method stub

}

@Override

public void mouseClicked(MouseEvent e) {

// TODO Auto-generated method stub

}

});

sendButton.addMouseListener(new MouseListener() {

@Override

public void mouseReleased(MouseEvent e) {

//发送文本

sendThread.senMessage(remoteAddress.getText(), Integer.parseInt(remotePort.getText()), sendText.getText());

receiveText.setText(receiveText.getText() + "发送:" + sendText.getText()+ "\n");

}

@Override

public void mousePressed(MouseEvent e) {

// TODO Auto-generated method stub

}

@Override

public void mouseExited(MouseEvent e) {

// TODO Auto-generated method stub

}

@Override

public void mouseEntered(MouseEvent e) {

// TODO Auto-generated method stub

}

@Override

public void mouseClicked(MouseEvent e) {

// TODO Auto-generated method stub

}

});

}

private void ThreadIni() {

// TODO Auto-generated method stub

sendThread = new SendThread(0, this);

receiveThread = new ReceiveThread(this);

}

//构造函数

public ChatWindow() {

GUIini();

ActionIni();

ThreadIni();

}

public void printError(String err){

System.out.println("Error occur:" + err);

}

//回调函数,用于接受从线程中返回的数据

public void setReceive(String receive){

receiveText.setText(receiveText.getText() + "收到:" + receive+ "\n" );

}

//当接受数据的线程开始工作以后,就调用该回调函数,设置当前聊天窗口使用的端口是哪个

public void setLocalPort(int localPortText){

localPort.setText(""+localPortText);

}

//放远,这个是整个程序的起点

public static void main(String[] args) {

// TODO Auto-generated method stub

new ChatWindow();

}

}

如何使用

将工程导入到Eclipse中以后,运行两次,因为这个程序不属于单例模式,所以可以出现两个窗口,在远程端口,远程地址那个输入框中分别输入另一个窗口中显示的IP和端口号,接下来在输入框中输入要发送的文字就可以了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

java聊天软件_java实现简单聊天软件相关推荐

  1. java 简单聊天室_java实现简单聊天室单人版

    本文实例为大家分享了java实现简单聊天室的具体代码,供大家参考,具体内容如下 先整理下思路: 1.创建一个通信服务端,传入端口号和相关的流后等待客户端连接,并初始化图形界面. 2.创建一个JFram ...

  2. 《Java项目实践》:简单聊天程序

    <Java项目实践>:简单聊天程序 由于这个简单程序,还是涉及到很多的知识点,下面我们就一点一点的来完成. 我们熟悉的QQ聊天,就有一个界面,是吧,我们自己做一个简单的聊天程序,因此我们也 ...

  3. java socket 工具_java Socket简易聊天工具

    本文实例为大家分享了一款Socket简易聊天工具,希望大家喜欢. 代码运行如图,看起来还不错 服务端 package qiu; import java.awt.BorderLayout; import ...

  4. 计算机网络课程设计聊天,计算机网络课程设计-简单聊天程序.doc

    计算机网络课程设计-简单聊天程序 黔南民族师范学院 计算机科学系 计算机网络课程设计报告 课题名称: 简单聊天程序 姓 名: 学 号: 专业班级: 系 (院): 计算机科学系 指导老师: 设计时间: ...

  5. php聊天功能_php实现简单聊天功能

    搜索热词 1.创建聊天消息表,其表的字段有消息内容,发送时间和发送者的名称: CREATE TABLE `guanhui`.`message` ( `id` INT(10) NOT NULL AUTO ...

  6. java gui 日历_Java实现简单日历小程序 Java图形界面小日历开发

    今天给大家介绍一下如何用Java swing开发一款简单的小日历,下面我们来看代码: 首先创建一个CalendarBean类,用于基本的日期计算: package other1; import jav ...

  7. java 日历界面_Java实现简单日历小程序 Java图形界面小日历开发

    今天给大家介绍一下如何用java swing开发一款简单的小日历,下面我们来看代码: 首先创建一个calendarbean类,用于基本的日期计算: package other1; import jav ...

  8. java银行取款_Java写简单的银行取钱系统

    按ctrl+a 选中所有的代码删除,再复制下面的代码输入即可 import java.util.Scanner; public class 简单的银行取钱系统 //class的名字可以自己新建和这个一 ...

  9. 国产开源软件j-im搭建简单聊天工具过程

    朋友说想搭个聊天服务器.经过多方研究,发现网上有一款开源软件J-IM,是搭建在国产通讯工具t-io上的,作者经过J-IM封装,已经变成了成熟产品谭聊,基础的东西作者也进行了开源.本着学习和研究的目的, ...

  10. java学的什么软件_java初学者用什么软件

    Java初学者可以使用MyEclipse或eclipse以及记事本.随着学习的深入,相信你会逐渐明白,你会从中找到最合适的开发工具. java初学者使用什么软件 Java初学者可以使用MyEclips ...

最新文章

  1. 生成jpg的缩略图并添加水印
  2. C语言 | 变量的存储方式
  3. cmd 【已解决】windows连接手机,运行adb devices提示“unauthorized”
  4. 复现原文(一):Single-cell RNA sequencing of human kidney(step by step)
  5. Android软件开发-ProgressBar
  6. HDU——T 1573 X问题
  7. hdoj--5620--KK's Steel(斐波那契数)
  8. Go 关键字 Select
  9. 微信小程序入门,可跳过
  10. 投影仿真1.0-二维图像矩阵投影
  11. YouTube营销活动方案
  12. 基于云效Flow配置 Jenkins 源
  13. linux 通过ssh上传文件
  14. LabVIEW练习16
  15. 我是漂移王-说明介绍
  16. 关于反馈:误码与DTX
  17. 满天星java代码6_java实现的满天星效果的方法
  18. eyoucm arclist 文档列表
  19. 自己思考得到的结论在辩论中没有信服力?
  20. 常用python爬虫框架

热门文章

  1. 有道云笔记Markdown图片链接解决办法
  2. 滑动窗口协议(GBN, SR)
  3. Abaqus中多层介质设置初始应力场(补充介绍)
  4. 光电信息科学与工程学c语言吗,光电信息科学与工程是热门吗?本文讲给你讲个透彻...
  5. 深度学习环境安装所需软件介绍cuda+cudnn+driver+anaconda+keras+tensorFlow+Pycharm+Jupyer(下载地址+配图)
  6. Ant Design 遭删库!
  7. Mysql8.x主从基础同步
  8. 3分钟快速了解,如何一次通过CISSP考试?
  9. 2020年下半年软件设计师上午真题及答案解析
  10. Zotero | zotero与endnote题录与pdf文件的完整互转(2)