无网不进  
软硬件开发

C#做服务器,Android做客户端,完成Socket通信

http://blog.csdn.net/yuyu414/article/details/18995727

先说几句废话,我没学过java语法,所以写起来很痛啊,只能多百度,多看别人的代码~

1.按照惯例,先写一下遇到的问题:

1.java.net.SocketException: socket failed EACCES (Permission denied)

初始化Socket遇到这个异常,是因为没有给网络权限,在AndroidManifest.xml中添加一句:
<uses-permission android:name="android.permission.INTERNET" />
注意添加的位置,要写在<application之前

2.Unhandled exception type IOException

经常会出现这个错误,是因为你没有处理这个操作可能产生的异常,在C#中这个并不会编译不过去,但是这里还是老老实实加上try catch吧,只要鼠标点一下下面的Surround with try/catch就会自动给你添加,很方便。

3.android.os.NetworkOnMainThreadException

android4.0不允许把网络操作这种耗时的东东写在主线程里面,运行的时候程序会直接停止运行,不过本来这些耗时的操作就应该在后台线程操作,所以为了解决这个问题要先简单学一点关于多线程的。等下会说~

2.Android多线程操作

1.Socket的初始化,即连接到服务器,要在非主线程中写,那就先实现这个吧:

先声明这个线程:

 

[java] view plain copy
 
  1. private Thread connectThread = null;  


然后实现:

 

[java] view plain copy
 
  1. connectThread = new Thread(new Runnable() {  
  2.       
  3.     @Override  
  4.     public void run() {  
  5.         // TODO Auto-generated method stub  
  6.         try {  
  7.             //初始化Scoket,连接到服务器  
  8.             socket = new Socket(ServerIP, ServerPort);  
  9.             isConnect = true;  
  10.             //启动接收线程  
  11.             isReceive = true;  
  12.             receiveThread = new ReceiveThread(socket);  
  13.             receiveThread.start();  
  14.             System.out.println("----connected success----");  
  15.         } catch (UnknownHostException e) {  
  16.             // TODO Auto-generated catch block  
  17.             e.printStackTrace();  
  18.             System.out.println("UnknownHostException-->" + e.toString());  
  19.         } catch (IOException e) {  
  20.             // TODO Auto-generated catch block  
  21.             e.printStackTrace();  
  22.             System.out.println("IOException" + e.toString());  
  23.         }  
  24.     }  
  25. });  

然后在连接Button的监听器中启动线程:

 

[java] view plain copy
 
  1. //连接按钮的监听器  
  2. btnConnect.setOnClickListener(new View.OnClickListener() {  
  3.       
  4.     @Override  
  5.     public void onClick(View v) {  
  6.         // TODO Auto-generated method stub  
  7.         if (!isConnect){  
  8.             connectThread.start();  
  9.         }  
  10.     }  
  11. });  

这样就可以了,连接到服务器了

2.向服务器发送消息

按照上面连接的方法去实现发送消息,第一次发 消息,没问题,成功接收了,第二次,出现问题了,说是发送消息的线程已经启动了。这边我不理解,线程不是运行一次就会自动销毁么。不懂为什么,所以发送这边用了Runnable接口,然后new Thread(runnable).start()

 

[java] view plain copy
 
  1. //发送消息的接口  
  2. Runnable sendThread = new Runnable() {  
  3.       
  4.     @Override  
  5.     public void run() {  
  6.         // TODO Auto-generated method stub  
  7.         byte[] sendBuffer = null;  
  8.         try {  
  9.             sendBuffer = strMessage.getBytes("UTF-8");  
  10.         } catch (UnsupportedEncodingException e1) {  
  11.             // TODO Auto-generated catch block  
  12.             e1.printStackTrace();  
  13.         }  
  14.         try {  
  15.             outStream = socket.getOutputStream();  
  16.         } catch (IOException e) {  
  17.             // TODO Auto-generated catch block  
  18.             e.printStackTrace();  
  19.         }  
  20.         try {  
  21.             outStream.write(sendBuffer);  
  22.         } catch (IOException e) {  
  23.             // TODO Auto-generated catch block  
  24.             e.printStackTrace();  
  25.         }  
  26.     }  
  27. };  

 

[java] view plain copy
 
  1. //发送按钮的监听器  
  2. btnSend.setOnClickListener(new View.OnClickListener() {  
  3.       
  4.     @Override  
  5.     public void onClick(View v) {  
  6.         // TODO Auto-generated method stub  
  7.         strMessage = textSend.getText().toString();  
  8.         new Thread(sendThread).start();  
  9.     }  
  10. });  

 

3.C#做的服务器

 

直接给源码了,改天再写一篇关于C#的Socket通信

4.源码下载(包括编译好的exe与apk)

1.百度网盘:http://pan.baidu.com/s/1GNvXk

2.CSDN:http://download.csdn.net/detail/yuyu414/6906805

posted on 2018-01-10 21:37  无网不进  阅读(866)  评论(0编辑  收藏  举报