1.服务端:SocketServiceApplication学号
manifests中AndroidManifest.xml
java中MainActivity.java
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity{
private EditText et_content, et_name;
private TextView tv_se;
private MyAPP myAPP;
@Override
protected void onCreate(Bundle saveInstanceState){
super.onCreate(saveInstanceState);
setContentView(R.layout.activity_main);
et_content = (EditText) findViewById(R.id.et_content);
tv_se = (TextView) findViewById(R.id.tv_se);
et_name = (EditText) findViewById(R.id.et_name);
myAPP = (MyAPP)getApplication();
}
public void click1(View view){
myAPP.setOnConnectListener(new MyAPP.ConnectListener() {
@Override
public void onReceiveDate(String data) {
tv_se.append(data + "n");
}
});
}
public void click2(View view){
String name = et_name.getText().toString();
String a = name + ":" + et_content.getText().toString();
tv_se.append(a + "n");
myAPP.send(a);
}
}
java中MyAPP.java
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.LinkedList;
public class MyAPP extends android.app.Application {
//socket通信
private Socket socket = null;
private ServerSocket serverSocket = null;
public static OutputStream outputStream;
private static ConnectListener mListener;
final LinkedList list = new LinkedList();
private HandlerThread mHandlerThread;
//子线程中的Handle实例
private Handler mSubThreadHandler;
@Override
public void onCreate() {
super.onCreate();
//启动服务器
ServerListeners listeners = new ServerListeners();
listeners.start();
initHandlerThread();
}
public class ServerListeners extends Thread {
@Override
public void run() {
try {
serverSocket = new ServerSocket(7777);
while (true) {
System.out.println("等待客户端请求...");
socket = serverSocket.accept();
System.out.println("收到请求。服务器建立连接...");
System.out.println("客户端" + socket.getInetAddress().getHostAddress() + "连接成功");
System.out.println("客户端" + socket.getRemoteSocketAddress() + "连接成功");
list.add(socket);
//每次都启动一个新的线程
new Thread(new Task(socket)).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void initHandlerThread() {
//创建HandlerThread实例
mHandlerThread = new HandlerThread("handler_thread");
//开始运行线程
mHandlerThread.start();
//获取HandlerThread线程中的Iooper实例
Looper loop = mHandlerThread.getLooper();
//创建Handler与该线程绑定。
mSubThreadHandler = new Handler(loop) {
public void handleMessage(Message msg) {
writeMsg(msg.getData().getString("datal"));
}
};
}
class Task implements Runnable {
private Socket socket;
public Task(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
while (true) {
int size;
try {
InputStream inputStream = null;//输入流
inputStream = socket.getInputStream();
byte[] buffer = new byte[1024];
size = inputStream.read(buffer);
if (size > 0) {
if (buffer[0] != (byte) 0xEE) {
//将读取的1024个字节构造成一个String类型的变量
String date = new String(buffer, 0, size, "gbk");
Message message = new Message();
message.what = 100;
Bundle bundle = new Bundle();
bundle.putString("date", date);
message.setData(bundle);
mHandler.sendMessage(message);
}
}
} catch (Exception e) {
e.printStackTrace();
return;
}
}
}
}
//接口回调
public interface ConnectListener {
void onReceiveDate(String data);
}
public void setOnConnectListener(ConnectListener listener) {
this.mListener = listener;
}
Handler mHandler = new Handler(){
public void handleMessage(Message msg){
switch(msg.what){
case 100:
if(mListener!=null){
mListener.onReceiveDate(msg.getData().getString("data"));
}
break;
}
}
};
public void send(String bytes){
Message msg = new Message();
Bundle bundle = new Bundle();
bundle.putString("datal",bytes);
msg.setData(bundle);
mSubThreadHandler.sendMessage(msg);
}
private void writeMsg(String msg){
for (Socket s :list){
System.out.println("客户端"+s.getInetAddress().getHostAddress());
try{
outputStream = s.getOutputStream();
if (outputStream != null){
outputStream.write(msg.getBytes("gbk"));
outputStream.flush();
}
}catch (IOException e){
//TODO Auto-generated catch block
e.printStackTrace();
}catch (Exception e){
System.out.println("客户端socket不存在。");
}
}
}
public void disconnect()throws IOException{
System.out.println("客户端是否关闭1");
if (list.size() != 0){
for (Socket s: list){
s.close();
System.out.println("客户端是否关闭2");
}
}
if (outputStream != null)
outputStream.close();
list.clear();
}
}
drawable中kuang.xml
layout中activity_main.xml
用户端
java中MainActivity.java
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class MainActivity extends AppCompatActivity {
private EditText etname, etneirong;
private TextView tvneirong;
private InputStream inputStream;
private OutputStream outputStream;
private HandlerThread mHandlerThread;
//子线程中的 Handler 实例。
private Handler mSubThreadHandler;
Handler handler = new Handler() {
public void handleMessage(Message msg) {
Bundle bundle = msg.getData();
String neirong = bundle.getString("neirong");
tvneirong.append(neirong + "n");
}
;
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etname = (EditText) findViewById(R.id.edit_name);
etneirong = (EditText)
findViewById(R.id.myinternet_tcpclient_EditText02);
tvneirong = (TextView)
findViewById(R.id.myinternet_tcpclient_EditText01);
initHandlerThraed();
}
public void lianjie(View view) {
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
//String ip = "192.168.1.249";
String ip = "localhost";
int duankou = 7777;
try {
Socket socket = new Socket(ip, duankou);
inputStream = socket.getInputStream();
outputStream = socket.getOutputStream();
byte[] jieshou = new byte[1024];
int len = -1;
while ((len = inputStream.read(jieshou)) != -1) {
//将 byte 数组转换为 String 类型
String neirong = new String(jieshou, 0, len, "gbk");
Message message = new Message();
Bundle bundle = new Bundle();
bundle.putString("neirong", neirong);
message.setData(bundle);
handler.sendMessage(message);
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
public void fasong(View view) {
// 得到昵称
String name = etname.getText().toString();
// 得到内容
String neirong = etneirong.getText().toString();
String all = name + ":" + neirong;
tvneirong.append(all + "n");
etneirong.setText("");
Message msg = new Message();
msg.obj = all;
mSubThreadHandler.sendMessage(msg);
}
private void initHandlerThraed() {
//创建 HandlerThread 实例
mHandlerThread = new HandlerThread("handler_thread");
//开始运行线程
mHandlerThread.start();
//获取 HandlerThread 线程中的 Looper 实例
Looper loop = mHandlerThread.getLooper();
//创建 Handler 与该线程绑定。
mSubThreadHandler = new Handler(loop) {
public void handleMessage(Message msg) {
writeMsg((String) msg.obj);
}
};
}
private void writeMsg(String msg) {
try {
outputStream.write(msg.getBytes("gbk"));//发送
outputStream.flush();
} catch (Exception e) {
e.printStackTrace();
}
} }
drawable中edit_bg.xml
layout中activity.xml