android实现socket端口通信demo

来源:互联网 发布:烟台大学官网网络教学 编辑:程序博客网 时间:2024/06/05 14:08

android实现socket端口通信demo

(1)socket通信描述

Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信。两者的最大差异在于,http连接使
用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端
返回数据。而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送
,而不需要每次由客户端想服务器发送请求。 那么,什么是socket?Socket又称套接字,在程序内部提供了与
外界通信的端口,即端口通信。通过建立socket连接,可为通信双方的数据传输传提供通道。socket的主要特点
有数据丢失率低,使用简单且易于移植。
TCP使用的是流的方式发送,UDP是以包的形式发送。

(2)android端

public class MainActivity extends ActionBarActivity implements View.OnClickListener {    private EditText editText;    private TextView textView;    private Socket socket;    private String buffer = "";    public Handler mHandler = new Handler(){        @Override        public void handleMessage(Message msg) {            if (msg.what == 1314){                Bundle bundle = msg.getData();                textView.append("server:" + bundle.getString("msg") + "\n");            }        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        editText = (EditText) findViewById(R.id.editText);        textView = (TextView) findViewById(R.id.textView);        findViewById(R.id.button).setOnClickListener(this);    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.button:                String edtext = editText.getText().toString().trim();                if (TextUtils.isEmpty(edtext)){                    Toast.makeText(this,"内容不能为空",Toast.LENGTH_SHORT).show();                    return;                }                textView.append("client:" + edtext + "\n");                editText.setText("");                new SocketThread(edtext).start();                break;        }    }    class SocketThread extends Thread {        public String sendtext;        public SocketThread(String txt) {            this.sendtext = txt;        }        @Override        public void run() {            //定义消息            Message msg = new Message();            msg.what = 1314;            Bundle bundle = new Bundle();            bundle.clear();            try {                Log.e("chenzhongzhi","--1--");                //连接服务器,设置连接超时为5秒                socket = new Socket();                socket.connect(new InetSocketAddress("192.168.1.42", 29999), 5000);                Log.e("chenzhongzhi","--2--");                //获取流                OutputStream os = socket.getOutputStream();                BufferedReader bff = new BufferedReader(new InputStreamReader(socket.getInputStream()));                Log.e("chenzhongzhi","--3--");                //读取服务器发来消息                String line = null;                buffer = "";                Log.e("chenzhongzhi","--4--");                while ((line = bff.readLine()) != null){                    buffer = line + buffer;                }                Log.e("chenzhongzhi","--5--");                //向服务器发送消息                os.write(sendtext.getBytes("gbk"));                os.flush();                Log.e("chenzhongzhi","--6--");                bundle.putString("msg",buffer.toString());                msg.setData(bundle);                //发送消息修改textview                mHandler.sendMessage(msg);                Log.e("chenzhongzhi","--7--");                //关闭流                try {                    bff.close();                }catch (Exception e){                    e.printStackTrace();                }                try {                    os.close();                }catch (Exception e){                    e.printStackTrace();                }                try {                    socket.close();                }catch (Exception e){                    e.printStackTrace();                }            } catch (IOException e) {                //连接超时                bundle.putString("msg","服务器连接失败");                msg.setData(bundle);                mHandler.sendMessage(msg);                e.printStackTrace();            }        }    }}

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    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=".MainActivity">    <EditText        android:id="@+id/editText"        android:layout_width="match_parent"        android:layout_height="wrap_content" />    <Button        android:id="@+id/button"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="发送" />    <TextView        android:id="@+id/textView"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginTop="10dp"        android:text=".................." /></LinearLayout>

(4)服务端

public class AndroidRunable implements Runnable{Socket socket = null;public AndroidRunable(Socket socket) {super();this.socket = socket;}@Overridepublic void run() {String line = null;InputStream in = null;OutputStream out = null;String str = "czz fydsw 1314";try {out = socket.getOutputStream();in = socket.getInputStream();BufferedReader bff = new BufferedReader(new InputStreamReader(in));out.write(str.getBytes("gbk"));out.flush();socket.shutdownOutput();while((line = bff.readLine()) != null){System.out.println(line);}//关闭流            try {                out.close();            }catch (Exception e){                e.printStackTrace();            }            try {                bff.close();            }catch (Exception e){                e.printStackTrace();            }            try {                in.close();            }catch (Exception e){                e.printStackTrace();            }            try {                socket.close();            }catch (Exception e){                e.printStackTrace();            }} catch (IOException e) {e.printStackTrace();}}}

public class AndroidService {public static void main(String[] args) throws IOException {ServerSocket server = new ServerSocket(29999); while(true){Socket socket = server.accept();new Thread(new AndroidRunable(socket)).start();}}}

(5)注意点

1.androidManifest添加网络权限

<uses-permission android:name="android.permission.INTERNET"/>

2.android端与服务器端的socket端口一致






0 0