准备工作
一台手机作服务端,一台手机作客户端,两部手机连接同一个WIFI
服务端
服务端需要开启ServerSocket并监听客户端发来的信息,开启很简单,启动一个子线程
new Thread() {
@Override
public void run() {
super.run();
try {
// mPort指明服务端要使用的端口
if (mServerSocket == null) mServerSocket = new ServerSocket(mPort);
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
接下来就是监听客户端发来的信息,当有客户端连接成功时,服务端可以通过mServerSocket.accept()来获取客户端Socket,拿到客户端Socket时,便可以获取InputStream,读取客户端发来的消息
// 等待客户端连接
while (true) {
try {
if (mServerSocket != null && !mServerSocket.isClosed()) {
mSocket = mServerSocket.accept();
} else {
break;
}
} catch (IOException e) {
e.printStackTrace();
}
// 需要注意的是一个服务端可能有多个客户端连接,所以这里也需要再开启子线程
if (mSocket != null) new ServerThread(mSocket, mHandler, mStringBuffer).start();
}
ServerThread读取消息并返回
@Override
public void run() {
byte[] bytes = new byte[1024];
InputStream inputStream = null;
try {
if (mSocket != null) {
inputStream = mSocket.getInputStream();
while (inputStream.read(bytes) != -1) {
// 使用.trim()去掉空字符,不然byte[]里面会包含很多空字符
mStringBuffer.append(new String(bytes, StandardCharsets.UTF_8).trim());
Message msg = mHandler.obtainMessage();
msg.what = 2;
msg.obj = mStringBuffer;
mHandler.sendMessage(msg);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (inputStream != null) inputStream.close();
if (mSocket != null) mSocket.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
最后展示
public Handler mHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message message) {
switch (message.what) {
case 1:
// Server的ip和port信息
mTvInfo.setText(message.obj.toString());
break;
case 2:
// 从客户端获取到的消息
mTvGetData.setText(message.obj.toString());
mStringBuffer.setLength(0);
break;
}
return false;
}
});
客户端
首先连接服务端,ip和port为服务端手机当前的ip地址和开启服务的端口,连接成功后获取OutputStream就可以发送信息给服务端
Thread thread = new Thread(){
@Override
public void run() {
super.run();
if (!mIsConnected) {
try {
// 连接服务端
mSocket = new Socket(ip, mPort);
if(mSocket.isConnected()){
mIsConnected = true;
mOutputStream = mSocket.getOutputStream();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "连接成功", Toast.LENGTH_SHORT).show();
}
});
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
};
thread.start();
发送信息给服务端
Thread thread = new Thread(){
@Override
public void run() {
super.run();
if(mIsConnected && mOutputStream != null){
try {
// 将String转换成byte[]传输数据,使用UTF-8编码,服务端也使用UTF-8转换,支持中文
mOutputStream.write(data.getBytes(StandardCharsets.UTF_8));
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "发送成功", Toast.LENGTH_SHORT).show();
}
});
} catch (IOException e) {
mIsConnected = false;
e.printStackTrace();
}
}
}
};
thread.start();
大功告成!