七叶笔记 » golang编程 » 游戏服务器并发原理(java、golang代码)

游戏服务器并发原理(java、golang代码)

服务器就是为了响应每一个客户端请求,根据不能命令,返回不同的内容,并且每一个工作流独立,不会因为其中一个客户端请求而阻塞了其它客户端,服务器应对的办法无外乎 多线程 和多协程(多进程现在已经很少才用了 ,因为创建进程资源消耗太大),我们先来看看golang的多协程并发。

代码(golang):

package main
import (
 "fmt"
 "math/rand"
)
var codeArray =[4]string{"首页","西瓜视频","小视频","我的"} //申明一个全局变量 模型为:今日头发App低部导航栏请求code
func main() {
 for i:=0;i<100 ;i++ {
 cadeArrayIndex:=rand.Intn(len(codeArray)); //模拟错综复杂前端请求命令,随机获得code一个指针
 go workerChannel(cadeArrayIndex); //创建一个协程
 }
}
func workerChannel(codeArrayIndex int) (workerState bool,err string) { //根据不同命令,服务器返回响应信息 
 if(codeArrayIndex==0){
 fmt.Println("收到一个'首页'命令请求,返回:hello,world!")
 workerState=true;
 }else if codeArrayIndex==1{
 fmt.Println("收到一个'西瓜视频'命令请求,返回:西瓜在此")
 workerState=true;
 }else if codeArrayIndex==2{
 fmt.Println("收到一个'小视频'命令请求,返回:小视频还在拍摄中")
 workerState=true;
 }else if codeArrayIndex==3{
 fmt.Println("收到一个'我的'命令请求,返回:程序桃子")
 workerState=true;
 }else {
 workerState=false;
 err="未能失败命令"
 }
 return workerState,err
}
 

代码说明:golang语言可以同时返回多个值, java 可以通过返回数组或对象,达到同样的效果。

服务器在同时相应前端请求时候,需要对一些资源进行锁定,防止出现错误。比如,服务器分苹果案例,一个只有10个苹果,一个客户端领取一个就减少一个,当苹果发完之后,服务器在接到前端请求就返回错误。

代码(java):

public class testThreadWorker {
 public volatile static Integer sum=5; //苹果数量
 public volatile static ReentrantLock  lock eObject=new ReentrantLock();
 public static void main(String args[]) {
 ArrayList<Thread> ThreadArray = new ArrayList<Thread>(); //用于存放 线程 对象
 for (int i = 0; i < 10; i++) {
 Thread clientWorker1 = new TestWorkerClientThread_1(i); //创建一个线程
 ThreadArray.add(clientWorker1);
 }
 for (Thread oneWorker : ThreadArray) {
 oneWorker.start(); //启动线程
 }
 }
}
class TestWorkerClientThread_1 extends Thread{
 private int unid;
 public TestWorkerClientThread_1(int unid){
 this.unid=unid;
 }
 public void run() {
 //第一中方法:采用 synchronized 来锁定
 synchronized (testThreadWorker.sum) { //对象进行锁定
 System.out.println("获得对象锁");
 if(testThreadWorker.sum>0){
 testThreadWorker.sum--; //减少一个苹果
 System.out.println("线程["+this.unid+"]:享获得一个苹果");
 }else {
 System.out.println("线程["+this.unid+"]:遗憾,苹果没有了");
 }
 }
 //对象锁另外一种方法,通过使用ReentrantLock类来实现
 /*
 testThreadWorker.lockeObject.lock();
 System.out.println("获得对象锁");
 try {
 if (testThreadWorker.sum > 0) {
 testThreadWorker.sum--; //减少一个苹果
 System.out.println("线程[" + this.unid + "]:享获得一个苹果");
 } else {
 System.out.println("线程[" + this.unid + "]:遗憾,苹果没有了");
 }
 }finally {
 testThreadWorker.lockeObject.unlock();
 }
 */ }
}
 

这里采用java多线程处理,在线程中采用两种对象锁的方法来实现来保证数据安全性,至于用哪种方式因人而异,习惯就好。总之,服务器编号过程中,时时保持高度警惕:保持数据正确性和并发力。

感谢java和golang。

相关文章