您的位置:首页 > 移动开发 > Unity3D

UNITY之使用Socket与java服务器通信

2016-09-08 19:18 561 查看
---------------------------客户端----------------------------------------

[csharp] view
plain copy







using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Net;

using System.Net.Sockets;

using System.Threading;

using UnityEngine;

/*

*

*Socket客户端通信类

*

* lm

*/

public class SocketHelper

{

private static SocketHelper socketHelper=new SocketHelper();

private Socket socket;

//饿汉模式

public static SocketHelper GetInstance()

{

return socketHelper;

}

private SocketHelper() {

//采用TCP方式连接

socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

//服务器IP地址

IPAddress address = IPAddress.Parse("127.0.0.1");

//服务器端口

IPEndPoint endpoint = new IPEndPoint(address,8000);

//异步连接,连接成功调用connectCallback方法

IAsyncResult result = socket.BeginConnect(endpoint, new AsyncCallback(ConnectCallback), socket);

//这里做一个超时的监测,当连接超过5秒还没成功表示超时

bool success = result.AsyncWaitHandle.WaitOne(5000, true);

if (!success)

{

//超时

Closed();

Debug.Log("connect Time Out");

}

else

{

//与socket建立连接成功,开启线程接受服务端数据。

Thread thread = new Thread(new ThreadStart(ReceiveSorket));

thread.IsBackground = true;

thread.Start();

}

}

private void ConnectCallback(IAsyncResult asyncConnect)

{

Debug.Log("connect success");

}

private void ReceiveSorket()

{

//在这个线程中接受服务器返回的数据

while (true)

{

if (!socket.Connected)

{

//与服务器断开连接跳出循环

Debug.Log("Failed to clientSocket server.");

socket.Close();

break;

}

try

{

//接受数据保存至bytes当中

byte[] bytes = new byte[4096];

//Receive方法中会一直等待服务端回发消息

//如果没有回发会一直在这里等着。

int i = socket.Receive(bytes);

if (i <= 0)

{

socket.Close();

break;

}

Debug.Log(System.Text.Encoding.Default.GetString(bytes));

}

catch (Exception e)

{

Debug.Log("Failed to clientSocket error." + e);

socket.Close();

break;

}

}

}

//关闭Socket

public void Closed()

{

if (socket != null && socket.Connected)

{

socket.Shutdown(SocketShutdown.Both);

socket.Close();

}

socket = null;

}

//向服务端发送一条字符串

//一般不会发送字符串 应该是发送数据包

public void SendMessage(string str)

{

byte[] msg = Encoding.UTF8.GetBytes(str);

if (!socket.Connected)

{

socket.Close();

return;

}

try

{

IAsyncResult asyncSend = socket.BeginSend(msg, 0, msg.Length, SocketFlags.None, new AsyncCallback(SendCallback), socket);

bool success = asyncSend.AsyncWaitHandle.WaitOne(5000, true);

if (!success)

{

socket.Close();

Debug.Log("Failed to SendMessage server.");

}

}

catch

{

Debug.Log("send message error");

}

}

private void SendCallback(IAsyncResult asyncConnect)

{

Debug.Log("send success");

}

}



----------------------------------服务器-------------------------------------------------

[java] view
plain copy







package org.u3d.server;

import java.io.BufferedInputStream;

import java.io.IOException;

import java.net.ServerSocket;

import java.net.Socket;

/**

*

* unity3d 服务端

*

*

*

* @author lm

*

*/

public class U3dServer implements Runnable {

public void run() {

ServerSocket u3dServerSocket = null;

while(true){

try {

u3dServerSocket=new ServerSocket(8000);

System.out.println("u3d服务已经启动,监听8000端口");

while (true) {

Socket socket = u3dServerSocket.accept();

System.out.println("客户端接入");

new RequestReceiver(socket).start();

}

} catch (IOException e) {

System.err.println("服务器接入失败");

if (u3dServerSocket != null) {

try {

u3dServerSocket.close();

} catch (IOException ioe) {

}

u3dServerSocket = null;

}

}

// 服务延时重启

try {

Thread.sleep(5000);

} catch (InterruptedException e) {

}

}

}

/**

* 客户端请求接收线程

* @author lm

*

*/

class RequestReceiver extends Thread {

/** 报文长度字节数 */

private int messageLengthBytes = 1024;

private Socket socket;

/** socket输入处理流 */

private BufferedInputStream bis = null;

public RequestReceiver(Socket socket) {

this.socket = socket;

}

@Override

public void run() {

try {

bis = new BufferedInputStream(socket.getInputStream());

byte[] buf = new byte[messageLengthBytes];

/**

* 在Socket报文传输过程中,应该明确报文的域

*/

while (true) {

/*

* 这种业务处理方式是根据不同的报文域,开启线程,采用不同的业务逻辑进行处理

* 依据业务需求而定

*/

//new RequestHandler(socket, buf).start();

bis.read(buf);

System.out.println(new String(buf,"utf-8"));

Message msg=new GeneralMessage("i am server");

msg.write(socket.getOutputStream());

}

} catch (IOException e) {

System.err.println("读取报文出错");

} finally {

if (socket != null) {

try {

socket.close();

} catch (IOException e) {

}

socket = null;

}

}

}

}

/**

* 描述: 请求处理器

*

*/

/* class RequestHandler extends Thread {

}

*/

}

[java] view
plain copy







[java] view
plain copy







<pre name="code" class="java">public class U3dApplication {

private static U3dApplication instance = null;

private boolean stop;

private U3dApplication() {

}

public static synchronized U3dApplication getApplication() {

if (instance == null) {

instance = new U3dApplication();

}

return instance;

}

public void start() {

init();

new Thread(new U3dServer(), "U3d Server").start();

while (!stop) {

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

}

}

}

/**

* @param args

*/

public static void main(String[] args) {

Runtime.getRuntime().addShutdownHook(new Thread() {

@Override

public void run() {

getApplication().stopMe();

}

});

getApplication().start();

}

public void stopMe() {

System.out.println("系统即将关闭...");

}

/**

* 初始化系统

*/

private void init() {

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: