📄 chatserver.java
字号:
package Com.handou.Server;
import java.io.DataInputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.DataOutputStream;
import java.util.*;
public class ChatServer {
boolean isStart = false;//服务器是否启动标志
ServerSocket serv = null;
/**
* @param args
*/
List<Client> clients = new ArrayList<Client>();//保存客户端用户List
public static void main(String[] args) {
new ChatServer().start();
}
public void start(){//服务器启动方法
try{
serv = new ServerSocket(8888);
isStart = true;
}catch(BindException e){
System.out.println("端口已被占用,请停止相关应用在重启该程序!");
System.exit(0);
}catch(Exception e){
e.printStackTrace();
}
try{
while(isStart){
Socket se = serv.accept();
Client c = new Client(se);
new Thread(c).start();
clients.add(c);
}
}catch(IOException s){
s.printStackTrace();
}finally{
try{
serv.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
class Client implements Runnable{//为每个连接的客户端启用一个线程
private boolean isConnection = false;//是否连接标志
private Socket s;
private DataInputStream dis = null;
private DataOutputStream dos = null;
private String username = null;
public Client(Socket s){//创建客户端连接
this.s=s;
try{
dis=new DataInputStream(s.getInputStream());
dos=new DataOutputStream(s.getOutputStream());
isConnection=true;
username =dis.readUTF();
}catch(IOException e){
e.printStackTrace();
}
}
public void send(String str){//发送消息给客户端
try{
dos.writeUTF(str);
}catch(IOException e){
e.printStackTrace();
}
}
@Override
public void run() {//将接受的消息利用循环发送给所有的客户端
try{
while(isConnection){
String str = dis.readUTF();
//System.out.println(str);
for(int i = 0; i<clients.size(); i++){
Client c = clients.get(i);
c.send(str);
}
System.out.println("此时在线用户有:");
for(int k = 0; k<clients.size();k++){
Client u = clients.get(k);
System.out.println(u.username);
}
//System.out.println(str);
}
}catch(EOFException e){
System.out.println("客户端已关闭!");
}catch(IOException e){
e.printStackTrace();
}finally{
try{
if(dis != null)dis.close();
if(dos != null) dos.close();
if(s != null)s.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -