📄 socketconn.java
字号:
package com.dfun.blackjackServer;
import java.net.*;
import java.io.*;
/**************************************************
* @author Beetle
* 类功能介绍:连接一连接一进行常规的数据收发,但是在客户端没有请
* 求的情况下不能主动下发数据(因为客户端并不长时间监听连接一)
* 连接二连接二用于消息通知(客户端长时间进行监听),该连接可以从
* 服务端主动下发消息除初始化为一般不接受数据
**************************************************/
public class SocketConn extends Thread{
private Control ctrl; //主控
private int connState; //连接状态(0还未初始化,1连接二,2连接二)
private SocketManage connManage; //连接管理器
private DataOutputStream out; //输入流
private DataInputStream in; //输出流
public boolean isListener; //是否进行监听
private String userId; //用户id
public SocketConn(Control ctrl,SocketManage connManage,Socket conn) {
this.ctrl = ctrl;
this.connManage=connManage;
userId=null;
connState = 0;
try{
out=new DataOutputStream(conn.getOutputStream());
in=new DataInputStream(conn.getInputStream());
}catch(Exception e){
return;
}
isListener=true;
this.start();
}
/*******************************************************
* 功能介绍:根据手机发上来的指令号将参数交给某个过程
* 输入参数:无
*******************************************************/
public void run() {
String inputStr="";
try {
while (isListener) {
inputStr = in.readUTF();
if (connState != 0) { //该连接是否已初始化完毕完毕则把数据发给分发器
if (connState == 1) { //判断当属于哪个连接
ctrl.getOneData(userId, inputStr);
}else if (connState == 2) {
ctrl.getTwoData(userId, inputStr);
}
}else { //未初始化则进行初始化
int order=Integer.parseInt(inputStr.substring(0,2));
inputStr=inputStr.substring(2,inputStr.length());
switch (order) {
case 99: //连接一初始化
initConnOne();
break;
case 98: //连接二初始化
initConnTwo(inputStr);
break;
case 97: //接收用户消息并生成用户对象
getUserInfo(inputStr);
break;
}
}
}
}
catch (Exception e) {
//如果还没有userid表明网络出错前程序还没初始化完毕则不进行清理操作
if(userId!=null){
//如果这是第一次断线则执行清理程序(如果为否表明另一个连接已执行了清理程序)
if (isListener) {
ctrl.userOffline(userId);
}
}
}
}
/*****************************************************
* 功能介绍:初始化连接一
* 输入参数:无
* 输出参数:无
****************************************************/
private void initConnOne() throws IOException {
userId = String.valueOf(Init.ramdon());
connManage.addConnOne(userId, this);
sendData("99" + userId);
}
private void initConnTwo(String userId) {
this.userId = userId; //将连接二发上来的id作为当前的用户id
connManage.addConnTwo(userId, this);
connState = 2;
}
/*****************************************************
* 功能介绍:取得用户发上来的用户信息,并生成用户对象
* 输入参数:用户发上来的信息
* 输出参数:无
****************************************************/
private void getUserInfo(String inputStr){
String arrTmp[]=inputStr.split(","); //组成为电话号码,用户昵称
String phoneNumber=arrTmp[0];
String userName=arrTmp[1];
String password =arrTmp[2];
ctrl.userManage.addUser(userId,phoneNumber,userName,password); //生成用户
connState = 1;
}
/*****************************************************
* 功能介绍:发送数据
* 输入参数:要发送的数据
* 输出参数:是否成功
****************************************************/
public boolean sendData(String outStr) {
try {
out.writeUTF(outStr);
return true;
}
catch (Exception e) {
System.out.println("服务端使用连接"+connState+"发送"+outStr+"发生错误 "+e.getMessage());
//如果还没有userid表明网络出错前程序还没初始化完毕则不进行清理操作
if(userId!=null){
//如果这是第一次断线则执行清理程序(如果为否表明另一个连接已执行了清理程序)
if (isListener) {
ctrl.userOffline(userId);
}
}
return false;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -