📄 chessserver.java~234~
字号:
}
}
}
//私聊信息,把talkMessage字符串转发给名字为peerTalk的用户;
//所谓转发直接调用名字为peerTalk的socket的输出流,把信息;
//使用wirteUTF(String)发送即可;并且发送给自己反馈信息;
public boolean peerTalk(String peerTalk, String talkMessage){
for(Enumeration enu = clientDataHash.keys(); enu.hasMoreElements();){
Socket userClient = (Socket)enu.nextElement();
//判断peerTalk字符串和clientNameHash中的某个用户名字是否一样,
//同时不能和当前用户的名字一样;
if(peerTalk.equals((String)clientNameHash.get(userClient))&&
!peerTalk.equals((String)clientNameHash.get(clientSocket))){
synchronized (clientDataHash){
DataOutputStream peerOutData = (DataOutputStream)clientDataHash.get(userClient);
try{
peerOutData.writeUTF(talkMessage);
}
catch (IOException es){
es.printStackTrace();
}
}
Feedback(talkMessage);
return (false);
}
else if (peerTalk.equals( (String) clientNameHash.get(clientSocket))) {
Feedback(talkMessage);
return (false);
}
}
return (true);
}
//和peerTalk()代码相同,给对应的chesspeerTalk发送信息chessTalkMessage;
public boolean chessPeerTalk(String chessPeerTalk, String chessTalkMessage){
for (Enumeration enu = clientDataHash.keys(); enu.hasMoreElements();){
Socket userClient = (Socket) enu.nextElement();
if(chessPeerTalk.equals((String) clientNameHash.get(userClient)) &&
!chessPeerTalk.equals((String) clientNameHash.get(clientSocket))){
synchronized (clientDataHash){
DataOutputStream peerOutData = (DataOutputStream) clientDataHash.get(
userClient);
try{
peerOutData.writeUTF(chessTalkMessage);
}
catch (IOException es){
es.printStackTrace();
}
}
return (false);
}
}
return (true);
}
//字符串反馈给当前用户;
public void Feedback(String feedbackString){
synchronized (clientDataHash){
DataOutputStream outData = (DataOutputStream) clientDataHash.get(
clientSocket);
try {
outData.writeUTF(feedbackString);
}
catch (Exception eb){
eb.printStackTrace();
}
}
}
public String getUserList(){
String userList = "/userlist";
for(Enumeration enu = clientNameHash.elements(); enu.hasMoreElements();)
{
userList = userList + " " + (String) enu.nextElement();
}
return (userList);
}
//根据Hashtable表的Value获得其Key;
public Object getHashKey(Hashtable targetHash, Object hashValue){
Object hashKey;
//遍历Hashtable中的每对元素,选择与hashValue对象值相等的Key;
for(Enumeration enu = targetHash.keys(); enu.hasMoreElements();){
hashKey = (Object)enu.nextElement();
if(hashValue.equals((Object)targetHash.get(hashKey)))
return (hashKey);
}
return (null);
}
public void firstCome(){
publicTalk(getUserList());
Feedback("/yourname " + (String)clientNameHash.get(clientSocket));
Feedback("Java五子棋聊天客户端");
Feedback("/changename <你的名字> --更改名字");
Feedback("/list --更新用户列表");
Feedback("/<用户名> <要说的话> --私聊");
Feedback("注意:用命令的时候,先把谈话的对象定为所有人");
}
public void clientClose(){
server.messageBoard.append("用户断开:" + clientSocket + "\n");
//如果是游戏客户端主机,直接从chessPeerHash把该对元素移出
synchronized (chessPeerHash){
if (chessPeerHash.containsKey(clientNameHash.get(clientSocket))){
chessPeerHash.remove((String) clientNameHash.get(clientSocket));
}
//如果是游戏客户端从机,则把其对应的主机对应元素设置成"tobeclosed"
if (chessPeerHash.containsValue(clientNameHash.get(clientSocket))){
chessPeerHash.put((String)getHashKey(chessPeerHash,
(String)clientNameHash.get(clientSocket)),
"tobeclosed");
}
}
synchronized (clientDataHash){
clientDataHash.remove(clientSocket);
}
synchronized (clientNameHash){
clientNameHash.remove(clientSocket);
}
publicTalk(getUserList());
server.statusLabel.setText("当前连接数:" + clientDataHash.size());
try {
clientSocket.close();
}
catch (IOException exx) {
}
isClientClosed = true;
}
public void run(){
DataInputStream inData;
synchronized (clientDataHash){
server.statusLabel.setText("当前连接数:" + clientDataHash.size());
}
try {
inData = new DataInputStream(clientSocket.getInputStream());
firstCome();
while(true){
String message = inData.readUTF();
messageTransfer(message);
}
}
catch(IOException esx){
}
finally{
if(!isClientClosed){
clientClose();
}
}
}
}
public class chessServer extends Frame implements ActionListener{
Button messageClearButton = new Button("清除显示");
Button serverStatusButton = new Button("服务器状态");
Button serverOffButton = new Button("关闭服务器");
Panel buttonPanel = new Panel();
MessageServer server = new MessageServer();
ServerSocket serverSocket;
Hashtable clientDataHash = new Hashtable(50);
Hashtable clientNameHash = new Hashtable(50);
Hashtable chessPeerHash = new Hashtable(50);
//服务端的图形用户界面
chessServer(){
super("Java五子棋服务器");
setBackground(Color.pink);
buttonPanel.setLayout(new FlowLayout());
messageClearButton.setSize(60, 25);
buttonPanel.add(messageClearButton);
messageClearButton.addActionListener(this);
serverStatusButton.setSize(75, 25);
buttonPanel.add(serverStatusButton);
serverStatusButton.addActionListener(this);
serverOffButton.setSize(75, 25);
buttonPanel.add(serverOffButton);
serverOffButton.addActionListener(this);
add(server, BorderLayout.CENTER);
add(buttonPanel, BorderLayout.SOUTH);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
pack();
setVisible(true);
setSize(400, 450);
setResizable(false);
validate();
try {
//启动服务器ServerSocket,并在4331端口监听
makeMessageServer(4331, server);
}
catch (Exception e){
System.out.println("e");
}
}
// 在4331端口启动服务端ServerSocket
public void makeMessageServer(int port, MessageServer server)throws IOException{
Socket clientSocket;
long clientAccessNumber = 1;
this.server = server;
try{
//启动服务器端ServerSocket;
serverSocket = new ServerSocket(port);
//这里输出的是ServerSocket开始的机器和端口号;
server.messageBoard.setText("服务器开始于:" +
serverSocket.getInetAddress().getLocalHost() +
":" + serverSocket.getLocalPort() + "\n");
//循环等待用户的连接,返回连接客户的Socket,并保存到Hashtable中;
while(true){
clientSocket = serverSocket.accept();
server.messageBoard.append("用户连接:" + clientSocket + "\n");
//??为什么需要将从clientSocket获得的输出流和自己做到Hashtable中呢???
DataOutputStream outData = new DataOutputStream(clientSocket.getOutputStream());
clientDataHash.put(clientSocket, outData);
clientNameHash.put(clientSocket, ("新来客" + clientAccessNumber++));
//产生特定客户的Socket以及DataOutputStream,
//并加入到clientDataHash和clientNameHash中
//针对这个用户启动一个服务端的线程负责具体的客户
ServerThread thread = new ServerThread(clientSocket, clientDataHash,
clientNameHash, chessPeerHash,
server);
thread.start();
}
}
catch (IOException ex) {
System.out.println("已经有服务器在运行. \n");
}
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == messageClearButton) {
server.messageBoard.setText("");
}
if (e.getSource() == serverStatusButton) {
try {
server.messageBoard.append("服务器信息:" +
serverSocket.getInetAddress().getLocalHost() +
":" + serverSocket.getLocalPort() + "\n");
}
catch (Exception ee) {
System.out.println(
"serverSocket.getInetAddress().getLocalHost() error \n");
}
}
if (e.getSource() == serverOffButton) {
System.exit(0);
}
}
public static void main(String args[]) {
chessServer chessServer = new chessServer();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -