`
leoizumi
  • 浏览: 93942 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java 聊天器 beta2

阅读更多

服务器端 :

 

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.List;


public class ChatServer {
	boolean started = false;
	ServerSocket serverSocket = null;
	List<Client> clients = new ArrayList<Client>();
	
	public static void main(String[] args) {
		new ChatServer().start();
	}
	
	public void start() {
		try {
			serverSocket = new ServerSocket(7777);
			started = true;
		}
		catch(BindException e2) {
			System.out.println("端口使用中 ... ...");
			System.out.println("请关闭双关程序!");
			System.exit(0);
		}
		catch(Exception e) {
			e.printStackTrace();
		}
		try{
			while(started) {
			    Socket socket = serverSocket.accept();
			    Client client = new Client(socket);
				System.out.println("连接上了... ...");
				new Thread(client).start();
				clients.add(client);
			}
		} catch (IOException e) {
			System.out.println("Server 关闭");
		}finally {
	          try {
				serverSocket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}	
	}

	
	
	class Client implements Runnable {

		private Socket socket;
		private DataInputStream dis = null;
		private DataOutputStream dos = null;
		boolean bConnected = false;
		
		public Client(Socket socket) {
			this.socket = socket;
		
			try {
				dis = new DataInputStream(socket.getInputStream());
				dos = new DataOutputStream(socket.getOutputStream());
				bConnected = true;
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		
		public void send(String str) {
		
				try {
					dos.writeUTF(str);
				} catch (IOException e) {
					clients.remove(this);
					System.out.println("对方退出了!我从List里去掉");
					//e.printStackTrace();
				}
			
		}
		
		
		
		public void run() {
			//Client c = null;
			try{
          	while(bConnected) {
          		String str = dis.readUTF();
          		System.out.println(str);
          		
          		for(int i = 0;i<clients.size();i++) {
          		    Client c = clients.get(i);
          			c.send(str);
          		} 		
          	}	
			}catch (EOFException e) {
				System.out.println("Server 关闭");
			}catch(IOException e) {
				e.printStackTrace();
			}finally {
				try {
					if(dis != null){
						dis.close();
					}
					if(dos != null){
						dos.close();
					}
					if(socket != null){
						socket.close();
						socket = null;
					}
					
					
				} catch (IOException e1) {
					e1.printStackTrace();
				}
				
			}
		}
		
	}
	
}

 

 

 

客户端 :

 

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;

public class ChatClient extends Frame {
	
	Socket socket = null;
	TextField textField = new TextField();
	TextArea textArea = new TextArea();
	DataOutputStream dos = null;
	DataInputStream dis = null;
	boolean bContented = false;
	Thread thread = new Thread(new ClientTalk());
	public void MainFrame() {
		setLocation(200, 200);
		setSize(400, 300);
		add(textArea,BorderLayout.NORTH);
		add(textField,BorderLayout.SOUTH);
		textField.addActionListener(new TextFieldListener());
		pack();
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				disConnect();
				System.exit(0);
			}
		});
		
		setVisible(true);
		connect();
		
		thread.start();
	}
	
	private class TextFieldListener implements ActionListener{
		public void actionPerformed(ActionEvent e) {
			String str = textField.getText();
			//textArea.setText(str);
			textField.setText("");
			try {
				dos.writeUTF(str);
				dos.flush();
				
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			
		}
		
	}
	
	
	public void disConnect() {

	try {
		dos.close();
		dis.close();
		socket.close();
	} catch (IOException e) {
		e.printStackTrace();
		}
	}

	
	public void connect() {
		try {
			socket = new Socket("127.0.0.1",7777);
			dos = new DataOutputStream(socket.getOutputStream());
			dis = new DataInputStream(socket.getInputStream());
			bContented = true;
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	
	class ClientTalk implements Runnable {
		public void run() {
			try{
			while(bContented) {
				String str = dis.readUTF();
				//System.out.println(str);
				textArea.setText(textArea.getText() + str + '\n');
				
			}
			}catch(SocketException e) {
				e.printStackTrace();
			}catch(EOFException e) {
				e.printStackTrace();
			}catch(IOException e) {
				e.printStackTrace();
			}
		}
		
	}
	
	public static void main(String[] args) {
		
		new ChatClient().MainFrame();
	}
	
}

 

分享到:
评论

相关推荐

    15个经典的java课程设计实例

    4. 图像处理:可以实现简单的图像查看器或编辑器,使用Java的AWT和Swing库处理图像。这可能包括缩放、旋转、滤镜应用等操作,需要了解像素处理和色彩模型。 5. 简单的数据库应用:可以创建一个联系人管理程序,利用...

    JAVA Swing小游戏实例与代码

    2. **端口扫描器**: 端口扫描是网络安全领域的一个重要工具,用于探测目标主机开放的网络端口。Java提供了Socket和ServerSocket类来处理网络连接,通过尝试连接目标IP的不同端口,我们可以判断哪些端口处于监听...

    uc7.9+qq2011java通用版软件

    标题中的“uc7.9+qq2011java通用版软件”指的是两个经典的老版本移动应用,分别针对UC浏览器(UCWeb)和QQ聊天软件。这些版本是为Java平台设计的,Java作为早期智能手机广泛使用的开发语言,适用于多种设备,具有较...

    商业源码-编程源码-MolyX Board v2.7 beta 2.zip

    MolyX Board是一款商业源码,主要用于编程和开发工作,其版本为2.7 beta 2。这个压缩包中包含了该软件的源代码,供开发者研究、学习或进行二次开发。MolyX Board可能是一个开源项目,允许用户查看、修改和分发其源...

    java 必练题目

    4. **Java程序分析器**: - 文件I/O:读取Java源代码文件。 - 语法解析:理解Java语言结构,可能需要用到词法分析和语法分析工具,如ANTLR。 - 类与接口分析:识别类的继承关系、内部类、接口等。 - AST抽象语法...

    JAVA五子棋手机网络对战游戏的设计与实现(源代码+LW).zip

    《JAVA五子棋手机网络对战游戏的设计与实现》是一个基于Java编程语言的项目,它展示了如何构建一个手机上的实时网络对战游戏。这个项目涵盖了多个重要的IT知识点,包括网络编程、多线程、图形用户界面(GUI)设计...

    ]盈盈通JSP网络聊天软件

    【盈盈通JSP网络聊天软件】是一款基于JavaServer Pages(JSP)技术构建的在线聊天应用程序,旨在提供一个实时沟通平台,使用户能够通过互联网进行便捷的交流。这款软件的UTF-8编码确保了多语言环境下的兼容性和正确...

    FiveChess-master_1.rar

    《五子棋大师项目解析——基于Java的在线聊天与对战平台》 “FiveChess-master_1.rar”这个压缩包文件包含的是一个名为“FiveChess-master”的项目,它集成了五子棋游戏与在线聊天功能,是Java编程语言的一个实例...

    linux软件集合,mpkg软件

    1. **qq2011_beta1_build0011_unsigned.jad**:这是一个早期版本的QQ聊天应用的测试版,用于Java设备。jad文件是Java应用程序的描述文件,它包含有关应用程序的信息,而jar文件则包含实际的代码和资源。 2. **TTPod...

    Asmack登录

    Asmack是一个开源的Java库,它是Smack的Android版本,专为在Android平台上处理XMPP(可扩展消息传递和存在协议)而设计。XMPP是一种开放标准的即时通讯协议,广泛用于创建实时通信系统,如聊天应用、协作工具和在线...

    ewebeditor v6.2商业版+5.5戒聊修改版商业版+ckeditor_开源版

    ckeditor是另一款非常流行的开源在线富文本编辑器,支持多种编程语言和平台,如PHP、ASP.NET、Java等。ckeditor_3.0.1_open.rar表示的是ckeditor的3.0.1版本的开源版本,开源意味着源代码公开,允许用户自由使用、...

    介绍J2EE常用Jar包的含义.doc

    2. **ajaxtags-1.2-beta3.jar** - **用途**: 提供了一套Ajax标签库,使得开发者可以在JSP页面中像使用普通标签那样使用Ajax功能。 - **应用场景**: 需要动态更新网页部分内容而不重新加载整个页面的应用场景,例如...

    基于Android平台的中国象棋设计与实现.doc

    - **架构选择**:采用MVC(Model-View-Controller)架构,将模型、视图与控制器分离,提高系统的可维护性和扩展性。 #### 2. 详细设计 - **用户界面模块**:设计简洁美观的界面,实现棋盘显示、棋子移动等功能。 -...

    Netty jar包

    - Protocol Codec:编码解码器,用于在网络传输前将数据转换为适合传输的格式,反之亦然。 3. `netty-all-4.1.25.Final.jar`: 这是Netty的核心库文件,包含了Netty所有模块的功能,包括服务器和客户端的实现、...

    Red5 0.9框架介绍(FMS的替代教程)

    该框架可以作为Adobe Flash Media Server (FMS)的一种低成本替代方案,尤其适合于开发实时视频聊天应用、在线教育平台以及直播服务等场景。Red5的核心功能包括视频流传输、音频流传输、数据共享和交互式通信等。 ##...

Global site tag (gtag.js) - Google Analytics