服务器端代码:
//Server.java
import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class Server {
private static Socket socket = null;
private static ServerSocket serverSocket = null;
private static List socketList = new ArrayList();
private static PrintStream ps = null;
private static String name;
public static void main(String[] args) {
try {
serverSocket = new ServerSocket(9527);
System.out.println("服务开启,等待客户端连接...");
while(true){
socket = serverSocket.accept();
for (int i = 0; i < socketList.size(); i++) {
if (socket != socketList.get(i)) {
try {
ps = new PrintStream(socketList.get(i).getOutputStream());
ps.println("IP地址为" + socket.getInetAddress().getHostAddress() + "的用户加入聊天");
} catch (IOException e) {
e.printStackTrace();
}
}
}
PrintStream ps = new PrintStream(socket.getOutputStream());
ps.println("欢迎来到聊天室,在线人数" + (socketList.size()+1) + ",请设置你的聊天昵称:");
socketList.add(socket);
System.out.println("IP地址为" + socket.getInetAddress().getHostAddress() + "的用户连接成功");
ServerInputThread st = new ServerInputThread(socketList,socket);
st.start();
}
} catch (IOException e) {
System.out.println("--------------系统消息:连接意外关闭--------------");
}
try {
serverSocket.close();
} catch (IOException e) {
System.out.println("--------------系统消息:服务器关闭失败--------------");
}
}
}
//ServerInputThread.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.List;
class Entity{
private String name;
private Socket socket;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Socket getSocket() {
return socket;
}
public void setSocket(Socket socket) {
this.socket = socket;
}
}
public class ServerInputThread extends Thread {
private List sockets;
private Socket socket;
private BufferedReader br = null;
private BufferedReader br_name = null;
private String content;
private PrintStream ps = null;
private String name;
private String temp;
public ServerInputThread(List sockets, Socket socket)
throws IOException {
this.sockets = sockets;
this.socket = socket;
// this.name = name;
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
br_name = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
ps = new PrintStream(socket.getOutputStream());
}
@Override
public void run() {
super.run();
// 服务器循环等待客户端发来消息
while ((content = readFromCilent()) != null) {
if (name == null) {
if ((name = readFromCilent()) != null) {
System.out.println("IP为"
+ socket.getInetAddress().getHostAddress()
+ "的用户将名称设置为" + name);
continue;
}
}
if (null != this.name){
temp = name + " 说: " + content;
System.out.println(name + " 说: " + content);
}
else{
temp = socket.getInetAddress().getHostAddress()
+ " 说: " + content;
System.out.println(socket.getInetAddress().getHostAddress()
+ " 说: " + content);
}
//广播消息
for (int i = 0; i < sockets.size(); i++) {
if (socket != sockets.get(i)) {
try {
ps = new PrintStream(sockets.get(i).getOutputStream());
ps.println(temp);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
public String readFromCilent() {
try {
return br.readLine();
} catch (Exception e) {
System.out.println("IP地址为"+socket.getInetAddress().getHostAddress()+"的客户退出聊天");
sockets.remove(socket);
}
return null;
}
}
客户端代码:
//Cilent.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Cilent {
private static Socket socket = null;
private static String s = null;
private static String content = null;
private static PrintStream ps = null;
public static void main(String[] args) {
try {
socket = new Socket("10.1.40.143",9527);
BufferedReader info = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(info.readLine());
//设置昵称
BufferedReader nakeName = new BufferedReader(new InputStreamReader(System.in));
ps = new PrintStream(socket.getOutputStream());
ps.println(nakeName);
//新建进程 启动进程 接收消息
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
CilentInputThread cit = new CilentInputThread(socket);
cit.start();
//客户端发送消息
while(null != (content = br.readLine())){
ps = new PrintStream(socket.getOutputStream());
ps.println(content);
}
socket.shutdownInput();
} catch (UnknownHostException e) {
System.out.println("--------------系统消息:未找到对应的服务--------------");
} catch (IOException e) {
System.out.println("--------------系统消息:管理员关闭了服务器--------------");
}
}
}
//CilentInputThread.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class CilentInputThread extends Thread{
BufferedReader br = null;
Socket socket = null;
String content;
public CilentInputThread(Socket socket) throws IOException {
this.socket = socket;
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
@Override
public void run() {
super.run();
while(null != (content = readFromServer())){
System.out.println(content);
}
}
public String readFromServer(){
try {
return br.readLine();
} catch (IOException e) {
System.out.println("服务器已关闭");
}
return null;
}
}