基于TCP/IP的手机聊天游戏(附带源码和解释)之服务器端类

原创 2006年06月06日 06:54:00

服务器端也很简单,就是开一个ServerSocket监听Client端的连接,如果有连接,就把此连接加入到一个List中。之所以这样处理,是为了管理用户连接,比如将来你可能需要增加给特定的用户发送私人消息的功能,那么就可以从这个用户列表中寻找特定的用户进行发送。

连接建立以后利用一个单独的线程来进行通讯。

MultiPlayerServer类:

import java.io.IOException;
import java.net.ServerSocket;
import java.util.List;
import java.util.Vector;

public class MultiPlayerServer implements Server,Runnable{
    private List list;

    public MultiPlayerServer() {
        list = new Vector();
        Thread t2 = new Thread(this);
        t2.start();
    }
   
    public void distributeUpdate(int type,int player_id,String content) {
        ServerConnection conn;
        Message msg = new Message(type,player_id,content);
        for (int i = 0; i < list.size(); i++) {
            conn = (ServerConnection) list.get(i);
            conn.sendMessage(msg);
        }
    }

   

    public synchronized void removeConnection(ServerConnection conn) {
        list.remove(conn);
        System.out.println("removed connection for player " + conn.getPlayerID());
        System.out.println("connection list size is now " + list.size());
    }

  

    public void run() {
        ServerSocket socket;

        try {
            socket = new ServerSocket(PORT);
            System.out.println("multiplayer server listening @ " + PORT);

            for (; ; ) {
                    synchronized (this) {
                        list.add(new ServerConnection(socket.accept(),this));
                    }
                }
        } catch (IOException ioe) {
            System.out.println("*** MultiPlayerServer.run(): " + ioe);
        }
    }

}

ServerConnection类:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.*;

public class ServerConnection implements Runnable {
    private MultiPlayerServer server;
    private Socket socket;
    private DataInputStream in;
    private DataOutputStream out;
    private int player_id;
    private Message err;
    private boolean done;
   
    public static Hashtable userList = new Hashtable();
    public static int player_count;

    /**
     * Create a new instance for use with game engine 'engine',
     * socket 'socket', and server 'server'.
     */
    public ServerConnection(Socket socket,MultiPlayerServer server) {
        this.server = server;
        this.socket = socket;
        done = false;
        Thread thread = new Thread(this);
        thread.start();
    }

    private synchronized void handleSignup(String str) {
        player_id = player_count++;
        if (player_id < 0) {
            System.out.println("ServerConnection.handleSignup(): engine refused player sign-up");
            return;
        }
        userList.put(new Integer(player_id),str);
        System.out.println("signed up player " + player_id);
        Message msg = new Message(Message.SIGNUP_ACK,player_id,"-1");

        try {
            msg.archive(out);
        } catch (IOException e) {
            System.out.println("***: could not send msg " + err);
        }
    }

    private void handleClientStatus(Message msg) {
        server.distributeUpdate(Message.SERVER_STATUS,player_id,userList.get(new Integer(player_id))+" 说 :"+msg.getStr());
    }

    public int getPlayerID() {
        return player_id;
    } 
 

    /**
     * Send a message to the client connected to this instance
     */
    public synchronized void sendMessage(Message msg) {
        try {
            msg.archive(out);
        } catch (IOException e) {
            System.out.println("***: could not send msg " + msg);
        }
    }

    /**
     * main loop
     */
    public void run() {
        Message msg;

        try {
            in = new DataInputStream(socket.getInputStream());
            out = new DataOutputStream(socket.getOutputStream());

            while (!done) {
                msg = Message.createFromStream(in);
                switch (msg.getType()) {
                case Message.SIGNUP:
                 System.out.println("Server is handling : SIGNUP");
                    handleSignup(msg.getStr());
                    System.out.println("Server After : SIGNUP");
                    break;
                case Message.CLIENT_STATUS:
                 System.out.println("Server receive : CIENT_STATUS");
                    handleClientStatus(msg);
                    break;
                case Message.SIGNOFF:
                    break;
                default:
                    break;
                }
            }

            in.close();
            out.close();
            socket.close();
        } catch (Exception ioe) {
            System.out.println("*** ServerConnection.run(): " + ioe);
            server.removeConnection(this);
        }
        server.removeConnection(this);
        System.out.println("player " + player_id + " disconnected.");
    }

}

 

基于TCP/IP的手机聊天游戏(附带源码和解释)之服务器端类

服务器端也很简单,就是开一个ServerSocket监听Client端的连接,如果有连接,就把此连接加入到一个List中。之所以这样处理,是为了管理用户连接,比如将来你可能需要增加给特定的用户发送私人...
  • ai_ma_ai
  • ai_ma_ai
  • 2015年12月29日 13:37
  • 1292

通俗的来说TCP/IP协议

TCP/IP协议 由于一直以来我听到太多的人问过我关于网络协议的问题,我自己在刚开始使用网络协议的时候也出现过,无法理解的情况,所有我想以个人的观点和理解来讲述下对于tcp/ip协议的理解。 一.TC...
  • qq84395064
  • qq84395064
  • 2017年07月19日 15:07
  • 258

如何使用TCP/IP与服务器进行通信-一个简单的聊天程序

原文: http://www.devx.com/wireless/Article/43551在上一章,我们讨论了如何在iPhoneapp中调用web服务以及如何解析服务器返回的XML。在Web服务大行...
  • kmyhy
  • kmyhy
  • 2013年03月02日 13:20
  • 12695

C# 网络编程之Tcp实现客户端和服务器聊天

在学习Tcp协议编程中完成了通讯聊天功能,下面简单讲讲我最近学到的及Tcp聊天的源代码及详细注释。 Tcp协议是一个传输层的协议,在Tcp协议编程中它通常使用的是3个类,其命名空间为System.Ne...
  • Eastmount
  • Eastmount
  • 2013年07月20日 13:26
  • 10825

使用TCP/IP协议实现聊天程序

TCP/IP协议的传输即面向点到点的传输方式!   1.创建应用程序   选择“NEW”菜单下的“Application”选项,创建一个普通的应用程序。   2.创建所需控件   首...
  • u014802181
  • u014802181
  • 2015年11月12日 10:49
  • 565

TCP/IP简易聊天软件C++实现 - 应用层协议

第一步:需求 软件需要实现的功能: 0.登录  1.私聊   2.群聊  3.文件传输 第二步:考虑使用的网络通信协议。 鉴于ICQ使用的TCP协议,采用TCP实现聊天和文件传输。因为服务器端...
  • han6771306
  • han6771306
  • 2014年04月19日 23:22
  • 1476

模拟器之间的Socket通讯

http://www.cnblogs.com/shaocm/p/3517031.html android项目最近开始用到socket通讯,而2个模拟器之间通讯需要借助ADB实现,这里了解下ADB。 ...
  • wu_wenhuan
  • wu_wenhuan
  • 2015年05月11日 11:09
  • 914

中小型手机棋牌网络游戏服务端架构设计(带源码)

承接自己[《中小型棋牌类网络游戏服务端架构》]博文,用Golang实现基础架构逻辑后,准备再次谈谈我的想法。 如果阅读起来感觉晦涩难懂,那就不妨直接看[源码] #Network 包含Server,Cl...
  • panshiqu
  • panshiqu
  • 2017年07月07日 18:26
  • 2999

3D动作手游《末日战歌》全套源码分享 客户端+服务端+数据库

源码介绍:         今天我们外星人源码论坛给大家分享一套《末日战歌》3D动作手游源码。游戏添加了丰富多样的各类养成系统及社区交互系统,同时还有精彩的飞龙战、塔防战、推塔等玩法。    ...
  • mianfei007
  • mianfei007
  • 2016年10月02日 10:05
  • 3788

linux下TCP/IP实现简单聊天程序

可以在同一台电脑上运行,在一个终端上运行服务器端,在一个终端上运行客户端。 服务器端的IP地址要和本地的IP相同,并分配端口号,客户端的默认设置为本地,端口号自动分配。 服务器...
  • imxiangzi
  • imxiangzi
  • 2016年01月06日 23:17
  • 826
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于TCP/IP的手机聊天游戏(附带源码和解释)之服务器端类
举报原因:
原因补充:

(最多只允许输入30个字)