您的位置:首页 > 编程语言 > Java开发

[JAVA]多人聊天室控制台实现,服务端向所有客户端下发消息实现

2013-05-19 18:09 387 查看
把项目分为五个模块:客户端,服务端,写入线程,读出线程,服务端向所有客户端写入线程。

读出线程

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;

public class ReadThread extends Thread
{
Socket socket;
String client;
public ReadThread(Socket socket,String client)
{
this.socket = socket;
this.client = client;
}
public void run()
{
try {
String line = "";
BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
line = is.readLine();
while (line != null)
{
System.out.println(client+" : "+line);
line = is.readLine();
}
is.close();
socket.close();
} catch (Exception e) {
System.out.println("Error : "+e);
}
}
}


写入线程

import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class WriteThread extends Thread
{
Socket socket = null;
String client;
public WriteThread(Socket socket,String client)
{
this.socket = socket;
this.client = client;
}
public void run()
{
try {
PrintWriter os = new PrintWriter(socket.getOutputStream());
Scanner scanner = new Scanner(System.in);
String readline = scanner.nextLine();
while (readline != null)
{
os.println(readline);
os.flush();
readline = scanner.nextLine();
}
os.close();
socket.close();
} catch (Exception e) {
System.out.println("Error : "+e);
}
}
}
服务端向所有客户端下发消息线程,使用到了集合,socket的集合和printwriter的集合

import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
import java.util.Vector;

public class ServerWriteThread  extends Thread
{
Vector<Socket> vector = null;
Vector<PrintWriter> oosVector = null;
public ServerWriteThread(Vector<Socket> vector)
{
this.vector = vector;
oosVector = new Vector<PrintWriter>();
}
public void run()
{
try {
while(true)
{
String line;
Scanner scanner = new Scanner(System.in);
line = scanner.nextLine();
if (vector != null)
{
oosVector.clear();
for (int i=0;i<vector.size();i++)
{
try {
Socket socket = vector.elementAt(i);
PrintWriter os = new PrintWriter(socket.getOutputStream());
oosVector.addElement(os);
} catch (Exception e) {
vector.removeElement(i);
}
}
for (int i=0;i<oosVector.size();i++)
{
PrintWriter oos = oosVector.elementAt(i);
oos.println(line);
oos.flush();
}
}
}
} catch (Exception e) {
System.out.println("Error :"+e);
}finally{
//关闭各个连接
if (oosVector != null)
{
for (int i=0;i<oosVector.size();i++)
{
PrintWriter obj = oosVector.remove(i);
obj.close();
}
}
if (vector != null)
{
for (int i=0;i<vector.size();i++)
{
Socket obj = vector.remove(i);
try {
obj.close();
} catch (Exception e2) {
System.out.println("socket关闭出现错误 " + e2);
}
}
}
}
}
}


客户端

import java.net.Socket;
import java.util.Scanner;

public class MultiClient
{
public static void main(String[] args) //throws Exception
{
Scanner scanner = new Scanner(System.in);
System.out.println("请输入客户端名称");
String ClientName = scanner.next();
try {
Socket socket = new Socket("127.0.0.1",5200);
Thread read = new ReadThread(socket,ClientName);
Thread write = new WriteThread(socket,ClientName);
read.start();
write.start();
} catch (Exception e) {
System.out.println("Error :" + e);
}
}
}


服务端

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;

public class MultiServer
{
ServerSocket serverSocket = null;
boolean listening = true;
int cliennum = 0;
Vector<Socket> vector = new Vector<Socket>();
public MultiServer()
{
try {
serverSocket = new ServerSocket(5200);
System.out.println("服务端启动");
ServerWriteThread write = new ServerWriteThread(vector);	//向所有客户端发送同一消息
write.start();
while (listening)
{
Socket socket = serverSocket.accept();
cliennum++;
vector.addElement(socket);  //将收到的socket加入到集合中
System.out.println("接收到 : "+cliennum+" 客户端");
String client = "从客户端["+cliennum+"]:"+"读取";
Thread read = new ReadThread(socket, client);
read.start();
}
} catch (IOException e) {
System.out.println("无法监听到端口");
System.exit(-1);
}
try {
serverSocket.close();
} catch (Exception e) {
System.out.println(e.toString());
}
}
public static void main(String[] args)
{
new MultiServer();
}
}


/*

******逸雨清风 出品

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