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