50,529
社区成员
发帖
与我相关
我的任务
分享
//阻塞在这里,等待别的设备连接
socket = mServerSocket.accept();
//setListenState(SERVING);//我是服务器
sockets.add(socket);//加入列表
//out(socket);
connected(socket,false);
re=new receiveThread(socket);
re.start();//接收流
isSuc=true;
if(isSuc)
{
customD.show();//提示框 如果点了确认就会开启write方法 往客户端写本地数据库的所有数据
isSuc=false;
}
customD.setConfirm("confirm", new CustomDialog.IOnConfirmListener(){
@Override
public void onConfirm(CustomDialog dialog) {
Toast.makeText(mContext, "确认成功!",Toast.LENGTH_SHORT).show();
try {
mAcceptThread.re.DBout();
} catch (IOException e) {
e.printStackTrace();
}
}
});
public void DBout() throws IOException {
String end="messageEND";
List<TUsers> other_Row = p.findAllLocal();//查询全部的表信息
if (other_Row.size() > 0) {
for (TUsers row : other_Row) {
String t= TtoString(row);//自己写的一个方法 将表的每一行转换成string类型
mOutStream.write(t.getBytes());
}
mOutStream.write(end.getBytes());//结束标志
//mOutStream.flush();
}
}
public void run(){
try {
setListenState(SERVING);
byte[] buffer = new byte[MAX_BUFFER_SIZE];
int bytes;
InputStream tmpIn = null;
OutputStream tmpOut = null;
//从连接的Socket中获取读数据和写数据的流接口
try {
// br = new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
tmpIn = rSocket.getInputStream();
tmpOut = rSocket.getOutputStream();
} catch (IOException e) {
setConnectState(CONNECT_STATE_IDLE);
rSocket = null;
mConnectedThread = null;
return;
}
mInStream = tmpIn;
mOutStream = tmpOut;
//读取数据
while (!mUserCancel) {
//阻塞在这里,用流接口等待读取数据
bytes = mInStream.read(buffer);
if (isFirst) {//接收数据库的信息
byte[] data = new byte[bytes];
System.arraycopy(buffer, 0, data, 0, bytes);
String t1 = new String(data);
if (t1.equals("messageEND")) {
isFirst = false;
}else{
TUsers te = StoTuser(t1);
p.connected_Insert(te, rSocket.getRemoteDevice().getAddress());
continue;
}
}
//将ConnectionManager的连接状态修改成CONNECT_STATE_CONNECTED
setConnectState(CONNECT_STATE_CONNECTED);
if(dd==1){
msg = "sys:##" + "欢迎" + rSocket.getRemoteDevice().getName() + "进入聊天室,当前聊天室人数为" + (sockets.size() + 1);
sendData(msg.getBytes(StandardCharsets.UTF_8), true);//--------进入聊天室的消息
//setListenState(LISTEN_STATE_IDLE);
dd++;
}
try {//这里接收聊天的消息
//将读取到的数据传递给关注它的组件
if (mConnectionListener != null && bytes > 0) {
byte[] data = new byte[bytes];
System.arraycopy(buffer, 0, data, 0, bytes);
byte[] temp;
byte[] temp1;
msg = rSocket.getRemoteDevice().getName() + ":";
temp1 = msg.getBytes();
temp = byteMerger(temp1, data);
//发给除了读者之外的设备
for (int i = 0; i < sockets.size(); i++) {
if (!(rSocket.getRemoteDevice().getAddress().equals(sockets.get(i).getRemoteDevice().getAddress())))
sockets.get(i).getOutputStream().write(temp);
}
mConnectionListener.onReadData(temp);
}
} catch (IOException e) {
//阻塞过程中,如果其它地方调用了mSocket.close(),
//或者对方的连接关闭
//将会进入到这个异常当中
break;
}
}
}catch(Exception e){
e.printStackTrace();
}
setListenState(LISTEN_STATE_LISTENING);
setConnectState(CONNECT_STATE_IDLE);
}//run
try {
bytes = mInStream.read(buffer);
//这里是想先服务端write信息给客户端之后,客户端再write自己的数据库信息
if(dd==1){
DBout();
dd++;
}
if (isFirst) {
byte[] data = new byte[bytes];
System.arraycopy(buffer, 0, data, 0, bytes);
String t1 = new String(data);
if (t1.equals("messageEND")) {
isFirst = false;
dd++;
}else {
TUsers te = StoTuser(t1);
p.connected_Insert(te, mSocket.getRemoteDevice().getAddress());
continue;
}
}
//将ConnectionManager的连接状态修改成CONNECT_STATE_CONNECTED
setConnectState(CONNECT_STATE_CONNECTED);
//读取数据
//将读取到的数据传递给关注它的组件
if (mConnectionListener != null && bytes > 0) {
byte[] data = new byte[bytes];
System.arraycopy(buffer, 0, data, 0, bytes);
mConnectionListener.onReadData(data);
}