当前位置: 首页 > news >正文

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

服务器端也很简单,就是开一个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.");
}

}

相关文章:

  • java显示图片缩略图_java中生成图片的缩略图
  • 基于TCP/IP的手机聊天游戏(附带源码和解释)之客户端类
  • 在DataGrid等控件中添加自动编号的列
  • java 循环队列实现_Java实现循环队列
  • 长期用电脑人士要多吃樱桃
  • [软工]此EUP非彼EUP
  • java 加减乘除是原子操作吗_Go并发编程之传统同步—(3)原子操作
  • 毕业了
  • mysql innodb 删除_MySQL InnoDB 删除资料后释放硬盘空间
  • request变量java jsp_JSP里request变量列表
  • transition java_Transition 过渡
  • 相对最完整的软件测试工具手册
  • 上传图片并且生成可以控制大小图片清晰度的方法
  • 手机php开发环境,PHP开发环境搭建
  • 要不要把php5升级到php7,将php5升级到php7后AJAX不工作
  • Python实现BT种子转化为磁力链接【实战】
  • Spark RDD学习: aggregate函数
  • Vue2 SSR 的优化之旅
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 数据可视化之 Sankey 桑基图的实现
  • 听说你叫Java(二)–Servlet请求
  • 我建了一个叫Hello World的项目
  • 携程小程序初体验
  • 《码出高效》学习笔记与书中错误记录
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • 我们雇佣了一只大猴子...
  • #etcd#安装时出错
  • #ubuntu# #git# repository git config --global --add safe.directory
  • $().each和$.each的区别
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (pojstep1.3.1)1017(构造法模拟)
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .net 8 发布了,试下微软最近强推的MAUI
  • .net 后台导出excel ,word
  • .net通用权限框架B/S (三)--MODEL层(2)
  • .NET文档生成工具ADB使用图文教程
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • @ConfigurationProperties注解对数据的自动封装
  • @RequestBody与@ResponseBody的使用
  • [AHOI2009]中国象棋 DP,递推,组合数
  • [BZOJ1040][P2607][ZJOI2008]骑士[树形DP+基环树]
  • [BZOJ1053][HAOI2007]反素数ant
  • [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
  • [Electron] 将应用打包成供Ubuntu、Debian平台下安装的deb包
  • [HDU 3555] Bomb [数位DP]
  • [NOSQL] Redis介绍
  • [Oracle]4--查询操作
  • [osgearth]通过API创建一个earth模型