聊天室功能实现
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();
}
}
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();
}
}
相关文章推荐
- 用java socket做一个聊天室,实现多人聊天的功能。
- Asp.net使用SignalR实现聊天室的功能
- Socket实现网络聊天室和联系人私聊功能
- 基于php&mysql实现聊天室功能的代码实例分享
- java web利用mvc结构实现简单聊天室功能
- nodejs实现的一个简单聊天室功能分享
- Asp.net使用SignalR实现聊天室的功能
- Select 实现网络聊天室功能 (服务器端)
- C++和flex实现聊天室功能
- C++和flex实现聊天室功能
- java利用Socket实现聊天室功能实例
- java实现聊天室功能(包含全部代码,有界面)
- Qt实现局域网聊天室:类似QQ抖动窗口功能的实现
- android socket聊天室功能实现
- 如何用WebSocket实现一个简单的聊天室以及单聊功能
- 在同一个页面中实现登陆验证进入聊天室功能
- java实现一个简单TCPSocket聊天室功能分享
- java socket编程实现简单聊天室功能 单线程执行
- Redis实现多人多聊天室功能
- TCPserver Tcpclient 怎么实现聊天室一起聊天的功能呢?