📄 server.java~28~
字号:
package server;
/**
* <p>Title: MyQQ</p>
* <p>Description: MyQQ</p>
* <p>Copyright: Copyright (c) 2007</p>
* <p>Company: 南昌大学软件学院 04级网通1班</p>
* @author 张利彬
* @version 1.0
*/
import java.io.*;
import java.net.*;
import java.sql.*;
import java.util.Vector;
class ServerThread
extends Thread { //继承线程
private Socket socket; //定义套接口
private BufferedReader in; //定义输入流
private PrintWriter out; //定义输出流
int no; //定义申请的QQ号码
public ServerThread(Socket s) throws IOException { //线程构造函数
socket = s; //取得传递参数
in = new BufferedReader(new InputStreamReader(socket.getInputStream())); //创建输入流
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.
getOutputStream())), true); //创建输出流
start(); //启动线程
}
public void run() { //线程监听函数
try {
while (true) {
String str = in.readLine(); //取得输入字符串
if (str.equals("end"))
break; //如果是结束就关闭连接
else if (str.equals("login")) { //如果是登录
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //连接数据库
Connection c = DriverManager.getConnection("jdbc:odbc:javaicq",
"sa", "shift");
String sql = "select nickname,password from icq where icqno=?";
//准备从数据库选择呢称和密码
PreparedStatement prepare = c.prepareCall(sql);
//创建一个 CallableStatement 对象来调用数据库存储过程。
//CallableStatement 对象提供了设置其 IN 和 OUT 参数的方法,以及用来执行调用存储过程的方法。
//设定数据库查寻条件,
/*创建一个 PreparedStatement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。
创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。
带有 IN 参数或不带有 IN 参数的 SQL 语句都可以被预编译并存储在 PreparedStatement 对象中。
然后可以有效地使用此对象来多次执行该语句。
*/
String icqno = in.readLine();
int g = Integer.parseInt(icqno); //取得输入的QQ号码,parseInt(icqno)将字符串参数作为有符号的十进制整数进行解析
System.out.println(icqno);
String passwd = in.readLine().trim(); //取得输入的密码,返回字符串的副本,忽略前导空白和尾部空白。
System.out.println(passwd);
prepare.clearParameters();
prepare.setInt(1, g); //设定参数
ResultSet r = prepare.executeQuery(); //执行数据库查寻
if (r.next()) { //以下比较输入的号码于密码是否相同
String pass = r.getString("password").trim();
System.out.println(pass);
if (passwd.regionMatches(0, pass, 0, pass.length())) {
out.println("ok");
//如果相同就告诉客户ok
//并且更新数据库用户为在线
//以及注册用户的ip 地址
//*************register ipaddress
String setip = "update icq set ip=? where icqno=?";
PreparedStatement prest = c.prepareCall(setip);
prest.clearParameters();
prest.setString(1, socket.getInetAddress().getHostAddress());
prest.setInt(2, g);
int set = prest.executeUpdate();
System.out.println("ip=" +
socket.getInetAddress().getHostAddress() +
" " + set);
//*************ipaddress
//set status online
String status = "update icq set status=1 where icqno=?";
PreparedStatement prest2 = c.prepareCall(status);
prest2.clearParameters();
prest2.setInt(1, g);
int set2 = prest2.executeUpdate();
System.out.println("status = 1 " + set2);
//set online
}
//否者告诉客户失败
else
out.println("false");
r.close();
c.close();
}
else {
out.println("false");
System.out.println("false");
r.close();
c.close();
}
}
catch (Exception e) {
e.printStackTrace();
}
socket.close();
} //end login
//登录结束
//以下为处理客户的新建请求
else if (str.equals("new")) {
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //连接数据库
Connection c2 = DriverManager.getConnection("jdbc:odbc:javaicq",
"sa", "shift");
String newsql =
"insert into icq(nickname,password,email,info,place,pic) values(?,?,?,?,?,?)";
//准备接受用户的呢称,密码,email,个人资料,籍贯,头像等信息
PreparedStatement prepare2 = c2.prepareCall(newsql);
String nickname = in.readLine().trim();
String password = in.readLine().trim();
String email = in.readLine().trim();
String info = in.readLine().trim();
String place = in.readLine().trim();
int picindex = Integer.parseInt(in.readLine());
prepare2.clearParameters();
prepare2.setString(1, nickname);
prepare2.setString(2, password);
prepare2.setString(3, email);
prepare2.setString(4, info);
prepare2.setString(5, place);
prepare2.setInt(6, picindex);
int r3 = prepare2.executeUpdate(); //执行数据库添加
String sql2 = "select icqno from icq where nickname=?";
//以下告诉客户其注册的号码
PreparedStatement prepare3 = c2.prepareCall(sql2);
prepare3.clearParameters();
prepare3.setString(1, nickname);
ResultSet r2 = prepare3.executeQuery();
while (r2.next()) {
//out.println(r2.getInt(1));
no = r2.getInt(1);
System.out.println(no);
}
out.println(no);
out.println("ok");
c2.close();
//完毕
}
catch (Exception e) {
e.printStackTrace();
out.println("false");
}
socket.close();
} //end new
//新建用户结束
//以下处理用户查找好友
else if (str.equals("find")) {
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection c3 = DriverManager.getConnection("jdbc:odbc:javaicq",
"sa", "shift");
//以下连接数据库,并且返回其他用户的呢称,性别,籍贯,个人资料等信息
String find = "select nickname,sex,place,ip,email,info from icq";
Statement st = c3.createStatement();
ResultSet result = st.executeQuery(find);
while (result.next()) {
out.println(result.getString("nickname"));
out.println(result.getString("sex"));
out.println(result.getString("place"));
out.println(result.getString("ip"));
out.println(result.getString("email"));
out.println(result.getString("info"));
} //while end
out.println("over");
////////GET QQNO
int d, x;
boolean y;
//以下返回用户的qq号码,头像号,及是否在线
ResultSet iset = st.executeQuery("select icqno,pic,status from icq");
while (iset.next()) {
d = iset.getInt("icqno");
out.println(d);
x = iset.getInt("pic"); //pic info
out.println(x);
y = iset.getBoolean("status");
if (y) {
out.println("1");
}
else {
out.println("0");
}
//System.out.println(d);
}
// end send jicqno
iset.close();
/////////icqno end
c3.close();
result.close();
}
catch (Exception e) {
e.printStackTrace();
System.out.println("false");
}
//socket.close();
} //end find
//查找好友结束
//以下处理用户登录时读取其好友资料
else if (str.equals("friend")) {
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection c4 = DriverManager.getConnection("jdbc:odbc:javaicq",
"sa", "shift");
//以下连接好友表,返回用户的好友名单
String friend = "select friend from friend where icqno=?";
PreparedStatement prepare4 = c4.prepareCall(friend);
prepare4.clearParameters();
int icqno = Integer.parseInt(in.readLine());
System.out.println(icqno);
prepare4.setInt(1, icqno);
ResultSet r4 = prepare4.executeQuery();
Vector friendno = new Vector(); //该矢量保存好友号码
while (r4.next()) {
friendno.add(new Integer(r4.getInt(1)));
}
//read friend info
//以下告诉客户其好友的呢称,号码,ip地址,状态,头像,个人资料等信息
out.println(friendno.size());
for (int i = 0; i < friendno.size(); i++) {
String friendinfo =
"select nickname,icqno,ip,status,pic,email,info from icq where icqno=?";
PreparedStatement prepare5 = c4.prepareCall(friendinfo);
prepare5.clearParameters();
prepare5.setObject(1, friendno.get(i));
ResultSet r5 = prepare5.executeQuery();
boolean status;
while (r5.next()) {
out.println(r5.getString("nickname"));
out.println(r5.getInt("icqno"));
out.println(r5.getString("ip"));
status = r5.getBoolean("status");
if (status)
out.println("1");
else {
out.println("0");
}
out.println(r5.getInt("pic"));
out.println(r5.getString("email"));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -