您的位置:首页 > 其它

聊天室功能实现

2011-09-15 22:21 281 查看
服务器端代码:

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintStream;

import java.net.ServerSocket;

import java.net.Socket;

import java.net.SocketTimeoutException;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

import java.util.Scanner;

/*

* 聊天服务器

*/

public class ChatServer {

private boolean serverNormal = true;

private ServerSocket ss;

//把负责通信的对象放到集合,以便遍历

private List<TongxinThread> list = new ArrayList<TongxinThread>();

public ChatServer(int port)throws Exception{

ss = new ServerSocket(port);//创建服务器

new Thread(){

public void run(){

try{

while(serverNormal){

//每建立一个连接,都会产生一个连接通道socket

//阻塞方法要使用独立线程执行,不影响其它的代码执行。

Socket socket = ss.accept();//如果有异常代表服务停止,不能建立连接了

if(!serverNormal){//服务器正在停止

socket.close();

return ;

}

//设置接收数据超时时间,如果此时间内收不到数据,则会抛出SocketTimeoutException

socket.setSoTimeout(1000*60);

//把socket交给通信线程

TongxinThread tx = new TongxinThread(socket);

list.add(tx);//可以遍历发送数据

tx.send("欢迎登陆聊天室");

tx.send("当前在线人数: "+list.size());

tx.start();

}

}catch(Exception e){

e.printStackTrace();

System.out.println("服务已经停止");

}

}

}.start();

new Thread(){

public void run(){

try {

Scanner sc = new Scanner(System.in);

while(true){

String s = sc.nextLine();

if("close".equals(s)){

//停止服务器

//*不允许建立新的连接

//*断开所有的客户端

//*停止服务器

serverNormal = false;

for(TongxinThread tx : list){

tx.s.close();

}

ss.close();//停止服务器

}

}

} catch (Exception e) {

e.printStackTrace();

System.out.println("服务器停止时出错");

}

}

}.start();

}

/*

* 通信线程类,使用内部类实现

*/

class TongxinThread extends Thread{

Socket s;

BufferedReader in ;//readLine();

PrintStream out;//println(String);

public TongxinThread(Socket s)throws Exception{

this.s = s;

in = new BufferedReader(new InputStreamReader(s.getInputStream()));

out = new PrintStream(s.getOutputStream());

}

public void run(){

//接收数据

try{

while(true){

String line = null;

try{

line = in.readLine();//针对每个客户端发过来的每句话。如果客户端断开,会抛出SocketException异常//Connection Reset异常

}catch(SocketTimeoutException e){

send("你很久没说话了。。");

continue;

}

if(line==null){

break;

}

//接收到的line,遍历发送到每个客户端。

for(Iterator<TongxinThread> it = list.iterator();it.hasNext();){

TongxinThread tx = it.next();

try{

tx.send(line);//如果发不出去,可能已断开,会出现异常

}catch(Exception e){

//对其中一个客户端发送失败,将其移除掉

it.remove();

}

}

}

}catch(Exception e){

e.printStackTrace();

//从当前客户端接收数据失败,即自己断开,把自己移除掉

list.remove(this);

}

}

public void send(String s){

out.println(s);

out.flush();

}

}

public static void main(String[] args)throws Exception{

ChatServer s = new ChatServer(8000);

System.out.println("聊天服务器已经启动。。。");

}

}//ChatServer

客户端代码:

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.io.PrintStream;

import java.net.Socket;

import java.util.Scanner;

/*

* 客户端读与写都是阻塞操作,得在不同的线程执行其代码。

*/

public class ChatClient {

private Socket s;

private BufferedReader in;

private PrintStream out;

private String name;

private Scanner sc = new Scanner(System.in);

public ChatClient(String ip,int port)throws Exception{

s = new Socket(ip, port);

in = new BufferedReader(new InputStreamReader(s.getInputStream()));

out = new PrintStream(s.getOutputStream());

}

public void start(){

System.out.print("请输入姓名: ");

name = sc.nextLine();

new Thread(){

public void run(){

try{

while(true){

System.out.println("......................");

String line = in.readLine();//如果出现异常,表示已经断开,接收不到数据

if(line==null)

break;

System.out.println(line);

}

}catch(Exception e){

e.printStackTrace();

System.out.println("你已断开");

}

}

}.start();

new Thread(){

public void run(){

try{

while(true){

String s = sc.nextLine();

System.out.println("-------------------");

out.println(name + " 说: " + s);

out.flush();

System.out.println("=======================");

}

}catch(Exception e){

e.printStackTrace();

System.out.println("你已断开");

}

}

}.start();

}

public static void main(String[] args)throws Exception{

ChatClient c = new ChatClient("localhost", 8000);

c.start();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: