[英]Observer Pattern used with Java socket programing not working
當我嘗試根據來自服務器的數據更新客戶端視圖時,我的Observer模式出現問題。
將消息發送到客戶端的代碼:
package model;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class PlayerThread extends Thread{
private BufferedReader inFromClient;
private PrintWriter outToClient;
private Socket socket;
public PlayerThread(Socket socket) throws IOException{
this.socket = socket;
inFromClient = new BufferedReader(new InputStreamReader(socket.getInputStream()));
outToClient = new PrintWriter(socket.getOutputStream(), true);
outToClient.println("Hey");
}
public void run(){
// needs to be implemented
}
}
該代碼負責在客戶端接收數據:
package connection;
import java.io.BufferedReader;
import mediator.ModelManager;
public class ClientRecieverThread extends Thread {
private ModelManager model;
private BufferedReader inFromServer;
public ClientRecieverThread(ModelManager model, BufferedReader inFromServer) {
this.model = model;
this.inFromServer = inFromServer;
}
@Override
public void run() {
String message = null;
try {
while (true) {
message = inFromServer.readLine();
//System.out.println(message);
model.setMessage(message);
}
} catch (Exception e) {
}
}
}
以及包含我在客戶端使用的觀察者模式的代碼:
package model;
public class MessageHandler {
private String message;
public MessageHandler(){
message = "Welcome";
}
public void setMessage(String message){
this.message = message;
}
public String getMessage(){
return this.message;
}
}
package mediator;
import java.io.IOException;
import java.net.UnknownHostException;
import java.util.Observable;
import model.MessageHandler;
import connection.Proxy;
public class ModelManager extends Observable{
private MessageHandler messageHandler;
private Proxy proxy; // establish the connection with the server
public ModelManager() throws UnknownHostException, IOException{
proxy = new Proxy(this);
messageHandler = new MessageHandler();
}
public synchronized void setMessage(String message){
setChanged();
messageHandler.setMessage(message);
notifyObservers(message);
}
public String getMessage(){
return messageHandler.getMessage();
}
public void send(String message){
proxy.send(message);
}
}
package view;
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import model.Board;
public class View extends JPanel implements Observer{
private JFrame frame;
private Board board;
private Rectangle[][] squares;
private JLabel messageLabel;
public View(){
initComponents();
initVariables();
addComponents();
}
private void initComponents() {
frame = new JFrame("TicTacToe");
frame.setSize(500, 500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
messageLabel = new JLabel("");
messageLabel.setHorizontalAlignment(SwingConstants.CENTER);
messageLabel.setVerticalAlignment(SwingConstants.CENTER);
this.setSize(300,300);
}
private void initVariables() {
board = new Board(3,3, 100);
squares = new Rectangle[board.getRow()][board.getCol()];
for (int i = 0; i < squares.length; i++){
for (int j = 0; j < squares[i].length; j++){
squares[i][j] = new Rectangle();
}
}
}
private void addComponents() {
frame.add(messageLabel, BorderLayout.NORTH);
frame.add(this);
frame.setVisible(true);
}
private void drawBoard(Graphics g, Board board) {
int positionX = this.getWidth()/2 - (board.getCellSize() + board.getCellSize()/2);
int positionY = 50;
Graphics2D g2d = (Graphics2D) g;
for (int i = 0; i < board.getRow(); i++) {
for (int j = 0; j < board.getCol(); j++) {
squares[i][j] = new Rectangle(positionX, positionY, 100, 100);
positionX += 100;
g2d.draw(squares[i][j]);
}
positionY += board.getCellSize();
positionX = this.getWidth()/2 - (board.getCellSize() + board.getCellSize()/2);
}
}
public void paintComponent(Graphics g){
drawBoard(g, board);
}
public void update(Observable o, Object arg) {
System.out.println((String)arg);
}
}
像這樣在Controller
類中完成ModelManager
和View
之間的連接( model.addObserver(view)
);
問題是我不理解為什么視圖沒有得到更新,盡管客戶端已經收到了數據。
先感謝您! :)
您需要調用方法notifyObservers();
當模型改變時,這將通知觀察者添加到模型中。
因此,在setMessage(String message)
,進行編碼:
if(this.message!=message){
this.message = message;
notifyObservers();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.