`
xglv2013
  • 浏览: 38300 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java实现的聊天器

阅读更多
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
2
4
分享到:
评论

相关推荐

    Java我的聊天器代码和界面

    在这个名为“Java我的聊天器代码和界面”的项目中,开发者显然利用了Java的核心特性,如Socket通信和多线程技术,来构建一个功能完备的聊天器。下面我们将详细探讨这些关键知识点。 1. **Java Socket通信**: Java...

    java实现聊天室

    本项目"java实现聊天室"旨在构建一个具有服务端和客户端功能的简单通信系统,允许用户通过网络进行实时交流。下面我们将详细探讨这个项目中的核心技术和相关知识点。 1. **Java Socket编程**: - Java的Socket类是...

    java实现聊天程序

    在Java编程语言中实现一个聊天程序是一项常见的任务,它涵盖了多个关键知识点,包括网络通信、数据库管理和用户界面设计。下面将详细阐述这些方面。 首先,网络通信是聊天程序的基础,通常使用TCP或UDP协议。在Java...

    java仿qq聊天器

    无论是从技术实现还是用户交互角度,这款聊天器都充分展示了Java语言的强大潜力以及开发者对于即时通讯软件的深入理解。如果你对此感兴趣,可以通过提供的联系方式与开发者取得联系,进一步了解和体验这款软件。

    Java基础之聊天器

    【Java基础之聊天器】是关于使用Java编程语言构建一个简单聊天器的教程。这个项目旨在帮助初学者理解网络通信的基础知识,特别是TCP/IP协议在Java中的应用。在这个教程中,我们将探讨以下关键知识点: 1. **Java ...

    java jsp聊天器

    【Java JSP聊天器】是一种基于Java服务器页面技术(JSP)实现的在线聊天应用程序。在Web开发领域,JSP是用于创建动态网页的一种技术,它允许开发者将HTML、CSS和Java代码混合编写,以便在服务器端处理数据并生成响应...

    Java简单聊天器模拟

    Java简单聊天器模拟是一个基于网络通信的项目,主要利用了Socket编程来实现客户端与服务器端的交互。在本文中,我们将深入探讨这个项目的核心概念、技术实现和应用场景。 首先,我们要理解Socket的基本概念。Socket...

    java网络聊天器

    【Java网络聊天器】是一种基于Java编程语言实现的网络通信应用程序,主要用于实现用户之间的实时文本聊天功能。在计算机网络课程设计中,这类项目是学习网络编程、多线程和socket编程的重要实践。通过分析和研究这个...

    java实现聊天软件

    首先,Java实现的聊天软件通常基于客户端-服务器(Client-Server)架构,即C/S模式。在这个架构中,服务器端负责接收并分发消息,而客户端则用于用户交互,发送和接收聊天内容。在Java中,我们可以使用Socket编程来...

    java聊天器

    【Java聊天器】是一款基于Java编程语言开发的即时通讯软件,它可以实现群聊和私聊功能,为用户提供方便快捷的沟通途径。虽然程序可能存在一些已知或未知的Bug,但其开源特性使得用户和开发者可以对其进行修改和优化...

    java板简易聊天器程序源码

    这个标题表明我们关注的是一个基于Java编程语言实现的简单聊天器程序。这个程序包含了服务器端和客户端的源代码,意味着用户可以通过编写和运行Java代码来实现基本的聊天功能。在Java中,这种网络通信通常涉及到...

    java局域网聊天器

    【Java局域网聊天器】是一款基于Java技术开发的局域网内通信工具,它集成了公聊、私聊以及文件传输功能,充分利用了Java的IO流、多线程(Thread)以及套接字(Socket)等核心概念,使得用户在局域网环境下可以便捷地...

    用java实现的聊天室

    1. **网络编程**:Java中的`Socket编程`是实现聊天室的基础。每个用户通过创建一个Socket连接到服务器,发送和接收数据。`ServerSocket`类用于在服务器端监听客户端的连接请求,而`Socket`类则代表客户端和服务器...

    使用java实现QQ聊天功能

    总的来说,使用Java实现QQ聊天功能涉及了网络编程、多线程、GUI设计、数据序列化等多个技术领域。在实际开发中,还需要考虑错误处理、用户体验、安全性和性能等因素,以构建一个稳定、安全且高效的聊天应用。

    java 实现qq聊天

    首先,Java是编程语言,它的跨平台特性使得它成为实现聊天应用的理想选择。Java的“一次编写,到处运行”理念确保了在不同操作系统上都能正常运行,这为QQ聊天程序提供了广泛的兼容性。 1. **网络通信**:QQ聊天的...

    Java写的局域网聊天器客户端

    Java实习作业:聊天器客户端。 能够实现局域网内通过ip建立连接来聊天 包含了server端和client端,server端做成一个线程。暂且只支持点对点。

    Java实现的聊天工具(部分功能完成)

    2. **网络编程**:Java中的Socket编程是实现聊天工具的关键,它允许客户端和服务端之间进行双向通信。通过建立TCP连接,客户端可以发送和接收消息,确保数据的可靠传输。 3. **多线程**:在聊天工具中,通常会使用...

    java共享聊天器目录

    总的来说,"java共享聊天器目录"是一个涉及前端开发的项目,使用HTML、CSS、JavaScript和可能的DIV布局技术构建用户界面,并利用Java作为后端语言处理用户请求和实现聊天功能。良好的前端设计和后端架构是此类应用的...

Global site tag (gtag.js) - Google Analytics