您的位置:首页 > 理论基础 > 计算机网络

编写Android端TCP服务器遇到的问题

2017-01-10 14:59 351 查看
最近写了一个小的apk 将遇到的问题总结下

1、关于在线程中无法更新UI控件的问题

答:在主线程是可以更新UI控件(包括Toast都不行),但子线程便不行 解决的方法是添加runOnUiThread

runOnUiThread(new Runnable() {

public void run() {

showTip(receiveInfoServer);//不可在线程中更新UI,需添加runOnUiThread,

}

});

2、关于线程中嵌套线程

答:在TCP开始监听按钮中 启动监听监听线程,在监听线程中启动接收线程

// 开始监听按钮

listenBtn.setOnClickListener(new OnClickListener() {
@Override

public void onClick(View v) {

*//**

* 启动服务器监听线程

*//*

if (isListened) {

isListened = false;

try {

if (serverSocket != null) {

serverSocket.close();

serverSocket = null;

inputstream.close();

outputStream.close();

inputstream = null;

outputStream = null;
}

} catch (Exception e) {

e.printStackTrace();

}

new ServerSocket_thread().interrupt();// 监听中断
listenBtn.setText("开始监听");

localPortEdt.setEnabled(true);

removeItem();// 移除list表中的内容
} else {

isListened = true;

if (isListened && (serverSocket == null)) {

new ServerSocket_thread().start();

listenBtn.setText("停止监听");

localPortEdt.setEnabled(false);

}

}

}

});

/**

* 服务器监听线程

*/

class ServerSocket_thread extends Thread {

public void run()// 重写Thread的run方法

{

try {

int port = Integer.parseInt(localPortEdt.getText().toString());// 获取监听的端口号

serverSocket = new ServerSocket(port);// 监听port端口,这个程序的通信端口就是port了

receiveInfoServer = "开始监听!" + localIpEdt.getText().toString()

+ ":" + "(本机地址端口)" + localPortEdt.getText().toString()

+ "\n";

runOnUiThread(new Runnable() {

public void run() {

showTip(receiveInfoServer);//不可在线程中更新UI,需添加runOnUiThread

}

});
} catch (IOException e) {

e.printStackTrace();

}

while (isListened) {

try {

// 监听连接 ,如果无连接就会处于阻塞状态,一直在这等着

socket = serverSocket.accept();

String clientIP = socket.getInetAddress().toString();

int clientPort = socket.getPort();

clientIP = clientIP

.substring(clientIP.lastIndexOf("/") + 1);// 去除"/"线

receiveInfoServer = "连接客户端成功!" + "客户端IP地址:" + clientIP

+ "客户端端口" + clientPort + "\n";

runOnUiThread(new Runnable() {

@Override

public void run() {

// TODO 自动生成的方法存根

showTip(receiveInfoServer);

}

});

Log.e("客户端连接", receiveInfoServer);

inputstream = socket.getInputStream();//

// 启动接收线程

Receive_Thread receive_Thread = new Receive_Thread();

receive_Thread.start();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}
/**

*

* 接收线程

*

*/

class Receive_Thread extends Thread// 继承Thread

{

final byte[] buf = new byte[1024];

int len = 0;

Socket clientSocket = socket;
public void run()// 重写run方法

{

while (isListened) {

try {
if ((len = inputstream.read(buf)) > 0)// 接收到客户端的数据,说明还在线

{

runOnUiThread(new Runnable() {

public void run() {
String reciveString = new String(buf, 0, len);

dealMessage(reciveString, clientSocket);

Log.e("@@@@",

"客户端" + clientSocket + "接收数据"

+ reciveString + "长度"

+ reciveString.length());

}

});

} else {

Log.e("@@@@", "客户端掉线了" + clientSocket);

// 删除list列表中断开的客户端

runOnUiThread(new Runnable() {
@Override

public void run() {

deleteSocketList(clientSocket);//客户端掉线后,删除listview中相关的数据
}

});
return;

}
} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

3、关于各种数据的转化

// str 转16进制字符串

public static String str2HexStr(String str) {

char[] chars = "0123456789ABCDEF".toCharArray();

StringBuilder sb = new StringBuilder("");

byte[] bs = str.getBytes();

int bit;

for (int i = 0; i < bs.length; i++) {

bit = (bs[i] & 0x0f0) >> 4;

sb.append(chars[bit]);

bit = bs[i] & 0x0f;

sb.append(chars[bit]);

// sb.append(' ');

}

return sb.toString().trim();

}
// 16进制转十进制字节

public static byte[] hexStringToByte(String hex) {

int len = (hex.length() / 2);

byte[] result = new byte[len];

char[] achar = hex.toCharArray();

for (int i = 0; i < len; i++) {

int pos = i * 2;

result[i] = (byte) (toByte(achar[pos]) << 4 | toByte(achar[pos + 1]));

}

return result;

}
private static byte toByte(char c) {

byte b = (byte) "0123456789ABCDEF".indexOf(c);

return b;

}

//string转ASCII码

private String stringToAscii(String value) { StringBuffer sbu = new

StringBuffer(); char[] chars = value.toCharArray(); for (int i = 0; i <

chars.length; i++) { if(i != chars.length - 1) {

sbu.append((int)chars[i]).append(","); } else {

sbu.append((int)chars[i]); } } return sbu.toString(); }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android
相关文章推荐