Luận văn: Lập trình phân tán trên Java pot - Pdf 15

Luận văn
Lập trình phân tán
trên Java
GIỚI THIỆU
1. Lý do chọn đề tài
Cờ caro là một trò chơi nhỏ hấp dẫn và không thiếu phần sáng tạo, chắc
hẳn ai cũng từng trải nghiệm qua trò chơi nhỏ này trong những lúc xả stress
cùng bạn bè. Nhưng trong cuộc sống hiện đại ngày nay chúng ta không thể trực
tiếp ngồi chơi cờ cùng nhau. Vì thế, chơi cờ caro online qua mạng đã ra đời
phục vụ nhu cầu đó.
2. Yêu cầu
2.1. Server:
• Lắng nghe.
• Phục vụ yêu cầu của Client.
• Xử lý nước đi của các Client để gửi kết quả thắng thua trong bàn cờ
cho các Client trong bàn cờ.
2.2. Client:
• Kết nối Server.
• Gửi yêu cầu cho Server phục vụ: mời chơi, chấp nhận lời mời, nước
đi, chơi lại.
3. Một số kỹ thuật liên quan
• Sử dụng mô hình mạng Client/Server, giao thức TCP/IP.
• Cổng kết nối 9000.
• Sử dụng Socket và kỹ thuật multithread trong Java, và một số tính
năng khác.
• Lựa chọn ngôn ngữ: Java. (Java được xem là một ngôn ngữ lập trình
ứng dụng cho mạng vì những đặc tính riêng biệt của chúng như đa hệ nền,
đa luồng, bảo mật, hướng đối tượng, phân tán, ứng dụng web…).

 WIN: server gửi tín hiệu người thắng cuộc.
“WIN:username_thăng:<nước đi>:username_thua”.
 Lose: xử thua cho một client nào đó: “Lose:username”.
 ReConnect: client gửi tín hiệu connect lại để chơi với người khác,
khi không muốn chơi với người A nữa:
“ReConnect:username_của_mình”.
4.1.3. Class chính trong chương trình phía Server: Server.java
a. RefreshListUserPlaying
Cập nhật danh sách những người đang chơi game.
while(userPlaying != null){
String display = "";
for(String s:userPlaying){
if(display.equals("")){
display = s;
}
else{
display = display + ":" + s;
}
}
String []sql = display.split(":");
jListPlaying.setListData(sql);
}
b. refreshListUser
Cập nhật danh sách những người đang online.
while(userOnline != null){
String display = "";
for(String s:userOnline){
if(display.equals("")){
display = s;
}

userIDToConnect.remove(uid);
if(userPlaying != null && userPlaying.size() > 0 &&
userPlaying.contains(uid))
userPlaying.remove(uid);
if(userFree != null && userFree.size() > 0 &&
userFree.contains(uid))
userFree.remove(uid);
 removeUserPlay(String user): xóa những user đã chọn được
bạn chơi trong danh sách người chời chưa chọn được bạn chơi.
 runServer() : chạy luồng chính của server (lắng nghe-chờ tín
hiệu kết nối từ client).
userOnline = new ArrayList<String>();
userPlaying = new ArrayList<String>();
userFree = new ArrayList<String>();
listCon = new ArrayList<Connection>();
userIDToConnect = new HashMap<String,
Connection>();
Thread serverThread = new Thread(new
processRequest());
serverThread.start();
Thread refresh = new Thread(new
refreshListUser());
refresh.start();
Thread playing = new Thread(new
RefreshListUserPlaying());
playing.start();
 sendToAllClient(string): gửi tín hiệu phản hồi từ server đến tất
cả các client.
 setDetailConnect(string): server lưu vết các client connect &
disconnect.

 Connection(Server ser, Socket s): Định nghĩa các biến.
public Connection(Server ser, Socket s){
server = ser;
communitySocket = s;
}
 closeConnectionSocket(): Đóng kết nối các Client đã
closeconnection.
try{
if(in != null) in.close();
if(out != null) out.close();
communitySocket.close();
player1 = null;
player2 = null;
userID1 = null;
userID2 = null;
}catch(Exception ex){
}
 run(): Lắng nghe các kết nối, yêu cầu từ phía Client, thực thi,
kiểm tra yêu cầu và trả về kết quả phù hợp với các yêu cầu của
Client.
OutputStream socketOut = null;
InputStream socketIn = null;
while(true){
try{
if(communitySocket.isClosed())
break;
socketOut = communitySocket.getOutputStream();
out = new OutputStreamWriter(socketOut);
socketIn = communitySocket.getInputStream();
if(socketIn == null)

input.substring(10).split(":");
if(detail.length > 0){
this.server.addUserFree(detail[0])
;
this.server.removeUserPlay(detail[
0]);
bc = null;
}
}
else if(input.startsWith("Disconnect:")){
String detail[] =
input.substring(11).split(":");
this.server.closeConnection(this,
detail[0]);
this.server.setDetailConnection(userID + "
disconnected");
this.server.sendToAllClient("Disconnec
t:" + userID);
closeConnectionSocket();
}
else if(input.startsWith("CallPlay:")){
String detail[] =
input.substring(9).split(":");
if(detail.length > 0){
this.server.sendToAllClient("CallPlay:" +
detail[1] + ":" + detail[0]);
}
}
else if(input.startsWith("NoRePlay:")){
String detail[] =

btn[i][j].setFont(new Font("Times New Roman",
1, 16));
btn[i][j].addActionListener(new
ActionListener(){
public void actionPerformed(ActionEvent e)
{
choice = e.getActionCommand();
send();
disable();
}
});
jPanelBanCo.add(btn[i][j]);
}
b. class ClassReceive
Nhận các giao thức từ Server để xử lý
public void run(){
try{
while(true){
in = new BufferedReader(new
InpuStreamReader(socket.getInputStream()));
out = new
PrintWriter(socket.getOutputStream());
String input = in.readLine();
if(input == null){
System.out.println("du lieu bi null");
return;
}
System.out.println(input);
String []detail = input.split(":");
int n = detail.length;

{
out.println("Disconnect:" + username);
out.flush();
setVisible(false);
dispose();
}
}
}
else if(detail[0].equals("CallPlay")){
if(detail[1].equals(username)){
int resulf =
JOptionPane.showConfirmDialog(frame, "Bạn nhận được lời
mời từ " + username, "Mời chơi",
JOptionPane.YES_NO_OPTION);
if(resulf == JOptionPane.YES_OPTION){
out.println("Yes:" + username + ":" +
detail[2]);
jPanelBanCo.setVisible(true);
jButtonMoiChoi.setEnabled(false);
if(detail[2] != null && !
detail[2].equals(username))
usernameCalled = detail[2];
LabelPlayer2.setText(usernameCalled);
}
else{
out.println("No:" + username + ":" +
detail[2]);
jPanelBanCo.setVisible(false);
jButtonMoiChoi.setEnabled(true);
usernameCalled = null;

jLabelDiTruoc.setText(" ");
}
else if(detail[0].equals("KieuConDi")){
if(detail[1].equals(username)){
if(detail[4] != null)
kieucondi = detail[2];
if(detail[4] != null)
kieuConDiDoiThu = detail[4];
}
else if(detail[3].equals(username)){
if(detail[4] != null)
kieucondi = detail[4];
if(detail[2] != null)
kieuConDiDoiThu = detail[2];
}
}
else if(detail[0].equals("Played")){
if(detail[1].equals(usernameCalled)){
if(detail[3] != null){
String nuocdi[] = detail[2].split(",");
if(nuocdi.length > 1){
setNuocDi(Integer.parseInt(nuocdi[0]),
Integer.parseInt(nuocdi[1]), kieuConDiDoiThu);
ToDo(10);
}
}
}
else if(detail[1].equals(username)){
}
}

clearBanCo();
timeWaiting.cancel();
}
else if(answer == JOptionPane.NO_OPTION){
out.println("ReConnect:" + username);
out.flush();
clearBanCo();
jPanelBanCo.setVisible(false);
out.println("NoRePlay:" + usernameCalled);
out.flush();
jButtonMoiChoi.setEnabled(true);
timeWaiting.cancel();
}
}
}
else if(detail[0].equals("NoRePlay")){
if(detail[1] != null &&
detail[1].equals(usernameCalled)){
jButtonMoiChoi.setEnabled(true);
}
}
}
}
}catch(Exception ex){
System.out.println("Khong the nhan du lieu.");
ex.printStackTrace();
}
}
c. Các function chính
 Function doConnected(): quản lí việc đăng nhập của user

public void send(){
try {
in = new BufferedReader(new
InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream());
if(choice.equals("")){
System.out.print("Choice rong.");
return;
}
String []n1 = choice.substring(2).split("_");
if(n1.length > 0){
int i = Integer.parseInt(n1[0]);
int j = Integer.parseInt(n1[1]);
System.out.println(i);
System.out.println(j);
if(kieucondi == null && kieuConDiDoiThu != null){
if(kieuConDiDoiThu.equals("X"))
kieucondi = "O";
else if(kieuConDiDoiThu.equals("O"))
kieucondi = "X";
}
if(kieuConDiDoiThu == null && kieucondi != null){
if(kieucondi.equals("X"))
kieuConDiDoiThu = "O";
else if(kieucondi.equals("O)"))
kieucondi = "X";
}
if(kieucondi == null && kieuConDiDoiThu == null){
kieucondi = "X";
kieuConDiDoiThu = "O";

in = new BufferedReader(new
InputStreamReader(soc.getInputStream()));
String input = in.readLine();
if(input == null){
System.out.println("du lieu bi null");
return;
}
String []detail = input.split(":");
int n = detail.length;
if(n > 0){
if(detail[0].equals("Update")){
String []spl = new String[n-1];
for(int i = 1; i< n; ++i)
spl[i] = detail[i];
jListDanhSach.setListData(spl);
}
}
}catch(Exception ex){…}
 Function callPlay(String userID): mời bạn chơi cờ
public void callPlay(String userID){
try {
out = new PrintWriter(socket.getOutputStream());
out.println("CallPlay:" + username + ":" + userID);
out.flush();
jButtonMoiChoi.setEnabled(false);
usernameCalled = userID;
} catch (IOException ex) { … }
}
 Function setNuocDi(int row, int col, String kieu)
 Function clearBanCo()


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status