我的第一个安卓通讯

学校的有个一周半的安卓开发实践课程,讲了一些UI的开发。

加上自己也想试试,就试了一下很简单的界面。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.clienttest.MainActivity" >
    <FrameLayout
        android:id="@+id/FrameLayout1"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_gravity="center"
        android:layout_weight="0.15" >
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="TextView" />
    </FrameLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.7" >
        <ListView
            android:id="@+id/chat_list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1" >
        </ListView>
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.15"
        android:orientation="horizontal" >


        <EditText
            android:id="@+id/inputText"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_weight="0.75"
            android:ems="10" >
            <requestFocus />
        </EditText>
        <Button
            android:id="@+id/but_send"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_weight="0.25"
            android:text="Send" />
    </LinearLayout>
</LinearLayout>

以上是主布局,然后是对话的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:orientation="vertical" >
    <LinearLayout
        android:id="@+id/chat_items_left"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >
        <TextView
            android:id="@+id/text_recive"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_weight="0.8"
            android:gravity="left|center"
            android:text="TextView"
            android:textSize="20sp" />


        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.2" />
    </LinearLayout>
    <LinearLayout
        android:id="@+id/chat_items_right"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >
         <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.2" />
         
        <TextView
            android:id="@+id/text_send"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_weight="0.8"
            android:gravity="right|center"
            android:text="TextView"
            android:textSize="20sp" />
    </LinearLayout>
</LinearLayout>

以及适配器

public class Msg {
public static final int TYPE_RECEIVED=0;
public static final int TYPE_SENT=1;
private String content;
private int type;
public Msg(String content,int type){
this.content=content;
this.type=type;
}
public String getContent(){
return this.content;
}
public int getType(){
return this.type;
}
}


import java.util.List;
import com.example.clienttest.R;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;
public class MsgAdapter extends ArrayAdapter<Msg>{
    private int resourceId;
public MsgAdapter(Context context, int resource, List<Msg> objects) {
super(context, resource, objects);
// TODO Auto-generated constructor stub
resourceId=resource;
}
public View getView(int position, View convertView, ViewGroup parent){
Msg msg=getItem(position);
View view;
ViewHolder viewholder;
if(convertView==null){
view=LayoutInflater.from(getContext()).inflate(resourceId,null);
viewholder=new ViewHolder();
viewholder.leftLayout = (LinearLayout) view.findViewById(R.id.chat_items_left);
            viewholder.rightLayout= (LinearLayout) view.findViewById(R.id.chat_items_right);
            viewholder.leftMsg = (TextView) view.findViewById(R.id.text_recive);
            viewholder.rightMsg = (TextView) view.findViewById(R.id.text_send);
            view.setTag(viewholder);
}
else{
view=convertView;
viewholder=(ViewHolder)view.getTag();
}
if(msg.getType() == Msg.TYPE_RECEIVED){
            viewholder.rightLayout.setVisibility(View.VISIBLE);
            viewholder.leftLayout.setVisibility(View.GONE);
            viewholder.rightMsg.setText(msg.getContent());      
        }else if(msg.getType()==Msg.TYPE_SENT){
            viewholder.leftLayout.setVisibility(View.VISIBLE);
            viewholder.rightLayout.setVisibility(View.GONE);
            viewholder.leftMsg.setText(msg.getContent());
        }
        return view;
}
class ViewHolder{
LinearLayout leftLayout;
LinearLayout rightLayout;
        TextView leftMsg;
        TextView rightMsg;
}
}

干干净净没有一点注解,hhh

以及我唯一的一个actuivity

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import com.example.chatTools.Msg;
import com.example.chatTools.MsgAdapter;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends ActionBarActivity {


private List<Msg>msgList = new ArrayList<Msg>();
final String A="REQUIRE_CONNECT"; //这两个final是很简单的用来识别服务器里是否有未收到的信息
final String B="NO_REPLY";
private TextView text;
private Button send;
private ListView chatlist;
private EditText input;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
send=(Button)findViewById(R.id.but_send);
chatlist=(ListView)findViewById(R.id.chat_list);
input=(EditText)findViewById(R.id.inputText);
text=(TextView)findViewById(R.id.textView1);
send.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
String words_send=input.getText().toString();
if(words_send.equals("")){
Toast.makeText(MainActivity.this, "null input", Toast.LENGTH_SHORT).show();
}
else{
Msg msg=new Msg(words_send,Msg.TYPE_SENT);
AdapterListAdd(msg);
MsgAdapter adapter = new MsgAdapter(MainActivity.this,R.layout.chat_items,msgList);
chatlist.setAdapter(adapter);
MMM m=new MMM(words_send);
m.start();
input.setText(null);
}
}
});
}

//同步锁控制消息表单
public synchronized void AdapterListAdd(Msg msg){
msgList.add(msg);
}
//这个线程是想要它定时跟服务器互动的,然而我没有使用

class Commuicating extends Thread{
public void run(){
while(true){
String require=Commuic(A);
if(!(require.equals("")||require.equals(B)))
{
Msg msg=new Msg(require,Msg.TYPE_RECEIVED);
AdapterListAdd(msg);
MsgAdapter adapter = new MsgAdapter(MainActivity.this,R.layout.chat_items,msgList);
chatlist.setAdapter(adapter);
}
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

//这个线程就是发消息的时候跟服务器互动的
class MMM extends Thread{
String words;
MMM(String w){
this.words=w;
}
public void run(){
String require=Commuic(words);
if(!(require.equals("")||require.equals(B)))
{
Msg msg=new Msg(require,Msg.TYPE_RECEIVED);
AdapterListAdd(msg);
MsgAdapter adapter = new MsgAdapter(MainActivity.this,R.layout.chat_items,msgList);
chatlist.setAdapter(adapter);
}
}
}

String Commuic(String message){
String meg="";
try{
Socket socket=new Socket("192.168.56.1",10008);//服务器所在的ip加服务器设置的端口号
OutputStream oStream=socket.getOutputStream();
PrintWriter pWriter=new PrintWriter(oStream);
pWriter.print(message);
pWriter.flush();
socket.shutdownOutput();//如果在这里使用close()方法好像会关掉socket
InputStream iStream=socket.getInputStream();
InputStreamReader iReader=new InputStreamReader(iStream);
BufferedReader bReader=new BufferedReader(iReader);
String temp=null;
while((temp=bReader.readLine())!=null){
meg+=temp;
}
pWriter.close();
oStream.close();
bReader.close();
iReader.close();
iStream.close();
socket.close();
}catch(Exception e){e.printStackTrace();}
return meg;
}
}

然后是简单的服务器

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class TextServer{  
public static void main(String[] args) throws Exception{  
System.out.println("Server start...");  
        ServerSocket ss = new ServerSocket(10008);  
        int sum=0;
       while(sum<5){   //这个5是互动5次后就释放服务器资源,毕竟重启麻烦
    Socket s = ss.accept(); 
       sum++;
        InputStream inputStream=s.getInputStream();
        InputStreamReader inputStreamReader=new InputStreamReader(inputStream);
        BufferedReader br=new BufferedReader(inputStreamReader);//加入缓冲区
        String line="";  
        String temp=null;
        while((temp=br.readLine())!=null){  
        line+=temp;  
        System.out.println(temp);
        }  
        s.shutdownInput();
        PrintWriter pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
        if(line.equals("REQUIRE_CONNECT")){
        pw.print("NO_REPLY");
        }
        else{
        pw.print("upload successful");
        }
        pw.flush();
        s.shutdownOutput();
        s.close();
        }
       ss.close();
    }  
}  

在服务器设置多线程基本上就可以实现消息的互动

特别坑的一点是,要记得打开网络权限,在AndroidManifest.xml里面,

然后如果用虚拟机调试虚拟机也要记得设置端口号

主活动里直接使用socket会有问题,不过我确实不太会线程

很简易的就这样

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值