我现在正在作毕业设计,可是服务器端老是有问题,现在都快答辩了,所以挺着急的 ,想求CSDN上的程序员朋友帮帮忙,给我提供一个服务器端的源代码,分不够的话,我可以另外开贴。具体要求:多线程的处理客户端的连接:每一个客户的连接,都要放到一个单独的线程中处理。线程的管理:能够显示当前的线程数和线程的名称服务器的退出和客户端的退出:能够健壮的处理客户端的退出和服务器端的退出...
调试欢乐多
---------------------------这本书里边的聊天程序我已经看过了,我做的是三层架构的 客户端,服务器端和数据库,用户的登陆,注册和添加,删除好友都得通过服务器端对数据库进行访问,不是像这本书里只是简单的放进Vector中。不过还是谢谢你!
import java.net.*;
import java.util.*;class ServerThread extends Thread {
private Socket socket;
String name = "";
private BufferedReader in;
private PrintWriter out;
public ServerThread(Socket s) throws IOException {
socket = s;
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket
.getOutputStream())), true);
Server.outList.add(out);
start();
} public void run() {
try {
while (true) {
String str = in.readLine(); if (str.length() >= 5 && str.substring(0, 5).equals("NAME:")) {
name = str.substring(5, str.length());
Server.nameList.add(name);
out.println("欢迎 " + name + " 来到聊天室,当前共有"
+ Server.nameList.size() + "人在线");
System.out.println("一个客户端连接>>>昵称: " + name);
for (int w = 0; w < Server.outList.size(); w++) {
if (Server.outList.get(w) == out) {
((PrintWriter) Server.outList.get(w))
.println(sendClient(Server.nameList));
((PrintWriter) Server.outList.get(w))
.println(sendClientno(Server.nameList));
continue;
} ((PrintWriter) Server.outList.get(w))
.println(sendClient(Server.nameList));
((PrintWriter) Server.outList.get(w))
.println(sendClientno(Server.nameList));
((PrintWriter) Server.outList.get(w)).println(name
+ "进入了聊天室,当前共有" + Server.outList.size() + "人在线");
} out.println(sendClient(Server.nameList));
out.println(sendClientno(Server.nameList));
// System.out.println("一个客户端已经连接:
// "+socket.getInetAddress()+"端口: "+socket.getPort());
printInfo(Server.nameList);
continue;
}
// System.out.println(str);
if (str.equals("[ClientMessageEND]")) {
break;
} if (str.length() >= 16
&& str.substring(0, 16).equals("[Client:Message]")) {
str = str.substring(16, str.length());
} for (int i = 0; i < Server.outList.size(); i++) {
// System.out.println("received "+i+ str);
if (Server.outList.get(i) == out)
((PrintWriter) Server.outList.get(i)).println("你说: "
+ str);
else {
((PrintWriter) Server.outList.get(i)).println(name
+ "说: " + str);
}
} }
// System.out.println("关闭socket");
} catch (IOException e) {
System.out.println(name + " 非正常断开连接");
} finally {
try { for (int i = 0; i < Server.clicentList.size(); i++) {
if (Server.clicentList.get(i) == socket) {
Server.clicentList.remove(i);
name = Server.nameList.get(i) + "";
System.out.println(Server.nameList.get(i) + " 断开了连接");
Server.nameList.remove(i);
Server.outList.remove(i);
printInfo(Server.nameList);
for (int j = 0; j < Server.outList.size(); j++) {
((PrintWriter) Server.outList.get(j)).println(name
+ "离开了聊天室,当前共有" + Server.outList.size()
+ "人在线");
((PrintWriter) Server.outList.get(j))
.println(sendClient(Server.nameList));
((PrintWriter) Server.outList.get(j))
.println(sendClientno(Server.nameList));
} break;
} } // System.out.print("当前一共有"+Server.nameList.size()+"个人在聊天: ");
socket.close();
} catch (IOException e) { System.out.println("sock怎么就关不掉捏--!");
}
}
} public static String sendClientno(ArrayList al) {
String s = "[ServerMassageforgueno]在线人数 ";
s += al.size();
return s;
} public static String sendClient(ArrayList al) {
String s = "[ServerMassageforguest]";
for (int i = 0; i < al.size(); i++)
s += al.get(i) + " ";
return s;
} // 输出当前聊天室信息
public static void printInfo(ArrayList al) {
System.out.print("当前在线人数 " + al.size() + " :");
for (int i = 0; i < al.size(); i++)
System.out.print(al.get(i) + "\t");
System.out.print("\n");
}}public class Server {
static int n = 0; static final int PORT = 8080; static ArrayList clicentList = new ArrayList(); static ArrayList nameList = new ArrayList(); static ArrayList outList = new ArrayList(); static PrintWriter out; public static void main(String[] args) throws IOException {
ServerSocket s = new ServerSocket(); try {
System.out.println("启动服务器......");
s = new ServerSocket(PORT);
System.out.println("服务器启动成功\n" + s);
System.out.println("等待客户端连接...");
while (true) {
Socket socket = s.accept();
try {
new ServerThread(socket); clicentList.add(socket);
} catch (IOException e) {
socket.close();
}
}
} catch (IOException e) {
System.out.println("服务器启动失败,可能是端口"+PORT+"已经被占用");
} finally {
s.close();
}
}
}
以前学习的时候写的水平不高但基本达到楼住的要求 只是如果服务器端退出客户端时没有反应的 当时没有考虑 不过要加上这个功能很容易 客户端 需要netbeans自带的关于freelayout的jar包 楼主要的话留邮箱
[email protected]