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

【急】c#服务器用套接字与android服务端互通训,要双向的,我自己写了一个,不成功,求例子,求指导,急啊

2014-11-12 10:35 246 查看
============问题描述============

c#服务端:


服务端

public class SocketClient {

static Socket client;

public SocketClient(String site, int port) {

try {

client = new Socket(site, port);

} catch (Exception e) {

Log.i("t460470591", "error");

e.printStackTrace();

}

}

public String sendMsg(String msg)  {

try {

PrintWriter out;

out = new PrintWriter(new BufferedWriter(new OutputStreamWriter

(client.getOutputStream())), true);

out.println(msg);//发送数据到服务端

Thread.sleep(1000);//没做while循环接收服务器的数据,我就直接睡眠一下,只接收一次数据

InputStream inputStream=  client.getInputStream(); //获取套接字的输入流

ByteArrayOutputStream   baos   =   new   ByteArrayOutputStream();

int   i=-1;

while((i=inputStream.read())!=-1){  //我这里DEbug发现,每次都有数据的,我就跟踪while,一个F6,F6按,

//按着按着就在这里卡死了...不是我机子,我也不懂怎么弄,反正数据就回不来,程序不是错处,

//而且直接就不能调试了,估计是还在等在数据

baos.write(i);

}

Log.i("t460470591", baos.toString());//这里获取接收的值,但是程序阻塞在这里了

return baos.toString();

} catch (Exception e) {

e.printStackTrace();

Log.i("t460470591",e.getMessage()+ "a");

}

return "";

}


套接字我是第一次写,好多都不懂的,而且还是夸平台的,尼玛,求救啊,有列子看看也好

============解决方案1============

Java端两个问题

1. static Socket client; 在实例方法中使用并且没有做同步, 去掉static,否则多线程发送就全乱了

2.服务端因为你已经用了独立线程处理,所以写个读用阻塞执行不会有什么影响,客户端发送时直接在主线程中同步发送再读取就不太可取了,发送到接收,你用的是Thread.sleep(1000); 这个时间你是如何确定的?

C#中通常的做法是异步发送和读取BeginSend(datas, OnReadReplayCallback, stateObj)

void OnReadReplayCallback(IAsyncResult asyncResult)

{

while(读到数据) 写入缓存

if(缓存不为空) 触发接受到数据的事件或委托

}

这样程序就不用阻塞了,并且也会按照顺序正确执行

上面只是供参考的思路
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐