?? 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 + -