用java开发Android的socket的一些异常处理

1.android下通常用的是的是tuf-8编码,所以android设备和pc通讯的时侯要注意做转换

转换的方法很多一种是在String构造函数里做转换比如:new String(str.getBytes("GBK"), "UTF-8"));

还有一种是在输入输出流里直接声明一下,如new OutputStreamWriter(socket.getOutputStream(),"GBK");

new InputStreamReader(socket.getInputStream(),"GBK")

2.由于android系统对多线程处理和pc有很大区别,因此在Android主线程里不允许对网络进行操作。所以我们对

socket操作必须开独立线程,否则程序会抛出异常

new Thread(new Runnable(){
@Override
public void run() {
try {
socket = new Socket(ip,port);
...................................................
} catch (IOException e) {
e.printStackTrace();
}
}

3.android的多线程和UI操作是冲突的,在多线程里对UI操作也会抛出异常,使程序崩溃。解决办法是new一个Handle

来发送消息如:

handle = new Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.what==MainActivity.UPDATE_TEXT)
{
showinfo(strrec);
}
// super.handleMessage(msg);
}


protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.Init();
showinfo("初始化完毕");
showinfo("准备建立连接...............");
}
private void showinfo(String str)
{
//System.out.println(str);
Log.i("信息显示", str);
txrc.append(str+'\n');

}
private void Init()
{
strrec = new String();
txrc = (TextView)findViewById(R.id.textrecv);
txrc.setMovementMethod(ScrollingMovementMethod.getInstance());
txrc.setScrollbarFadingEnabled(false);
txfs = (EditText)findViewById(R.id.editinput);
this.btnconnect();
this.btnsend();
this.btnclear();
UpdateUi();


}
public void UpdateUi()
{
gmsg = new Message();
showinfo("更新消息hadle");
handle = new Handler(){


@Override
public void handleMessage(Message msg) {
if(msg.what==MainActivity.UPDATE_TEXT)
{
showinfo(strrec);
}
// super.handleMessage(msg);
}

};
}
public void CreateSocket()
{
EditText ip = (EditText)findViewById(R.id.editip);
EditText port= (EditText)findViewById(R.id.editport);
final int iport = Integer.parseInt(port.getText().toString());
final String strip = ip.getText().toString();
SendMsg("S-->准备建立连接...............");
SendMsg("S-->ip:"+strip+"port:"+iport);
new Thread(new Runnable(){
@Override
public void run() {
try {
socket = new Socket(strip,iport);
if(socket !=null)
{
//showinfo("与服务器成功建立连接");
writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(),"GBK"),true);
reader = new BufferedReader(new InputStreamReader(socket.getInputStream(),"GBK"));//utf转gbk
MainActivity.this.GetClientMsg();
}

} catch (IOException e) {
e.printStackTrace();
}
}

}).start();

}
private void SendMsg(String str)
{
this.strrec = str;
Message msg =new Message();
msg.what=UPDATE_TEXT;
handle.sendMessage(msg);
}
public void GetClientMsg()
{


new Thread(new Runnable()
{
@Override
public void run()
{

try {
while(true)
{
String str = new String();
str = reader.readLine();
if(str.length()>0)
{
//SendMsg(new String(str.getBytes("ISO8859-1"), "UTF-8"));
SendMsg("R<---"+str);
//Log.i(, strrec);
}
Thread.sleep(500);
}
} catch (IOException | InterruptedException e) {
e.printStackTrace();}

try {
if(reader !=null)
{
reader.close();
SendMsg("客户断开链接--reader.close()");
}
if(socket !=null)
{
socket.close();
SendMsg("客户断开链接--socket.close()");
}
   }
catch (IOException e) {
e.printStackTrace();
}

SendMsg("客户端接收线程退出!~!!!!");
}

}).start();
}
private void btnconnect()
{
if(btnconnect==null)
{
btnconnect = (Button)findViewById(R.id.btnconnect);
btnconnect.setOnClickListener(new OnClickListener(){


@Override
public void onClick(View v) {
CreateSocket();

}

});
}
}
private void btnsend()
{
if(btnsend==null)
{
btnsend = (Button)findViewById(R.id.btnsend);
btnsend.setOnClickListener(new OnClickListener(){


@Override
public void onClick(View v) {
String str = new String();
str = MainActivity.this.txfs.getText().toString();
if(socket.isConnected())
{
writer.println(str);
}
MainActivity.this.SendMsg("S-->"+str);

}

});
}
}
private void btnclear()
{

findViewById(R.id.btnclear).setOnClickListener(new OnClickListener(){


@Override
public void onClick(View v) {
txrc.setText("");
}

});
}




}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值