服务器端也很简单,就是开一个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 TCP/IP Socket编程是Java网络通信的核心技术,广泛应用于服务器端和客户端之间的数据传输。这本书的第二版深入探讨了如何使用Java实现TCP/IP协议栈的socket接口,为开发者提供了全面的理论知识和实践指导。 ...
本文将深入探讨基于Windows平台的TCP/IP编程基础知识,通过实例和源码注释,帮助初学者和正在学习socket编程的朋友更好地理解和掌握相关知识。 TCP(Transmission Control Protocol)是一种面向连接、可靠的传输...
18.11.1 TCP服务器端口号 193 18.11.2 限定的本地IP地址 194 18.11.3 限定的远端IP地址 195 18.11.4 呼入连接请求队列 195 18.12 小结 197 第19章 TCP的交互数据流 200 19.1 引言 200 19.2 交互式...
基于TCP~socket,Android客户端与PC通信,客户端源码。已经测试,可用。附带apk,和网络调试助手,方便测试。只需提供服务器的IP和端口号,即可通信。 客户端:一次连接,可发送多次数据。 重点是客户端时时接收...
Java TCP/IP Socket编程是网络通信领域中的核心技术,广泛应用于服务器端和客户端之间的数据传输。本资源包含一本关于Java TCP/IP Socket编程的书籍及其配套源代码,对于深入理解Socket编程至关重要。 书籍《Java ...
理解TCP/IP协议和HTTP请求响应机制是关键。可能使用到的库有Retrofit、OkHttp或者Volley,它们简化了网络请求的处理。 3. **摄像头接口**: Android提供了Camera API(旧版)和Camera2 API(新版)来访问和控制...
基于TCP~socket,Android客户端与PC通信,客户端源码。已经测试,可用。附带apk,和网络调试助手,方便测试。只需提供服务器的IP和端口号,即可通信。 客户端:一次连接,可发送多次数据。 重点是客户端时时接收...
Socket编程是基于TCP/IP协议的,可以确保数据的可靠传输。客户端需要打开一个Socket,连接到服务器的指定端口,并将每一帧图像数据通过OutputStream发送出去。同时,需要处理网络异常、连接断开等问题。 3. 图像...
标题中的“多语言IM即时通讯源码”指的是一个支持多种语言的即时通讯系统源代码,这种系统能够实现实时的信息交换,通常用于在线聊天、客服系统或者团队协作工具。IM,即Instant Messaging,即时通讯,是互联网应用...
【C++网络聊天系统源码】是一个为初学者设计的简单网络聊天程序,它基于传统的客户端-服务器模型,采用C++编程语言实现。这个项目旨在帮助学习者理解网络通信的基本原理,尤其是如何利用socket API进行数据传输。...
总结来说,"深入体验C#项目开发附带CD赠送源码 03 仿QQ聊天系统"这一主题涵盖了C#语言基础、网络编程、UI设计、多线程、数据存储等多个关键知识点,对于想要提升C#开发技能的程序员而言,这是一个极佳的实战项目。...
在实际应用中,客户端和服务器通过TCP/IP协议进行通信,客户端发送玩家的落子位置到服务器,服务器验证并更新游戏状态,然后将更新后的棋盘返回给所有客户端。为了确保游戏的实时性,开发者可能采用了异步IO或多线程...
飞鸽传书(IP Messenger),是由日本人Shirouzu Hiroaki (白水 启章)所发明的免费软件, 是一款局域网内即时通信软件,基于 TCP/IP(UDP)。可运行于多种操作平台(Win/Mac/UNIX/Java),并实现跨平台信息交流。不...
"类似QQ的聊天软件JAVA版源码(附设计文档)" 这个标题揭示了我们要讨论的核心内容:一个用Java语言开发的聊天软件,其功能和界面设计与QQ相似,并且提供了完整的源代码以及设计文档。这意味着开发者不仅可以学习到...
3. **服务器端编程**:在C#中,首先需要创建一个Socket对象,然后绑定到特定的IP地址和端口号,并监听客户端的连接请求。当有新的连接时,Socket的Accept方法会被阻塞,直到接收到来自客户端的连接。 4. **客户端...
该压缩包文件“基于Java的类似QQ的聊天软件JAVA版源码(附设计文档).zip”包含了开发一个类似于QQ的聊天软件的全部源代码,是学习和理解Java编程、网络通信以及图形用户界面设计的理想资源。这个项目的核心知识点...
1. **Java网络编程基础**:Java通过Socket类和ServerSocket类提供了对TCP/IP协议的支持。Socket用于创建客户端连接,ServerSocket则在服务器端监听客户端的请求。此外,DatagramSocket和DatagramPacket则用于UDP...
在Java聊天室项目中,设计说明书可能详细介绍了如何构建客户端与服务器之间的通信模型,可能是基于TCP/IP协议的网络编程。它可能还会解释如何使用多线程来处理并发连接,保证多个用户可以同时在线交流。此外,文档...
它可能用C#或其他.NET语言编写,并且可能包含服务器端和客户端两部分。 3. SCer.exe:可能是一个辅助工具或服务,用于安装、启动或维护远程控制进程。 4. DcRat.pdb:这是一个程序数据库文件,用于调试期间匹配源...
其特色在于附带有详细的文档,便于开发者理解和应用这些公共类。 【描述】"伍华聪公共类源码-WHC.OrderWater.Commons公共类源码(带文档)" 暗示这是一个软件开发资源,专注于C#编程语言。开发者可以从中学习到如何...