我想问下如何在手机上建立一个服务器,用Socket的方法如何实现。

我想问下如何在手机上建立一个服务器,用Socket的方法如何实现。,第1张

TCP方式:

TCP协议客户端实现:

//创建一个Socket对象,指定服务器端的IP地址和端口号

Socketsocket=newSocket("1921681104",4567);

//使用InputStream读取硬盘上的文件,这里只是用文件当做信息源,可以读取控件用户输入信息

InputStreaminputStream=new

FileInputStream("f://file/wordstxt");

//从Socket当中得到OutputStream

OutputStream outputStream=socketgetOutputStream();

bytebuffer[]=newbyte[41024];inttemp=0;

//将InputStream当中的数据取出,并写入到OutputStream当中

while((temp=inputStreamread(buffer))!=-1)

5

{

outputStreamwrite(buffer,0,temp);}

outputStreamflush();}

TCP协议服务器端实现:

//声明一个ServerSocket对象

ServerSocketserverSocket=null;

try{

//创建一个ServerSocket对象,并让这个Socket在4567端口监听

serverSocket=newServerSocket(4567);

//调用ServerSocket的accept()方法,接受客户端所发送的请求,

//如果客户端没有发送数据,那么该线程就停滞不继续

Socketsocket=serverSocketaccept();

//从Socket当中得到InputStream对象

InputStreaminputStream=socketgetInputStream();

bytebuffer[]=newbyte[10244];

inttemp=0;

//从InputStream当中读取客户端所发送的数据

while((temp=inputStreamread(buffer))!=-1)

{

Systemoutprintln(newString(buffer,0,temp));}

}

catch(IOExceptione)

{

eprintStackTrace();}

serverSocketclose();

}

UDP方式

UDP的客户端代码实现如下:

public static void main(String[]args)

{

try{

//首先创建一个DatagramSocket对象

DatagramSocket socket=new DatagramSocket(4567);

//创建一个InetAddree

6

InetAddress serverAddress=InetAddressgetByName("1921681104");

String str="hello";

//这是要传输的数据

byte data[]=strgetBytes();

//把传输内容分解成字节

//创建一个DatagramPacket对象,并指定要讲这个数据包发送到网

络当中的哪个地址,以及端口号

DatagramPacket packet=new

DatagramPacket(data,datalength,serverAddress,4567);

//调用socket对象的send方法,发送数据

socketsend(packet);}

catch(Exceptione)

{

eprintStackTrace();}

}

UDP的服务端代码实现如下:

//创建一个DatagramSocket对象,并指定监听的端口号

DatagramSocket socket=new DatagramSocket(4567);

bytedata[]=newbyte[1024];

//创建一个空的DatagramPacket对象

DatagramPacket packet=new DatagramPacket(data,datalength);

//使用receive方法接收客户端所发送的数据,

//如果客户端没有发送数据,该进程就停滞在这里

socketreceive(packet);

Stringresult=newString(packetgetData(),packetgetOffset(),

packetgetLength());

Systemoutprintln("result--->"+result);

一般socket链接有以下两种方式:长(常)链接和短链接。

长链接:当数据发送完成后socket链接不断开。一直保留到异常或者是程序退出为止 ,这种方式的好处是不用每次去发起连接断开,在速度上可以比短连接要快一些,但是相 对来说对服务器的资源压力也要大些。长链接用的范围很广,比如游戏系统,qq等等,长 (常)链接一般还需要定时向服务器ping数据,以保证socket链接畅通。当ping不通服务 器时,需要重新开启链接。

短链接:当一次数据发送完毕后,主动断开链接,每次发送数据都要一次链接、断开 操作,这种方式的好处是:对服务器的资源占用相对来说比较小,但是由于每次都要重新 链接,速度开销上也比较大,这种方式对于那种不需要经常与服务器交互的情况下比较适 用。

上面两种方法在用户量非常大的情况下都存在着很大的不足,因此,考虑可以用 一种折衷的办法,那就是使用socket的连接池。

程序一开始初始化创建若干数量的长链接。给他们设置一个标识位,这个标识位表示 该链接是否空闲的状态。当需要发送数据的时候,系统给它分配一个当前空闲的链接。同 时,将得到的链接设置为“忙”,当数据发送完毕后,把链接标识位设置为 “闲”,让系统可以分配给下个用户,这样使得两种方式的优点都充分的发挥 出来了。用户数量足够多的时候,只需要动态增加链接池的数量即可。

下面我们用具体的程序来讲解下:

首先声明一个socket类:

public class XieGouSocket

{

public Socket m_socket; //Socket对象

public bool m_isFree; //判断是否空闲

public int m_index; //在链接缓存池中的索引值

}

下面的函数是创建socket链接池,这里为了使代码更加清晰,特地把异常处理部分 全部取掉了。

public XieGouSocket[] m_socket; //先定义个缓冲池

public void CreateSocketPool()

{

string ip= “127001”;

string port= 2003;

IPAddress serverIp=IPAddressParse(ip);

int serverPort=ConvertToInt32(port);

IPEndPoint iep=new IPEndPoint(serverIp,serverPort);

m_socket = new XieGouSocket[200];

for(int i =0; i < 200 ; i ++)

{

m_socket[i] = new XieGouSocket();

m_socket[i]m_index = i ;

m_socket[i]m_isFree = true;

m_socket[i]m_socket =new Socket (AddressFamilyInterNetwork,SocketTypeStream,ProtocolTypeTcp);

m_socket[i]m_socketSetSocketOption (SocketOptionLevelSocket,SocketOptionNameSendTimeout,1000);

m_socket[i]m_socketConnect(iep);

}

}

下面的函数是获取当前空闲的socket链接:

因为是多线程,所以需要加一个原子操作,定义一个原子变量,以防止多个线程 之间抢占资源问题的发生。

private static Mutex m_mutex=new Mutex();

public static XieGouSocket GetFreeConnection()

{

m_mutexWaitOne(); //先阻塞

for(int i =0; i < m_socketLength ; i ++)

{

if(m_socket[i]m_isFree) //如果找到一个空闲的

{

m_socket[i]m_isFree = false;

m_mutexReleaseMutex();//释放资源

return m_socket[i];

}

}

//如果没有空闲的链接,要么等待,要么程序再动态创建一个链接。

m_mutexReleaseMutex();//释放资源

return null;

}

当数据发送完毕后,程序必须将m_isFree 设置为 False。否则只使用不释放,程序很 快就溢出了。

hi,帅哥。我无法清晰的理解你的问题。为了便于理解,我们先把一个应用分一下层次,然后再讨论一下你需要在哪个层次上工作。首先,针对你提到的应用我们可以分成“协议层”,“中间层”,“业务层”“协议层”是指实现The WebSocket Protocol(RFC6455)的代码部分。其中Client端规范已经有支持WebSocket的浏览器实现了,估计不需要自己做client端吧。而Server端规范也有一些第三方的实现,例如:Kaazing,Netty。如果你没有也不想使用第三方提供的Server那么就需要自己写一个了。\"中间层\"是指基于协议层之上的辅助实现应用逻辑的框架。好像Netty就包含这样的框架。当然如果你不需要也可以直接忽略。\"业务层\"是指具体实现业务需求的代码部分,例如你提到的“登录”。那么现在请问你需要的是仅仅实现\"业务层\"的登录逻辑?还是服务端的协议?看到你已经有一个服务器,那么上面是否已经有了完整可用的服务器端代码?是否只需要实现客户端逻辑就可以了呢?

过程大概是KGSocketClient/KGSocketServe 创建了KGNetSession 会话管理进行发送/接收数据的监听会进行一次开启事件 OnStartRecive() 函数回调, 监听到的数据包KGNetPacket 通过KGPackExtension 转化成KGNetData自已定义的数据结构类,然后在KGNetSession里面的 OnReciveData(T) 函数 进行回调

这个好像没啥好说的=。= 自定义的数据类都要继承他

[上传失败(image-3c0ba8-1564388496437)]

因为每条消息包 你不知道他的长度 所以要在前面利用BitConverterGetBytes获取一个包的长度Int值

这个int就站byte[]四个长度 所以HeadLength=4,然后获取到长度了在SetPackLen给PacketBuff赋值上获取到的长度

所有打印都是通过KLog()进行打印的 在别的地方可以在LogEvent就可以获取到打印事件了

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 我想问下如何在手机上建立一个服务器,用Socket的方法如何实现。

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情