您的位置:首页 > 理论基础 > 计算机网络

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

2016-08-24 17:50 274 查看
我们先启一个服务,用来做服务器端。所以现在主线程中起一个服务。

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.
4000
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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tcp 服务器 网络