发新话题
打印

flash网络游戏基础服务端(三)

flash网络游戏基础服务端(三)

服务端主要是转flash客户端传来的数据,比较简单.
这里是用java开发的.首先要去下载java的jdk,然后装进去(具体的如果有不明白建立去看java的安装和使用说明)
/*
* $Id: Server.java $
*
* @author  soda sujun10@21cn.com
* @version  1.0
* <br>Copyright 2005-2006 The SDK-I Studio
* <br>This program is protected by copyright laws.
* <br>Program Name:
* <br>Date:
*/
import java.net.Socket;
import java.net.ServerSocket;
import java.io.PrintWriter;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
/*
*
*/
public class Server
{
//存放所有用户位置的map
private Map map;
private BufferedReader br;
private static Server server;
public Server()
{
  map = new HashMap();
}
public static Server instance()
{
  if(server == null)
  {
   server = new Server();
  }
  return server;
}
public void start()
{
  try
  {
   ServerSocket serverSocket = new ServerSocket(5000);
   while(true)
   {
    //新建一个连接
    Socket socket = serverSocket.accept();
    //把最新的用户连接存放起来
    System.out.println("有用户登陆进来了");
    //存放新进的用户
    map.put("newUser",socket);
    br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    //接收用户名
    String userName = br.readLine();
    System.out.println("userName" + userName);
    //向所有的用户发送当前用户登陆的信息
    for(Iterator it = map.values().iterator(); it.hasNext();)
    {
     Socket so = (Socket)it.next();
     //如果当前的socket不为最新用户的socket时
     if(so != socket)
     {
      PrintWriter pw = new PrintWriter(so.getOutputStream());
      pw.print("newPerson:" + userName + "\0");
      pw.flush();
     }
    }
    //存放
    map.put(userName,socket);
    //启动线程
    new ServerThread(socket,map,userName).start();
   }
  }
  catch (Exception e)
  {
   System.out.println("服务器出现异常!");
  }
}
public static void main(String[] args) throws Exception
{
  instance().start();
}
}

接下来的是一个线程的类:
/*
* $Id: ServerThread.java $
*
* @author  soda sujun10@21cn.com
* @version  1.0
* <br>Copyright 2005-2006 The SDK-I Studio
* <br>This program is protected by copyright laws.
* <br>Program Name:
* <br>Date:
*/
import java.net.Socket;
import java.net.ServerSocket;
import java.io.PrintWriter;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
/*
*
*/

public class ServerThread extends Thread
{
private Map map;
private Socket socket;
private BufferedReader br;
private PrintWriter pw;
private String userName;
public ServerThread(Socket socket,Map map,String userName)
{
  this.socket = socket;
  this.map = map;
  this.userName = userName;
}
public void run()
{
  System.out.println(userName + "启动一个线程了!");
  try
  {
   //建立接受信息
   br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
   while(true)
   {
    //接收信息
    String message = br.readLine();
    //发送给新用户的标记;
    System.out.println("收到的消息:" + message);
    if(message.trim().startsWith("newUser"))
    {
     //System.out.println(userName + "线程信息!再此收到的信息:" + message);
     //取出最新登陆用户
     Socket socketTemp  = (Socket)map.get("newUser");
     sendMessage(socketTemp,message);
    }
    else
    {
     //向所有的用户发送当前用户登陆的信息
     map.remove("newUser");
     for(Iterator it = map.values().iterator(); it.hasNext();)
     {
      Socket socketTemp  = (Socket)it.next();
      //自己除外的所有用户
      if(socketTemp != socket)
      {
       sendMessage(socketTemp,message);
      }
     }
    }
   }
  }
  catch (Exception e)
  {
   //异常处理,当有用户异常退出时,向其他用户发出退出命令
   System.out.println(userName + "出现异常了");
   //删除出现异常的username
   map.remove(userName);
   if(!map.isEmpty())
   {
    try
    {
     System.out.println("发送该用户退出命令");
     sendAllUser(map,"exit:" + userName );
    }
    catch (Exception ee)
    {
     System.out.println("用户退出异常!ee:" + ee);
    }
   
   }
   System.out.println("线程错误:");
  }
}
public void sendAllUser(Map map,String msg) throws Exception
{
  for(Iterator it = map.values().iterator(); it.hasNext();)
  {
   Socket socketTemp  = (Socket)it.next();
   //自己除外的所有用户
   if(socketTemp != socket)
   {
    sendMessage(socketTemp,msg);
   }
  }
}
public void sendMessage(Socket so,String msg) throws Exception
{
  PrintWriter tempPw = new PrintWriter(so.getOutputStream());
  System.out.println("msg:" + msg);
  tempPw.print(msg + "\0");
  tempPw.flush();
}
}

TOP

java 不怎么熟悉.有些看不懂!!

不用用户同进发消息的时候都建立了一个新的线程?
http://www.wolf2999.cn

TOP

不是这样的,这是为每一个用户都建立一条线程
原理和聊天室一样

TOP

发新话题