下面这个程序是我帮你在我以前的一个基础上改的,句法有点混乱,不过功能是实现了,其中S类是服务器端程序,ServerThread类用来处理多线程的,C类是客户机端程序。S类如下:import java.io.*; import java.net.*; import java.util.Vector; public class S { static Vector brs = new Vector(); public static void main(String[] args) { ServerSocket server = null; int numClient = 0; new Thread(new Runnable(){ public void run() { BufferedReader s = new BufferedReader(new InputStreamReader(System.in)); while (true) { try { String temp = s.readLine(); String control = null; int cc = 0;
if (temp.startsWith("to all ")) { for (int i = 0; i < brs.size(); i++) { BufferedWriter br = (BufferedWriter)brs.get(i); if (br != null) { br.write(temp + "\r\n"); br.flush(); } } } else { if (temp.matches("to \\d+ .*")) { control = temp.substring(0, temp.indexOf(" ", 3) + 1); cc = Integer.parseInt(control.substring(3, control.indexOf(" ", 3))); BufferedWriter br = (cc > 0 && cc <= brs.size()) ? (BufferedWriter)brs.get(cc-1) : null; if (br != null) { br.write(temp + "\r\n"); br.flush(); } else { System.err.println("找不到客户端 " + cc); listClients(); } } else { System.err.println("命令错误。必须是to <numClient> <message> 或 to all <message>"); listClients(); } } } catch (Exception e) { e.printStackTrace(); } } } }).start();
try { boolean flag = false; server = new ServerSocket(4710); while(true) { Socket client = server.accept(); PipedOutputStream pout = new PipedOutputStream(); for (int i = 0; i < brs.size(); i++) { if (brs.get(i) == null) { brs.set(i, new BufferedWriter(new OutputStreamWriter(pout))); numClient = i + 1; flag = true; break; } } if (!flag) { brs.add(new BufferedWriter(new OutputStreamWriter(pout))); numClient = brs.size(); } PipedInputStream pin = new PipedInputStream(pout); new ServerThread(pin, client, numClient).start(); System.out.println("Client" + numClient + " 连入"); } } catch(Exception e) { e.printStackTrace(); } }
public static void listClients() { System.out.print("当前客户端列表:"); for (int i = 0; i < brs.size(); i++) { if (brs.get(i) != null) { System.out.print((i + 1) + " "); } } System.out.println(); } } ServerThread类:import java.io.*; import java.net.*; public class ServerThread extends Thread { Socket client = null; int numClient; PipedInputStream pin; boolean done = false;
public ServerThread(PipedInputStream pin, Socket client, int num) { this.pin = pin; this.client = client; this.numClient = num; }
LZ加个监听器看行不行
import java.net.*;
import java.util.Vector;
public class S
{
static Vector brs = new Vector();
public static void main(String[] args)
{
ServerSocket server = null;
int numClient = 0; new Thread(new Runnable(){
public void run()
{
BufferedReader s = new BufferedReader(new InputStreamReader(System.in));
while (true) {
try {
String temp = s.readLine();
String control = null;
int cc = 0;
if (temp.startsWith("to all ")) {
for (int i = 0; i < brs.size(); i++) {
BufferedWriter br = (BufferedWriter)brs.get(i);
if (br != null) {
br.write(temp + "\r\n");
br.flush();
}
}
}
else {
if (temp.matches("to \\d+ .*")) {
control = temp.substring(0, temp.indexOf(" ", 3) + 1);
cc = Integer.parseInt(control.substring(3, control.indexOf(" ", 3))); BufferedWriter br = (cc > 0 && cc <= brs.size()) ? (BufferedWriter)brs.get(cc-1) : null;
if (br != null) {
br.write(temp + "\r\n");
br.flush();
}
else {
System.err.println("找不到客户端 " + cc);
listClients();
}
}
else {
System.err.println("命令错误。必须是to <numClient> <message> 或 to all <message>");
listClients();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
try
{
boolean flag = false;
server = new ServerSocket(4710);
while(true)
{
Socket client = server.accept();
PipedOutputStream pout = new PipedOutputStream();
for (int i = 0; i < brs.size(); i++) {
if (brs.get(i) == null) {
brs.set(i, new BufferedWriter(new OutputStreamWriter(pout)));
numClient = i + 1;
flag = true;
break;
}
}
if (!flag) {
brs.add(new BufferedWriter(new OutputStreamWriter(pout)));
numClient = brs.size();
}
PipedInputStream pin = new PipedInputStream(pout);
new ServerThread(pin, client, numClient).start();
System.out.println("Client" + numClient + " 连入");
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static void listClients()
{
System.out.print("当前客户端列表:");
for (int i = 0; i < brs.size(); i++) {
if (brs.get(i) != null) {
System.out.print((i + 1) + " ");
}
}
System.out.println();
}
}
ServerThread类:import java.io.*;
import java.net.*;
public class ServerThread extends Thread
{
Socket client = null;
int numClient;
PipedInputStream pin;
boolean done = false;
public ServerThread(PipedInputStream pin, Socket client, int num)
{
this.pin = pin;
this.client = client;
this.numClient = num;
}
public void run()
{
try
{
String line;
new Thread(new Runnable(){
public void run()
{
try {
BufferedReader is = new BufferedReader(new InputStreamReader(client.getInputStream()));
while (true) {
String info=is.readLine();
System.out.println("Client" + numClient + ":" + info);
if(info.equals("hello"))
{
PrintWriter pw=new PrintWriter(client.getOutputStream());
pw.println("hello");
pw.flush();
}
}
} catch (IOException e) {
done = true;
Li11_10.brs.set(numClient -1, null);
System.out.println("与 Client" + numClient + " 断开");
}
}
}).start();
BufferedReader sin = new BufferedReader(new InputStreamReader(pin));
PrintWriter os = new PrintWriter(client.getOutputStream());
line = sin.readLine();
String key = "to " + numClient + " ";
while(!done)
{
String words = line.substring(line.startsWith("to all ") ? "to all ".length() : key.length());
if (words != null) {
os.println(words);
os.flush();
System.out.println("Server " + key + ":" + words);
}
line = sin.readLine();
}
}
catch(Exception e) {
e.printStackTrace();
}
}
}
C类import java.io.*;
import java.net.*;
public class C { static Socket socket;
public static void main(String[] args) {
// TODO Auto-generated method stub
try
{
socket = new Socket("127.0.0.1", 4710);
new Thread(new Runnable(){
public void run()
{
BufferedReader is;
try {
is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true)
System.out.println("Server:" + is.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
PrintWriter os = new PrintWriter(socket.getOutputStream(), true);
BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
String readLine;
readLine = sin.readLine();
while(!readLine.equals("bye"))
{
os.println(readLine);
System.out.println("Client:" + readLine);
readLine = sin.readLine();
}
os.close();
socket.close();
}
catch(Exception e)
{
System.out.println("Error" + e);
}
}}