一、项目配置:
需要在AndroidManifest.xml中声明权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
//将SocketServerService服务声明为远程服务端
<service
android:name=".service.SocketServerService"
android:process=":remote" />
二、Socket服务端
1、在SocketServerService启动时创建线程,用来监听端口
//在Service启动时创建线程,在线程中建立服务,监听端口,等待客户端连接
public class SocketServerService extends Service {
private boolean isServiceDestroyed = false;
@Override
public void onCreate() {
new Thread(new TcpServer()).start();
super.onCreate();
}
@Override
public IBinder onBind(Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}
private class TcpServer implements Runnable {
@Override
public void run() {
ServerSocket serverSocket;
try {
//监听8688端口
serverSocket = new ServerSocket(8688);
} catch (IOException e) {
return;
}
while (!isServiceDestroyed) {
try {
//接受客户端请求,并且阻塞直到接收到消息
final Socket client = serverSocket.accept();
new Thread() {
@Override
public void run() {
try {
responseClient(client);
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private void responseClient(Socket client) throws IOException {
//用于接收客户端消息
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
//用于向客户端发送消息
PrintWriter out = new PrintWriter(new BufferedWriter(new
OutputStreamWriter(client.getOutputStream())), true);
out.println("你好,我是服务端");
while (!isServiceDestroyed) {
String str = in.readLine();
if (TextUtils.isEmpty(str)) {
//客户端断开了连接
break;
}
String message = "收到了客户端的信息为:" + str;
//从客户端收到的消息加工再发送给客户端
out.println(message);
}
out.close();
in.close();
client.close();
}
@Override
public void onDestroy() {
isServiceDestroyed = true;
super.onDestroy();
}
}
三、客户端
public class SocketServerActivity extends AppCompatActivity {
private TextView tvMessage;
private EditText etReceive;
private Button btSend;
private PrintWriter mPrintWriter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.socket_layout);
initView();
initAction();
//启动服务端
Intent intent = new Intent(this, SocketServerService.class);
startService(intent);
//开启线程连接服务端
new Thread() {
@Override
public void run() {
super.run();
connectSocketServer();
}
}.start();
}
private void initView() {
tvMessage = findViewById(R.id.tv_message);
etReceive = findViewById(R.id.et_receive);
btSend = findViewById(R.id.bt_send);
}
private void initAction() {
btSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String msg = etReceive.getText().toString();
//向服务器发送消息
if (!TextUtils.isEmpty(msg) && null != mPrintWriter) {
new Thread(new Runnable() {
@Override
public void run() {
mPrintWriter.println(msg);
}
}).start();
tvMessage.setText(tvMessage.getText() + "\n" + "客户端:" + msg);
etReceive.setText("");
}
}
});
}
private void connectSocketServer() {
Socket socket = null;
while (null == socket) {
try {
//选择和服务器相同的端口8688
socket = new Socket("localhost", 8688);
mPrintWriter = new PrintWriter(new BufferedWriter(new
OutputStreamWriter(socket.getOutputStream())),true);
} catch (IOException e) {
SystemClock.sleep(1000);
}
}
try {
//接收服务端的消息
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (!isFinishing()){
final String msg =br.readLine();
if (null!=msg){
runOnUiThread(new Runnable() {
@Override
public void run() {
tvMessage.setText(tvMessage.getText()+"\n"+"服务端:"+msg);
}
});
}
}
mPrintWriter.close();
br.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
本文代码是参考刘望舒的《android 进阶指北》,如有侵权,可立即删除