基於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.");
}
}
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=775426
相關文章
- 基於TCP/IP的手機聊天遊戲(附帶原始碼和解釋)之客戶端類TCP遊戲原始碼客戶端
- 基於TCP/IP的手機聊天遊戲(附帶原始碼和解釋)之共享類TCP遊戲原始碼
- 【基於OpenAI的ChatGPT】搭建屬於自己的微信聊天機器人(附帶註冊英國手機號碼方式)OpenAIChatGPT機器人
- 【TCP/IP】TCP伺服器併發處理&原始碼TCP伺服器原始碼
- 基於Nodejs的Tcp封包和解包NodeJSTCP
- ecshop仿小米商城原始碼 帶手機移動端原始碼
- Python基於TCP實現聊天功能PythonTCP
- C++ 實現基於TCP的聊天室C++TCP
- 青蛙吃蚊子小遊戲原始碼_自適應手機端遊戲原始碼
- 基於c語言的TCP客戶端、服務端基礎程式碼C語言TCP客戶端服務端
- 使用Xamarin開發手機聊天程式 -- 基礎篇(大量圖文講解 step by step,附原始碼下載)原始碼
- Dubbo原始碼之服務端的釋出原始碼服務端
- 分散式應用開發的核心技術系列之——基於TCP/IP的原始訊息設計分散式TCP
- TCP/IP原始碼學習(23)——tcp_sendmsg(2)TCP原始碼
- TCP/IP 基礎TCP
- 【TCP/IP】IP地址的劃分及其分類TCP
- 面試之TCP/IP面試TCP
- TCP/IP之TCP的建立與終止TCP
- 基於Java的Socket類Tcp網路程式設計實現實時聊天互動程式(一):QQ聊天介面的搭建JavaTCP程式設計
- 【TCP/IP】IP地址分類和特殊IP地址TCP
- Vue 版消消樂小遊戲(pc/手機皆可線上體驗,附原始碼)Vue遊戲原始碼
- iOS端基於RSA公鑰加密和解密iOS加密解密
- IM即時通訊設計 高併發聊天服務:伺服器 + qt客戶端(附原始碼)伺服器QT客戶端原始碼
- TCP/IP基礎知識&Oracle的TCP/IP網路應用TCPOracle
- 一個手機上的網路聊天遊戲(圖)遊戲
- TCP/IP模型的簡單解釋TCP模型
- Java打飛機小遊戲(附完整原始碼)Java遊戲原始碼
- [原始碼和文件分享]基於VC++的MFC類庫的飛機大戰遊戲的設計與實現原始碼C++遊戲
- 模擬ip訪問(附模擬手機訪問)遠端地址
- 通俗理解這次的CPU漏洞,附帶修改過帶註釋原始碼一份原始碼
- JavaScript實現垃圾分類小遊戲教程,附原始碼!JavaScript遊戲原始碼
- 高仿短文學網原始碼 含手機端原始碼
- Java進階:基於TCP通訊的網路實時聊天室JavaTCP
- TCP/IP 基礎知識TCP
- JAVA Socket 底層是怎樣基於TCP/IP實現的???JavaTCP
- 基於node的tcp客戶端和服務端的簡單通訊TCP客戶端服務端
- Java容器類原始碼分析之Iterator與ListIterator迭代器(基於JDK8)Java原始碼JDK
- 討論一下基於網頁聊天的實現(類似gmail中的聊天)網頁AI