cocos2d-x網遊之java服務器篇
cocos2d-x是c++開發與java通信要使用inputStream和outputStream進行交互
提供一個簡單的多線程服務器,有三個文件。
- /**
- * @(#)ServerTank.java
- *
- *
- * @author buger
- * @version 1.00 2012/8/30
- */
- import java.util.*;
- import java.io.*;
- import java.net.*;
- public class ServerTank
- {
- public static void main(String args[])
- {
- new ServerAgentThread().start();
- }
- }
- /**
- * @(#)ServerThread.java
- *
- *
- * @author buger
- * @version 1.00 2012/8/31
- */
- //package wyf.jsc;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.ServerSocket;
- import java.net.Socket;
- import java.io.IOException;
- import java.io.ByteArrayInputStream;
- import java.io.ByteArrayOutputStream;
- import javax.swing.*;
- import javax.swing.event.*;
- import java.awt.*;
- import java.awt.event.*;
- import java.util.*;
- import java.io.*;
- import java.net.*;
- public class ServerThread extends Thread{
- Socket sc;
- InputStream is;
- OutputStream os;
- boolean flag=true;//循環控制標誌位
- int id=0;//第幾玩家標誌位 0-初始 1-第一玩家 2-第二玩家
- ServerAgentThread father;
- public ServerThread(ServerAgentThread father,Socket sc,int id)
- {
- this.father=father;
- this.sc=sc;
- this.id=id;
- try
- {
- is=sc.getInputStream();
- os=sc.getOutputStream();
- }
- catch(Exception e)
- {
- e.printStackTrace();
- }
- }
- public void run()
- {
- while(flag)
- {
- try{
- //System.out.println("Server Is Starting!---------------------\n");
- byte[] bytes = new byte[1024];
- int n = is.read(bytes);
- String c_str=new String(bytes,0,n);
- System.out.println("Server Is Starting!---------------------\n");
- System.out.println("Server Is Starting!*********************\n");
- if(c_str.startsWith("#ENTER_REQUEST#"))
- {//請求進入遊戲
- if(id<=2)
- {
- System.out.println("id="+id);
- //允許進入
- os.write(("<ALLOW_ENTER>").getBytes());
- //if()
- father.userList[id-1]=this;
- System.out.println("Player Loged In!---------------------------------\n");
- if(id==2)
- {//向兩個用戶發遊戲開始消息
- sendMsgTo2Users("<GAME_START>");
- //向用戶發Id消息
- //sendMsgTo1User("<#YOU_ID#>1",1);
- //sendMsgTo1User("<#YOU_ID#>2",2);
- }
- }
- else
- {//人數超,不讓進
- os.write(("<USER_FULL>").getBytes());
- flag=false;
- sc.close();
- //din.close();
- //dout.close();
- }
- }
- else if(c_str.startsWith("#Tank_Up#"))
- {
- os.write(("<Tank_Up>").getBytes());
- System.out.println("Tank_Up---------------------\n");
- }
- else if(c_str.startsWith("#Tank_Down#"))
- {
- os.write(("<Tank_Down>").getBytes());
- System.out.println("Tank_Down--------------------\n");
- }
- else if(c_str.startsWith("#Tank_Left#"))
- {
- os.write(("<Tank_Left>").getBytes());
- System.out.println("Tank_Left---------------------\n");
- }
- else if(c_str.startsWith("#Tank_Right#"))
- {
- os.write(("<Tank_Right>").getBytes());
- System.out.println("Tank_Right---------------------\n");
- }
- else if(c_str.startsWith("#Send_Fire#"))
- {
- System.out.println("Send_Fire----------------------\n");
- }
- }
- catch(Exception e)
- {
- System.out.println("有人掉線了");
- try
- {
- //sendMsgTo1User("<#ALLOW_EXIT#>",2);
- }
- catch(Exception ea)
- {
- ea.printStackTrace();
- }
- try
- {
- //sendMsgTo1User("<#ALLOW_EXIT#>",1);
- }
- catch(Exception ea)
- {
- ea.printStackTrace();
- }
- father.initState();
- break;
- }
- }
- }
- //向兩個玩家發同樣的消息
- public void sendMsgTo2Users(String msg) throws Exception
- {
- System.out.println("給兩個玩家發消息"+msg);
- for(ServerThread sat:father.userList)
- {
- sat.os.write((msg).getBytes());
- }
- }
- //向指定ID玩家發送消息
- public void sendMsgTo1User(String msg,int id) throws Exception
- {
- father.userList[id-1].os.write((msg).getBytes());
- }
- }
這是基於我的一個遊戲的部分。
- /**
- * @(#)ServerAgentThread.java
- *
- *
- * @author buger
- * @version 1.00 2012/8/31
- */
- //package wyf.jsc;
- import java.sql.*;
- import javax.swing.*;
- import javax.swing.event.*;
- import java.awt.*;
- import java.awt.event.*;
- import java.util.*;
- import java.io.*;
- import java.net.*;
- public class ServerAgentThread extends Thread
- {
- /**
- * Creates a new instance of <code>ServerAgentThread</code>.
- */
- ServerSocket ss;
- boolean flag=true;//循環控制標誌位
- int ucount=0;//玩家數量 0-沒有 1-1個玩家 2-兩個玩家
- ServerThread[] userList=new ServerThread[2];
- int hitId=0;//0無用戶 1-1號用戶 2-2號用戶
- public ServerAgentThread() {
- try
- {
- ss=new ServerSocket(5000);
- System.out.println("Server 1.0 CopyRight(c)All Rights Reserved Playerobe Studios!");
- System.out.println("TankServer服務器以啓動");
- System.out.println("正在監聽在5555端口.....");
- }catch(Exception e)
- {
- e.printStackTrace();
- }
- }
- /**
- * @param args the command line arguments
- */
- public void initState()//服務器回初始狀態
- {
- ucount=0;//玩家數量 0-沒有 1-1個玩家 2-兩個玩家
- userList=new ServerThread[2];
- hitId=0;//0無用戶 1-1號用戶 2-2號用戶
- }
- public static void main(String[] args) {
- // TODO code application logic here
- new ServerAgentThread().start();
- }
- public void run()
- {
- while(flag)
- {
- try
- {
- Socket sc=ss.accept();
- //接到一個用戶的連接請求
- System.out.println("接到一個用戶的連接請求 "+sc.getInetAddress().toString());
- ucount++;
- ServerThread sat=new ServerThread(this,sc,ucount);
- sat.start();
- }catch(Exception e)
- {
- e.printStackTrace();
- }
- }
- }
- }