📄 qqsever.java
字号:
//服务器中转
package myQQ;
import javax.swing.*;
import java.io.*;
import java.net.*;
import java.util.*;
class QQSever extends JFrame
{
JTextArea jta = new JTextArea();
JScrollPane jsp = new JScrollPane(jta);
//通信
ServerSocket ss;
Socket sc;
//读取信息
ObjectInputStream ois;
//发送消息
ObjectOutputStream oos;
int c=0; //记录连接数
//记录连接及对应id的HashTable
Hashtable htS = new Hashtable();
QQSever()
{
super("QQ服务器");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(400,300);
this.getContentPane().add(jsp);
this.setResizable(false);
this.setVisible(true);
//服务器监听
try {
ss = new ServerSocket(1500);
jta.append("等待连接...\n");
while(true)
{
sc = ss.accept();
c++;
new QQCS(sc).start();
jta.append("第"+c+"个客户端\t");
}
}
catch (Exception ex) {
System.out.println (ex);
}
}
//客户端线程
class QQCS extends Thread
{
Socket any;
String id;
public QQCS(Socket any)
{
this.any = any;
}
public void run()
{ //线程启动接收消息
try {
this.readMess();
}
catch (Exception ex) {
System.out.println (ex);
}
}
//接受消息
public void readMess() throws Exception
{
while(true)
{
ois = new ObjectInputStream(any.getInputStream());
Object tem = ois.readObject();
if(tem instanceof MessType)
{
MessType mt = (MessType)tem;
if(mt.State==10||mt.State==11)
{ //聊天信息操作
this.chatInfoOperation(mt);
}
else if(mt.State==41||mt.State==42||mt.State==4)
{ //注册操作
this.registerOperation(mt);
}
else
{ //状态改变操作
this.stateOperation(mt);
if(mt.State==-1)
{ //下线操作
any.close();
break;
}
}
}
else
{
System.out.println ("stop!");
break;
}
}
}
public void stateOperation(MessType mt)
{ //读入消息为状态改变信息的操作
int sf = mt.State;
this.id = mt.Sendid;
switch (sf) {
case 0:
this.onLine(mt);
break;
case 2: break;
case 3: break;
case -1:
//移除该id对应的Socket
if(htS.size()>0)
htS.remove(this.id);
break;
}
//取得状态信息并显示
jta.append(mt.getStateInfo());
}
public void onLine(MessType mt)
{ //上线操作
if(mt.Sendpw.length()>0)
{ //登录验证
String f = QQDBO.logCheck(mt);
jta.append(f+"\n");
//将id和Socket存入Hashtable
htS.put(this.id,this.any);
if(f.equals("登录成功"))
{ //发回好友列表
Vector v = QQDBO.getFriend(mt);
MessType result = new MessType(v,0);
result.Readid = mt.Sendid;
result.Results = f;
this.sendMess(result);
this.informOnLine(v,mt);
}
else
{ //发回验证结果
MessType result = new MessType(f,0);
result.Readid = mt.Sendid;
this.sendMess(result);
//登录不成功除去该连接
htS.remove(this.id);
}
}
}
public void informOnLine(Vector x,MessType mt)
{ //将上线信息发送给好友
for (int i = 0; i<x.size(); i++)
{
Vector tem = (Vector)x.elementAt(i);
String rid = tem.elementAt(2).toString();
if(!rid.equals(mt.Sendid))
{
MessType mtR = new MessType(mt.Sendid,20); //发送方号码作为结果返回
mtR.Readid = rid;
this.sendMess(mtR);
}
}
}
public void chatInfoOperation(MessType mt)
{ //读入消息为聊天信息的操作
if(htS.containsKey(mt.Readid))
{ //连接中存在信息接收id的键值
this.sendMess(mt);
mt.setHaseSend(true);
}
//取得读入消息并显示
jta.append(mt.getChatInfo());
//同时保存至数据库
boolean flag = QQDBO.chatInfoIn(mt);
if(flag)
jta.append("聊天信息存入成功\n");
}
public void registerOperation(MessType mt) throws Exception
{ //读入消息为注册信息的操作
//将id和Socket存入Hashtable
htS.put(mt.Sendid,this.any);
if(mt.State==41)
{ //请求省市信息
MessType pro = new MessType(QQDBO.getPlace(1,mt),41);
pro.Readid = mt.Sendid;
this.sendMess(pro); //发回信息
}
else if(mt.State==42)
{ //请求省市信息
MessType city = new MessType(QQDBO.getPlace(2,mt),42);
city.Readid = mt.Sendid;
this.sendMess(city);
}
else if(mt.State==4)
{ //注册
boolean f = QQDBO.logIn(mt);
if(f)
{
jta.append("注册成功!");
MessType mtId = new MessType(QQDBO.getLogId(),4);
mtId.Readid = mt.Sendid;
this.sendMess(mtId); //发回注册号
htS.remove(mt.Sendid); //清除连接
any.close(); //中止该连接
}
}
}
//发送消息
public void sendMess(MessType mt)
{ //将消息发送至与接收方id对应的连接
try {
Socket stem = (Socket)htS.get(mt.Readid);
oos = new ObjectOutputStream(stem.getOutputStream());
oos.writeObject(mt);
oos.flush();
jta.append("发送成功\n");
}
catch (Exception ex) {
System.out.println (ex);
}
}
}
public static void main(String[]args)
{
JFrame.setDefaultLookAndFeelDecorated(true);
new QQSever();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -