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

一个简单的TCP服务器

2016-11-24 10:28 323 查看
package com.haitaichina.tcpdemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;

/**
* 一个简单的TCP连接
* 由于控件只有简单的一个Button和TextView
* 代码就不进行粘贴了
*/
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private Button bt_start;
private TextView tv_show;
private Button bt_send;
private ServerSocket serverSocket;
private Socket clicksSocket;
private InputStream inputStream;
private OutputStream outputStream;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initWidget();
}

private void initWidget() {
bt_start = (Button) findViewById(R.id.bt_start);
tv_show = (TextView) findViewById(R.id.tv_show);
bt_start.setOnClickListener(this);
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_start:
//启动服务器的监听线程
ServerSocket_thread serverSocket_thread = new ServerSocket_thread();
serverSocket_thread.start();
break;
}
}

/**
* 服务器监听线程
*/
class ServerSocket_thread extends Thread {

@Override
public void run() {
//while无限循环监听客户端发送的消息
while (true) {
try {
//监听port全部端口
serverSocket = new ServerSocket();
serverSocket.setReuseAddress(true);
//绑定本机端口号
serverSocket.bind(new InetSocketAddress(8888));
//监听连接,如果无连接就会处于阻塞状态,一直等待
clicksSocket = serverSocket.accept();
inputStream = clicksSocket.getInputStream();
//启动接收消息线程
Receive_Thread receive_thread = new Receive_Thread();
receive_thread.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

/**
* 接收/发送
* 消息线程
*/
class Receive_Thread extends Thread {
@Override
public void run() {
while (true) {
try {
final byte[] buf = new byte[1024];
final int len = inputStream.read(buf);
//获得客户端发来的消息

if(len!=-1){
String strData = new String(buf, 0, len);
tv_show.setText("接收客户端发送的数据:" + strData);
try {
//获取输出流
outputStream = clicksSocket.getOutputStream();
outputStream.write("发给客户端的消息".getBytes());
} catch (IOException e) {
e.printStackTrace();
}

}else{

				tv_show.setText("设备主动断开");

}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

/**
* 当按下返回键时关闭输入输出流以及socket
* 断开TCP连接
*
* @param keyCode
* @param event
* @return
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
//如果socket不为空
if (clicksSocket != null) {
try {
outputStream.close();
inputStream.close();
clicksSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return super.onKeyDown(keyCode, event);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: