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("");
}
});
}
}