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的初始化,即连接到服务器,要在非主线程中写,那就先实现这个吧:
先声明这个线程:
- private Thread connectThread = null;
然后实现:
- connectThread = new Thread(new Runnable() {
- @Override
- public void run() {
- // TODO Auto-generated method stub
- try {
- //初始化Scoket,连接到服务器
- socket = new Socket(ServerIP, ServerPort);
- isConnect = true;
- //启动接收线程
- isReceive = true;
- receiveThread = new ReceiveThread(socket);
- receiveThread.start();
- System.out.println("----connected success----");
- } catch (UnknownHostException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- System.out.println("UnknownHostException-->" + e.toString());
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- System.out.println("IOException" + e.toString());
- }
- }
- });
然后在连接Button的监听器中启动线程:
- //连接按钮的监听器
- btnConnect.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- if (!isConnect){
- connectThread.start();
- }
- }
- });
这样就可以了,连接到服务器了
2.向服务器发送消息
按照上面连接的方法去实现发送消息,第一次发 消息,没问题,成功接收了,第二次,出现问题了,说是发送消息的线程已经启动了。这边我不理解,线程不是运行一次就会自动销毁么。不懂为什么,所以发送这边用了Runnable接口,然后new Thread(runnable).start()
- //发送消息的接口
- Runnable sendThread = new Runnable() {
- @Override
- public void run() {
- // TODO Auto-generated method stub
- byte[] sendBuffer = null;
- try {
- sendBuffer = strMessage.getBytes("UTF-8");
- } catch (UnsupportedEncodingException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }
- try {
- outStream = socket.getOutputStream();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- try {
- outStream.write(sendBuffer);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- };
- //发送按钮的监听器
- btnSend.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- strMessage = textSend.getText().toString();
- new Thread(sendThread).start();
- }
- });
3.C#做的服务器
直接给源码了,改天再写一篇关于C#的Socket通信