java做的swing聊天器,用socket实现的,目前只能支持两个人之间聊天,局域网内或者直接连到internet的两台机器(没用router)。用到了substance.jar第三方皮肤包,请导入类路径。水印图片是skyani.jpeg,在src目录下建立一个image文件夹放进去就行了。这就是个demo,很多不足之处,还请不吝赐教!
package javaQQ;
import javax.swing.*;
import org.jvnet.substance.watermark.SubstanceImageWatermark;
import org.jvnet.substance.SubstanceLookAndFeel;
import org.jvnet.substance.api.SubstanceConstants.ImageWatermarkKind;
import org.jvnet.substance.api.SubstanceSkin;
import org.jvnet.substance.skin.OfficeBlue2007Skin;
import org.jvnet.substance.skin.SubstanceOfficeBlue2007LookAndFeel;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.concurrent.LinkedBlockingQueue;
public class ChatGUI extends JFrame
{
private static final long serialVersionUID = 1L;
private JTextField newNickName = new JTextField(6);
private JTextField friendAddress = new JTextField(9);
private JTextArea dialog = new JTextArea(15, 30);
private JTextArea input = new JTextArea(5, 40);
private JButton sendButton = new JButton("send");
private JButton changeNickName = new JButton("change");
private JButton requestChat = new JButton("invite");
private String nickName = null;
private LinkedBlockingQueue<String> sendMsgQueue = new LinkedBlockingQueue<String>();
private String inputContent;
private SendChatRequest smsg;
public ChatGUI()
{
super();
Container pane = this.getContentPane();
Font f = new Font(null, Font.PLAIN, 12);
dialog.setFont(f);
dialog.setEditable(false);
input.setFont(f);
friendAddress.setFont(f);
newNickName.setFont(f);
JPanel northPanel = new JPanel();
northPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
northPanel.add(new JLabel("new name: "));
northPanel.add(newNickName);
northPanel.add(changeNickName);
northPanel.add(new JLabel("input his/her IP:"));
northPanel.add(friendAddress);
northPanel.add(requestChat);
pane.add("North", northPanel);
ActionListener cn = new ChangeName();
changeNickName.addActionListener(cn);
ActionListener rc = new RequestChat();
requestChat.addActionListener(rc);
JPanel centerPanel = new JPanel();
centerPanel.setLayout(new GridLayout(1, 1, 10, 10));
JScrollPane jsp = new JScrollPane(dialog);
centerPanel.add(jsp);
pane.add("West", centerPanel);
JPanel southPanel = new JPanel();
JScrollPane inputJSP = new JScrollPane(input);
southPanel.add(inputJSP);
southPanel.add(sendButton);
pane.add("South", southPanel);
ActionListener al = new SendMessage();
sendButton.addActionListener(al);
sendButton.setEnabled(false);
ServerListener sl = new ServerListener();
Thread srvl = new Thread(sl);
srvl.start();
}
class SendMessage implements ActionListener
{
public void actionPerformed(ActionEvent evt)
{
inputContent = input.getText();
if(inputContent.equals(""))
{
JOptionPane.showMessageDialog(ChatGUI.this,
"Please do not send empty message", "", JOptionPane.ERROR_MESSAGE);
return;
}
input.setText("");
try
{
String displayName = null;
if(nickName == null || nickName.equals(""))
{
displayName = InetAddress.getLocalHost().getHostAddress();
}
else
{
displayName = nickName;
}
//synchronized(dialog)
{
//dialog.wait();
dialog.setText(dialog.getText() + "你:\n" + inputContent + "\n");
//dialog.notify();
}
//将inputContent放入发送队列
sendMsgQueue.add(inputContent);
}
catch (UnknownHostException e)
{
e.printStackTrace();
}
/*catch (InterruptedException e)
{
e.printStackTrace();
}*/
}
}
class ChangeName implements ActionListener
{
public void actionPerformed(ActionEvent evt)
{
if(newNickName.getText().trim().equals(""))
{
JOptionPane.showMessageDialog(ChatGUI.this,
"Name cannot be empty", "", JOptionPane.ERROR_MESSAGE);
}
else
{
nickName = newNickName.getText();
newNickName.setText("");
//发送向对方
JOptionPane.showMessageDialog(ChatGUI.this,
"You have changed your name to " + nickName, "", JOptionPane.INFORMATION_MESSAGE);
}
}
}
class RequestChat implements ActionListener
{
public void actionPerformed(ActionEvent evt)
{
String requestIP = ChatGUI.this.friendAddress.getText();
try
{
String localIP = InetAddress.getLocalHost().getHostAddress();
if(requestIP.equals(localIP))
{
JOptionPane.showMessageDialog(ChatGUI.this,
"You cannot send invitation to yourself", "", JOptionPane.ERROR_MESSAGE);
return;
}
}
catch (UnknownHostException e)
{
e.printStackTrace();
}
if(requestIP.equals(""))
{
JOptionPane.showMessageDialog(ChatGUI.this,
"Please input valid IP", "", JOptionPane.ERROR_MESSAGE);
}
else
{
smsg = new SendChatRequest();
Thread sm = new Thread(smsg);
sm.start();
}
}
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable(){
public void run()
{
//JFrame.setDefaultLookAndFeelDecorated(true);
//JDialog.setDefaultLookAndFeelDecorated(true);
try
{
SubstanceImageWatermark watermark = new SubstanceImageWatermark(ChatGUI.class.getResourceAsStream("../image/skyani.jpeg"));
watermark.setKind(ImageWatermarkKind.APP_CENTER);
SubstanceSkin skin = new OfficeBlue2007Skin().withWatermark(watermark);
UIManager.setLookAndFeel(new SubstanceOfficeBlue2007LookAndFeel());
SubstanceLookAndFeel.setSkin(skin);
}
catch (UnsupportedLookAndFeelException ex)
{
ex.printStackTrace();
}
ChatGUI c = new ChatGUI();
c.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
c.pack();
EventQueue.invokeLater(new FrameShower(c));
}});
}
private static class FrameShower implements Runnable
{
private final Frame frame;
FrameShower(Frame frame)
{
this.frame = frame;
}
public void run()
{
frame.setVisible(true);
}
}
private class SendChatRequest implements Runnable
{
public void run()
{
//连接服务器
String requestIP = ChatGUI.this.friendAddress.getText();
try
{
InetAddress ia = InetAddress.getByName(requestIP);
Socket socket = new Socket(ia, 5776);
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));
StringBuffer sb = new StringBuffer();
String c;
try
{
c = (String)in.readObject();
sb.append(c);
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
String rstCode = sb.toString();
System.out.println(rstCode);
if(rstCode.equals("0"))
{
JOptionPane.showMessageDialog(ChatGUI.this,
requestIP + " accepted your invitation", "", JOptionPane.INFORMATION_MESSAGE);
sendButton.setEnabled(true);
}
else if(rstCode.equals("1"))
{
JOptionPane.showMessageDialog(ChatGUI.this,
requestIP + " refused your invitation", "", JOptionPane.ERROR_MESSAGE);
in.close();
socket.close();
return;
}
SendMsgThruSocket smts = new SendMsgThruSocket(out);
Thread ss = new Thread(smts);
ss.start();
ReceiveMsgFromSocket rmfs = new ReceiveMsgFromSocket(in);
Thread rs = new Thread(rmfs);
rs.start();
}
catch (UnknownHostException e1)
{
JOptionPane.showMessageDialog(ChatGUI.this,
"UnknownHostAddress", "", JOptionPane.ERROR_MESSAGE);
return;
}
catch (IOException e1)
{
JOptionPane.showMessageDialog(ChatGUI.this,
"I/O exception", "", JOptionPane.ERROR_MESSAGE);
}
}
}
private class ServerListener implements Runnable
{
public void run()
{
try
{
ServerSocket server = new ServerSocket(5776);
while(true)
{
Socket connection = server.accept();
ObjectOutputStream out = new ObjectOutputStream(connection.getOutputStream());
ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(connection.getInputStream()));
String requesterIP = connection.getInetAddress().getHostAddress();
String[] options = {"accept", "refuse"};
int response = JOptionPane.showOptionDialog(ChatGUI.this, requesterIP + " sent an invitation to you...", "", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]);
if(response == 0)
{
out.writeObject("0");
out.flush();
sendButton.setEnabled(true);
SendMsgThruSocket smts = new SendMsgThruSocket(out);
Thread ss = new Thread(smts);
ss.start();
ReceiveMsgFromSocket rmfs = new ReceiveMsgFromSocket(in);
Thread rs = new Thread(rmfs);
rs.start();
}
else if(response == 1)
{
out.writeObject("1");
out.flush();
connection.close();
}
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
private class SendMsgThruSocket implements Runnable
{
ObjectOutputStream out;
SendMsgThruSocket(ObjectOutputStream out2)
{
this.out = out2;
}
public void run()
{
//等待发送消息
while (true)
{
String msgFromQueue;
try
{
msgFromQueue = (String) sendMsgQueue.take();
out.writeObject(msgFromQueue);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
private class ReceiveMsgFromSocket implements Runnable
{
ObjectInputStream in;
ReceiveMsgFromSocket(ObjectInputStream in)
{
this.in = in;
}
public void run()
{
while(true)
{
try
{
String rm;
while((rm = (String)in.readObject()) != null)
{
//synchronized(dialog)
{
//dialog.wait();
dialog.setText(dialog.getText() + "对方:\n" + rm + "\n");
//dialog.notify();
}
}
}
catch (IOException e)
{
e.printStackTrace();
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
/*catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
}
}
}
}
界面展示:
- 大小: 86.9 KB
- 大小: 28.6 KB
分享到:
相关推荐
在这个名为“Java我的聊天器代码和界面”的项目中,开发者显然利用了Java的核心特性,如Socket通信和多线程技术,来构建一个功能完备的聊天器。下面我们将详细探讨这些关键知识点。 1. **Java Socket通信**: Java...
本项目"java实现聊天室"旨在构建一个具有服务端和客户端功能的简单通信系统,允许用户通过网络进行实时交流。下面我们将详细探讨这个项目中的核心技术和相关知识点。 1. **Java Socket编程**: - Java的Socket类是...
在Java编程语言中实现一个聊天程序是一项常见的任务,它涵盖了多个关键知识点,包括网络通信、数据库管理和用户界面设计。下面将详细阐述这些方面。 首先,网络通信是聊天程序的基础,通常使用TCP或UDP协议。在Java...
无论是从技术实现还是用户交互角度,这款聊天器都充分展示了Java语言的强大潜力以及开发者对于即时通讯软件的深入理解。如果你对此感兴趣,可以通过提供的联系方式与开发者取得联系,进一步了解和体验这款软件。
【Java基础之聊天器】是关于使用Java编程语言构建一个简单聊天器的教程。这个项目旨在帮助初学者理解网络通信的基础知识,特别是TCP/IP协议在Java中的应用。在这个教程中,我们将探讨以下关键知识点: 1. **Java ...
【Java JSP聊天器】是一种基于Java服务器页面技术(JSP)实现的在线聊天应用程序。在Web开发领域,JSP是用于创建动态网页的一种技术,它允许开发者将HTML、CSS和Java代码混合编写,以便在服务器端处理数据并生成响应...
Java简单聊天器模拟是一个基于网络通信的项目,主要利用了Socket编程来实现客户端与服务器端的交互。在本文中,我们将深入探讨这个项目的核心概念、技术实现和应用场景。 首先,我们要理解Socket的基本概念。Socket...
【Java网络聊天器】是一种基于Java编程语言实现的网络通信应用程序,主要用于实现用户之间的实时文本聊天功能。在计算机网络课程设计中,这类项目是学习网络编程、多线程和socket编程的重要实践。通过分析和研究这个...
首先,Java实现的聊天软件通常基于客户端-服务器(Client-Server)架构,即C/S模式。在这个架构中,服务器端负责接收并分发消息,而客户端则用于用户交互,发送和接收聊天内容。在Java中,我们可以使用Socket编程来...
【Java聊天器】是一款基于Java编程语言开发的即时通讯软件,它可以实现群聊和私聊功能,为用户提供方便快捷的沟通途径。虽然程序可能存在一些已知或未知的Bug,但其开源特性使得用户和开发者可以对其进行修改和优化...
这个标题表明我们关注的是一个基于Java编程语言实现的简单聊天器程序。这个程序包含了服务器端和客户端的源代码,意味着用户可以通过编写和运行Java代码来实现基本的聊天功能。在Java中,这种网络通信通常涉及到...
【Java局域网聊天器】是一款基于Java技术开发的局域网内通信工具,它集成了公聊、私聊以及文件传输功能,充分利用了Java的IO流、多线程(Thread)以及套接字(Socket)等核心概念,使得用户在局域网环境下可以便捷地...
1. **网络编程**:Java中的`Socket编程`是实现聊天室的基础。每个用户通过创建一个Socket连接到服务器,发送和接收数据。`ServerSocket`类用于在服务器端监听客户端的连接请求,而`Socket`类则代表客户端和服务器...
总的来说,使用Java实现QQ聊天功能涉及了网络编程、多线程、GUI设计、数据序列化等多个技术领域。在实际开发中,还需要考虑错误处理、用户体验、安全性和性能等因素,以构建一个稳定、安全且高效的聊天应用。
首先,Java是编程语言,它的跨平台特性使得它成为实现聊天应用的理想选择。Java的“一次编写,到处运行”理念确保了在不同操作系统上都能正常运行,这为QQ聊天程序提供了广泛的兼容性。 1. **网络通信**:QQ聊天的...
Java实习作业:聊天器客户端。 能够实现局域网内通过ip建立连接来聊天 包含了server端和client端,server端做成一个线程。暂且只支持点对点。
2. **网络编程**:Java中的Socket编程是实现聊天工具的关键,它允许客户端和服务端之间进行双向通信。通过建立TCP连接,客户端可以发送和接收消息,确保数据的可靠传输。 3. **多线程**:在聊天工具中,通常会使用...
总的来说,"java共享聊天器目录"是一个涉及前端开发的项目,使用HTML、CSS、JavaScript和可能的DIV布局技术构建用户界面,并利用Java作为后端语言处理用户请求和实现聊天功能。良好的前端设计和后端架构是此类应用的...