GoRoutine可以替代C Socket的java多线程小游戏来做游戏服务器么

相关软件 /多国语言[中文]/ /多国语言[中文]/ /中文/ /中文/ /多国语言[中文]/ /中文/ /英文/ /中文/ /中文/ /中文/顶好评:50%踩坏评:50%请简要描述您遇到的错误,我们将尽快予以修正。轮坛转帖HTML方式轮坛转帖UBB方式
26.7M/中文/2.6
12.6M/中文/4.3
12.6M/中文/5.7
3.7M/中文/4.9
653KB/中文/6.4
14.7M/中文/1.0
2.7M/多国语言[中文]/4.5
线程池动态分配,处理多任务的服务器!用于大数据的处理。当任务量大于线程池中的线程量,此时,开辟新的线程,加入线程池!
安卓官方手机版
IOS官方手机版
C++多线程socket的服务器
下载帮助西西破解版软件均来自互联网, 如有侵犯您的版权, 请与我们联系。怎么在游戏中实现一个类似Zork中的指令系统?
比如,我要发送这样一个指令:
to firstname lastname,firstname lastname do watch TV,go to bed
我要解析出to,do关键字的对象,比如to的对象就是firstname lastname,firstname lastname,do的对象就是watch TV,go to bed。怎么做能做到准确解析而且保证效率?
2014年 10月21日
(630 威望)
请输入验证码:
[captcha placeholder]
或 后不会被要求输入验证码。
请输入验证码:
&&&& 或 后不会被要求输入验证码。
str.split 足矣 ... 连正则都不需要 ...
2014年 10月22日
(1,341 威望)
2013年 9月7日
请输入验证码:
[captcha placeholder]
或 后不会被要求输入验证码。
提一个问题:
2016年 7月9日
(1,049 威望)
2015年 3月18日
(937 威望)
2014年 10月24日
(1,025 威望)
2015年 11月10日
(983 威望)
2015年 4月1日
(716 威望)
欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。Linux下基于socket多线程并发通信的实现
我的图书馆
Linux下基于socket多线程并发通信的实现
[cpp] /***************************************************&*&文件名:pthread_server.c&*&文件描述:创建子线程来接收客户端的数据&***************************************************/&&#include&&sys/types.h&&&#include&&sys/socket.h&&&#include&&stdio.h&&&#include&&netinet/in.h&&&#include&&arpa/inet.h&&&#include&&unistd.h&&&#include&&stdlib.h&&&#include&&pthread.h&&&void&*rec_data(void&*fd);&&int&main(int&argc,char&*argv[])&&{&&&&&&&&&int&server_&&&&&&int&*client_&&&&&&&&&int&server_len,&client_&&&&&&&&&struct&sockaddr_in&server_&&&&&&&&&struct&sockaddr_in&client_&&&&&&&&&struct&sockaddr_in&&&&&&&&&&int&i,&&&&&&&&&char&char_recv,char_&&&&&&&&&socklen_t&&&&&&&&&&server_sockfd&=&socket(AF_INET,&SOCK_STREAM,&0);//创建套接字&&&&&&&&&&&&server_address.sin_family&=&AF_INET;&&&&&&&&&server_address.sin_addr.s_addr&=&&htonl(INADDR_ANY);&&&&&&&&&server_address.sin_port&=&htons(9734);&&&&&&&&&server_len&=&sizeof(server_address);&&&&&&&&&&&&&&&&&bind(server_sockfd,&(struct&sockaddr&*)&server_address,&server_len);//绑定套接字&&&&&&&&&templen&=&sizeof(struct&sockaddr);&&&&&&&&&&&&printf("server&waiting&for&connect/n");&&&&&&&&&while(1){&&&&&&&&&&&&&&&&pthread_t&//创建不同的子线程以区别不同的客户端&&&&&&&&&&&&&&&&client_sockfd&=&(int&*)malloc(sizeof(int));&&&&&&&&&&&&&&&&client_len&=&sizeof(client_address);&&&&&&&&&&&&&&&&*client_sockfd&=&accept(server_sockfd,(struct&sockaddr&*)&client_address,&(socklen_t&*)&client_len);&&&&&&&&&&&&&&&&if(-1==*client_sockfd){&&&&&&&&&&&&&&&&&&&&&&&perror("accept");&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&if(pthread_create(&thread,&NULL,&rec_data,&client_sockfd)!=0)//创建子线程&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&perror("pthread_create");&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&}&&&&&&&&&shutdown(*client_sockfd,2);&&&&&&&&&shutdown(server_sockfd,2);&&}&&/*****************************************&*&函数名称:rec_data&*&功能描述:接受客户端的数据&*&参数列表:fd——连接套接字&*&返回结果:void&*****************************************/&&void&*rec_data(void&*fd)&&{&&&&&&&&&int&client_&&&&&&&&&int&i,&&&&&&&&&char&char_recv[100];//存放数据&&&&&&&&&client_sockfd=*((int*)fd);&&&&&&&&&for(;;)&&&&&&&&&{&&&&&&&&&&&&&&&&if((byte=recv(client_sockfd,char_recv,100,0))==-1)&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&perror("recv");&&&&&&&&&&&&&&&&&&&&&&&exit(EXIT_FAILURE);&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&if(strcmp(char_recv,&"exit")==0)//接受到exit时,跳出循环&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&printf("receive&from&client&is&%s/n",char_recv);//打印收到的数据&&&&&&&&&}&&&&&&&&&free(fd);&&&&&&&&&close(client_sockfd);&&&&&&&&&pthread_exit(NULL);&&}&&&&&&&&/***************************************************&*&文件名:pthread_client.c&*&文件描述:创建子线程来接收客户端的数据&***************************************************/&&#include&&sys/types.h&&&#include&&sys/socket.h&&&#include&&stdio.h&&&#include&&netinet/in.h&&&#include&&arpa/inet.h&&&#include&&unistd.h&&&#include&&stdlib.h&&&int&main(int&argc,char&*argv[])&&{&&&&&&&&&int&&&&&&&&&&int&&&&&&&&&&struct&sockaddr_in&&&&&&&&&&&&&int&&&&&&&&&&int&i,&&&&&&&&&char&char_send[100]&=&{&0&};&&&&&&if((sockfd&=&socket(AF_INET,&SOCK_STREAM,&0))==-1)&&&&&&&&&{&&&&&&&&&&&&&&&&perror("socket");&&&&&&&&&&&&&&&&exit(EXIT_FAILURE);&&&&&&&&&}&&&&&&if(argc&!=&3){&&&&&&&&printf("Usage:&fileclient&&address&&&port&/n");//用法:文件名&服务器IP地址&服务器端口地址&&&&&&&&return&0;&&&&&}&&&&&if((sockfd&=&socket(AF_INET,SOCK_STREAM,0))&==&-1){&&&&&&&&&perror("sock");&&&&&&&&&exit(1);&&&&&}&&&&&bzero(&address,sizeof(address));&&&&&address.sin_family&=&AF_INET;&&&&&address.sin_port&=&htons(atoi(argv[2]));&&&&&inet_pton(AF_INET,argv[1],&address.sin_addr);&&len&=&sizeof(address);&&&&&&&&&if((result&=&connect(sockfd,&(struct&sockaddr&*)&address,&len))==-1)&&&&&&&&&{&&&&&&&&&&&&&&&&perror("connect");&&&&&&&&&&&&&&&&exit(EXIT_FAILURE);&&&&&&&&&}&&&&&&&&&&&&for(;;)&&&&&&&&&{&&&&&&&&&&&&&&&scanf("%s",&char_send);//输入发送数据&&&&&&&&&&&&&&&&fflush(stdin);//清除输入缓存&&&&&&&&&&&&&&&&if(strcmp(char_send,&"exit")==0){//如果输入exit,跳出循环&&&&&&&&&&&&&&&&&&&&&&&if((byte=send(sockfd,char_send,100,0))==-1)&&&&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&perror("send");&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&exit(EXIT_FAILURE);&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if((byte=send(sockfd,char_send,100,0))==-1)&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&perror("send");&&&&&&&&&&&&&&&&&&&&&&&exit(EXIT_FAILURE);&&&&&&&&&&&&&&&&}&&&&&&&&&}&&&&&&close(sockfd);&&&&&&exit(0);&&}&&&
编译服务器端程序
编译客户端程序
编译在开发板上跑的客户端程序:
先启动服务器端的程序
打开另一个终端,启动客户端的程序
放到开发板上,启动
服务器端:
开发板服务器端
楼主你好,你的程序无法真确运行,请查看一下!2楼
确实少了listen()补充: n = listen(server_sockfd, 2); if (n == -1) { perror("listen:"); exit(1); 原文35行: printf("server waiting for connect/n"); 改为 printf("server waiting for connect\n"); 原文75行: printf("receive from client is %s/n",char_recv);//打印收到的数据 改为 printf("receive from client is %s\n",char_recv);//打印收到的数据1楼
TA的最新馆藏[转]&
喜欢该文的人也喜欢Java&Socket多线程——服务器端
这是自己写的一段代码,运行在jdk1.5上,测试成功。jdk1.4不能用,因为不支持java.util.concurrent包。
如果要运行在jdk1.4上,则需要加入backport-util-concurrent.jar的引用,然后将SocketServer.java中的
import java.util.concurrent.ExecutorS
import java.util.concurrent.E
import edu.emory.mathcs.backport.java.util.concurrent.*;
SocketServer.java
import java.net.ServerS
import java.net.S
import java.util.concurrent.ExecutorS
import java.util.concurrent.E
import org.apache.log4j.L
import .StringH
//c:\jdk1.5\bin\java -classpath c:\jdk1.5
SocketServerThread
public class SocketServer {
&private static Logger logger =
Logger.getLogger(SocketServer.class);
&private ServerSocket serverS
&private ExecutorService
executorS//线程池
&&& private
final int POOL_SIZE=10;//单个CPU线程池大小
&public SocketServer(){
&&&serverSocket
= new ServerSocket(Constant.SocketPort);
&&&executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE);
&&&System.out.println("监听服务器启动,端口号:"
+ Constant.SocketPort);
&&catch(Exception e)
&&&String s =
"监听服务器启动 失败,可能是端口" + Constant.SocketPort + "已被占用,请重置端口" +
Constant.SocketPort + "后重试";
&&&logger.error(e.getMessage()
+ "&br /&" + s);
&&&//System.out.println();
&public void service() {
&&&while (true)
&&&&Socket
clientSocket=
接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接
&&&&&clientSocket
= serverSocket.accept();
&&&&&executorService.execute(new
SocketHandler(clientSocket));
catch (Exception e) {
&&&&&logger.error(StringHandler.GetException(e));
&&&&&e.printStackTrace();
&&catch (Exception e1) {
&&&//logger.error(StringHandler.GetException(e1));
&&&//e1.printStackTrace();
(serverSocket != null)
&&&&&serverSocket.close();
&&&&}catch(Exception
&public static void main(String[] args) throws
Exception {
SocketServer().service();
&&catch(Exception ex)
&&&logger.error(StringHandler.GetException(ex));
&&&ex.printStackTrace();
SocketHandler.java
import java.io.BufferedR
import java.io.InputS
import java.io.InputStreamR
import java.io.OutputS
import java.io.PrintW
import java.net.S
import java.text.SimpleDateF
import java.util.C
import org.apache.log4j.L
import .MonitorH
import .StringH
//public class SocketHandler implements Runnable {
public class SocketHandler implements Runnable{
&private static Logger logger =
Logger.getLogger(SocketHandler.class);
&private S
&public SocketHandler(Socket socket) {
&&this.socket =
//&&run();
&private PrintWriter getWriter(Socket socket)
throws Exception {
&&OutputStream socketOut =
socket.getOutputStream();
&&return new
PrintWriter(socketOut, true);
//&private BufferedReader getReader(Socket
socket) throws Exception {
&private String GetInfoByAction(String
returnStr = "";
&&&String[]
ssArgs = _args.split(";");
_productSeries = ssArgs[0];
&&&String _ciKey
= ssArgs[1];
(_productSeries.equals("") || _ciKey.equals(""))
&&&&return
&&&String _ip =
ssArgs[2];
&&&String _port
= ssArgs[3];
_username = "";
&&&String _pwd =
(ssArgs.length & 4)
&&&&_username
= ssArgs[4];
(ssArgs.length & 5)
= ssArgs[5];
&&&MonitorHandler
monitor = new MonitorHandler(_productSeries, _ciKey, _ip, _port,
_username, _pwd);
&&&returnStr =
monitor.GetMonitorInfo();
&&catch (Exception e)
&&&e.printStackTrace();
&&&logger.error(StringHandler.GetException(e));
Constant.ErrorNumber_UnkownE
&private static String GetCurrentTime()
&&&Calendar cal
Calendar.getInstance();&&&
&&&SimpleDateFormat
formatter = new SimpleDateFormat("yyyy-MM-dd
HH:mm:ss");&&
&&&String time =
formatter.format(cal.getTime());&&
&&catch(Exception ex)
&&&ex.printStackTrace();
&&&logger.error(StringHandler.GetException(ex));
&public void run() {
&&&//得到客户端发送的信息
&&&BufferedReader
&&&InputStream
socketIn = socket.getInputStream();
&&&br = new
BufferedReader(new InputStreamReader(socketIn));
actionInfo = "";
&&&&actionInfo
= br.readLine();
&&&catch(Exception
(actionInfo != null)
&&&&System.out.println(GetCurrentTime()
+ "收到来自【" + socket.getInetAddress() + ":" + socket.getPort() +
"】的监听请求:" + actionInfo);
(actionInfo != null)
&&&&&String
str = GetInfoByAction(actionInfo);
&&&&&//返回信息给Client端
&&&&&PrintWriter
pw = getWriter(socket);
&&&&&//System.out.println(str);
&&&&&pw.println(str);
&&&&actionInfo
= br.readLine();
&&} catch (Exception e) {
&&&logger.error(StringHandler.GetException(e));
&&&e.printStackTrace();
&&&finally
(socket != null)
&&&&&socket.close();
&&&} catch
(Exception e) {}
已投稿到:移动游戏开发相比于应用开发对普通开发者是否有更大的优势?
看了看自己手机主屏基本都是一些大厂官方应用,什么QQ,Wiz(这个应该算大厂吧),微信,微博,爱范儿等等。感觉近两年移动开发市场稳定,似乎也存在一些寡头垄断了吧。
个人开发着开发单机游戏对比应用有几个特点。
1,游戏无托管数据,相比于微博或者Wiz这些应用,用户可能不放心把一些数据交给一些小公司甚至是普通开发者掌握,我自己用一些存储或者什么类似唱吧这种应用也会考虑找个稍微大的厂商,感觉个人开发者似乎不太受信。
2,单机游戏不需要用户群,比如我会用微信不会用来往,不是来往应用怎么样只是我的朋友们都在微信。
3,游戏似乎比应用存在更多的可能性,现在大家常用需求比如SNS,拍照设置唱歌等需求感觉基本都有应用覆盖了。其他用户需求很难被开发出来,但是游戏本身不用考虑用户需要什么,而且设定背景完全不用基于真实的生活场景,所以感觉游戏开发似乎有更多的可能性。
不知道以上思路有没有什么问题?
新手是不是应该考虑进入游戏开发?
2015年 11月10日
(983 威望)
请输入验证码:
[captcha placeholder]
或 后不会被要求输入验证码。
请输入验证码:
&&&& 或 后不会被要求输入验证码。
1、游戏无托管数据?你说的是单机游戏吗?游戏的数据往往比应用的数据更加重要,举个例子吧,前不久,我们更新了一个版本,你知道我们的测试人员是怎么测试存档的吗?现在一共70几关,测试人员要玩一关,load一关的数据。
2、单机游戏不需要用户群?开玩笑啊。没用户,喝西北风啊?可能你的意思的单机游戏没有社交因素?相对于来往,即使我的来玩朋友和微信的朋友都是一样的,我也只会用微信,这是产品的问题。
3、游戏本身不用考虑用户需要什么?那用户为什么要玩你的游戏啊?游戏有更多的可能性倒是真的,有时候会爆赚,有时候会爆亏。
如果你想进入游戏行业,可以先多了解一下,而且游戏行业也有很多职位的,看看自己适合什么职位,然后往一个方向努力。
2015年 11月10日
(1,114 威望)
请输入验证码:
[captcha placeholder]
或 后不会被要求输入验证码。
提一个问题:
2012年 12月1日
(1,041 威望)
2014年 7月4日
(979 威望)
2014年 10月24日
(1,025 威望)
2014年 10月21日
(630 威望)
2015年 4月1日
(716 威望)
欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。

我要回帖

更多关于 多线程优化游戏 的文章

 

随机推荐