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

先说几句废话,我没学过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通信


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

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

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

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值