TCP链接从服务器到客户端DEMO

来源:互联网 发布:织梦cms标签调用 编辑:程序博客网 时间:2024/06/07 02:32

我们先启一个服务,用来做服务器端。所以现在主线程中起一个服务。

package com.android.tcpservice;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import com.android.tcpservice.service.TCPService;public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        init();    }    private void  init(){        Intent intent = new Intent(this, TCPService.class);        //        this.startService(intent);    }}
由于网络连接不允许放在主线程中操作,所以我们得新启一个线程。在新启的线程中操作:

package com.android.tcpservice.service;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.support.annotation.Nullable;import android.util.Log;import com.android.tcpservice.TCPLogic;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.ServerSocket;import java.net.Socket;/** * Created by xalo on 16/8/24. * 服务器 */public class TCPService extends Service {    @Nullable    @Override    public IBinder onBind(Intent intent) {        return null;    }    @Override    public void onCreate() {        super.onCreate();        //写一个匿名类,新起一个线程        new Thread(new Runnable() {            @Override            public void run() {                Log.d("TCP", "TCP Thread is running 启动了");                try {                    //接口服务(监听接口)                    ServerSocket ss = new ServerSocket(50000);                    //获得链接(阻断式)这条数据是阻塞式的                    Socket socket;                    //接受消息                    while ((socket = ss.accept()) != null) {                        new Thread(new TCPLogic(socket)).start();                    }                    Log.d("XML", socket.getInetAddress().toString());                } catch (IOException e) {                    e.printStackTrace();                }                Log.d("TCP", "TCP Thread is end 结束了");            }        }).start();    }}
新建一个类实现Running。

package com.android.tcpservice;import android.util.Log;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.Socket;/** * Created by xalo on 16/8/24. */public class TCPLogic implements Runnable {    Socket socket;    public TCPLogic(Socket socket) {        this.socket = socket;    }    @Override    public void run() {        try {            InputStream in = socket.getInputStream();            BufferedReader br = new BufferedReader(new InputStreamReader(in));            String str;            while ((str = br.readLine()) != null) {                Log.d("RECIVER", str);            }        } catch (IOException e) {            e.printStackTrace();        }    }}
最后不要忘了加网络权限:

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

这样我们的服务器端就搭建好了

下面来看看客户端是怎么搭建起来的:

package com.android.tcpclient;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import java.io.BufferedWriter;import java.io.IOException;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.InetAddress;import java.net.Socket;import java.net.UnknownHostException;/** * 客户端 */public class MainActivity extends AppCompatActivity {    Socket socket;    //    BufferedWriter bw;    PrintWriter pw;    Button btn;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        init();        new Thread(new Runnable() {            @Override            public void run() {                try {                    connect();                } catch (IOException e) {                    e.printStackTrace();                }            }        }).start();    }    private void init() {        btn = (Button) findViewById(R.id.btn_send);        btn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                sendMsg("hello");            }        });    }    //网络连接不允许在主线程执行    private void connect() throws IOException {        InetAddress address = InetAddress.getByName("localhost");        socket = new Socket(address, 50000);        //发送消息        //以我为参考系向外发流        OutputStream out = socket.getOutputStream();        //缓存区满了一次性发出去//        bw = new BufferedWriter(new OutputStreamWriter(out));        pw = new PrintWriter(out);//        bw.write("hello");//        //疏通//        bw.flush();//        //关闭//        socket.close();    }    private void sendMsg(String msg) {//        try {//            pw.write(msg);        //换行,接受的时候是按行读,不换行接受服务器认为这行没完。        pw.println(msg);        pw.flush();//        } catch (IOException e) {//            e.printStackTrace();//        }    }    private void closeSocket() {        try {//            pw.flush();            socket.close();        } catch (IOException e) {            e.printStackTrace();        }    }    @Override    protected void onDestroy() {        super.onDestroy();        closeSocket();    }}

1 0
原创粉丝点击