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

============问题描述============


c#服务端:

 //创建监听端口.....

 private void StartListening()

        {

              //创建IPEndPoint

            IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("192.16.41.120"), 8897);

              //创建Socket实例

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

            //绑定Socket与IPEndPoint

           server_Socket.Bind(ipep);

             //设置Socket收听模式

           server_Socket.Listen(10);

            while (true)

            {

                try

                {

                    System.Net.Sockets.Socket s = server_Socket.Accept();

                    Thread newsocekt= new Thread(new ParameterizedThreadStart(ServiceClient));

                    newsocekt.Start(s);

               }

                catch (Exception e)

                {

                    Console.WriteLine(e.ToString());

                }

            }

        }



        //为每一个连接到服务器的套接字开辟一个新的线程

        private void ServiceClient(object soc)

        {

            System.Net.Sockets.Socket clientS = soc as Socket;

            byte[] bytearry = new byte[1024];

            int buffer_lenght = clientS.Available;

            clientS.Receive(bytearry, 0, buffer_lenght, SocketFlags.None);//获取安卓发来的消息,这里可以收到信息

            string res = Encoding.GetEncoding("utf-8").GetString(bytearry);

            //******

            *****/

            // res 是安卓发来的消息,通过info判断做什么事情,这里省略了

           byte[] arry = Encoding.GetEncoding("utf-8").GetBytes("我操你大爷,给不给我发信息回去/0");

           clientS.Send(arry, arry.Length, SocketFlags.None);//往安卓回发消息

           //我感觉这样写不太对,这样发到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(缓存不为空) 触发接受到数据的事件或委托 
}
这样程序就不用阻塞了,并且也会按照顺序正确执行
上面只是供参考的思路 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。