📄 201b597179d700191f30dfe4f55e342c
字号:
/*
* Created on 2005-5-31
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package server;
/**
* @author Administrator
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
import java.net.*;
import java.util.*;
import java.io.*;
class TCPThread extends Thread
{
private int port = 1234;
ServerGUI serverGUI = null;
ServerSocket serverSocket = null;
//临时变量,表示一个用户名
String aScreenName = null;
String messageGot = null;
//accept()返回的一个socket,表示server和client的一个TCP连接:
Socket aSocket = null;
//用于存放socket连接的Map:
HashMap sockets = null;
//用于反映查询是否从在的变量:
boolean exist = false;
//输入输出流
/*InputStream inputStreamFromClient = null;
OutputStream outputStreamToClient = null;*/
BufferedReader datumReader = null;
PrintWriter datumWriter = null;
//遍历Map用
Iterator iterSockets = null;
//为了给Client端发消息 :
OutputStream out = null;
PrintWriter datumOut = null;
//连接是否正确建立的变量:
boolean tcpSuccess = true;
TCPThread(ServerGUI serverGUI, int tcpPort)
{
this.serverGUI = serverGUI;
this.port = tcpPort;
sockets = new HashMap();
try
{
serverGUI.appendDisplayArea("正在建立TCP连接...");
serverSocket = new ServerSocket(port);
} catch(IOException e)
{
serverGUI.appendDisplayArea("构造TCP serverSocket时出错,端口不可用");
tcpSuccess = false;
return ;
}
serverGUI.appendDisplayArea("已建立TCP连接");
}
public void run()
{
while(true)
{
try
{
aSocket = serverSocket.accept();
datumReader = new BufferedReader(new InputStreamReader((aSocket.getInputStream())));
} catch(IOException e)
{
serverGUI.appendDisplayArea("TCP ServerSocket关闭");
//如果是ServerSocket已经关闭,就不要执行下边的
break;
}
try
{
datumWriter = new PrintWriter(aSocket.getOutputStream());
} catch(IOException e)
{
serverGUI.appendDisplayArea("输出流错误");
} catch(NullPointerException npe)
{
serverGUI.appendDisplayArea("由于强制停止服务器,导致了强制的accept,这导致了null Pointer,但不影响正常的程序逻辑");
}
//格式是HELO screenName,故取第五个字符以后的:
//debug
try
{
messageGot = datumReader.readLine();
} catch(IOException e)
{
serverGUI.appendDisplayArea("读取一行时出现错误" + e.getMessage());
}
//如果得到空串,可能是用户操作有误,退出本轮循环
if (messageGot == null)
continue;
//如果消息不是以HELO开头的,说明不是想要的用户连接,或是有错误的协议,不予理睬:
if (messageGot.indexOf("HELO ") == -1)
continue;
aScreenName = messageGot.substring(messageGot.indexOf("HELO ") + 5);
System.out.println( aScreenName );
serverGUI.appendDisplayArea("接到用户名" + aScreenName);
System.out.println("接到用户名" + aScreenName);
exist = sockets.containsKey(aScreenName);
//
System.out.println("!exist: " + !exist);
datumWriter.println(!exist);
datumWriter.flush();
if (exist)
{
try
{
serverGUI.appendDisplayArea("用户尝试用相同的登陆名,强制关闭连接");
datumReader.close();
datumWriter.close();
aSocket.close();
} catch(IOException e)
{
serverGUI.appendDisplayArea("关闭socket连接(aSocket.close();)时出错");
}
} else
{
datumWriter.println("WELCOME " + serverGUI.udpPort);
datumWriter.flush();
serverGUI.appendDisplayArea("用户 " + aScreenName + " 登陆");
messageToAll("ADDOLD " + aScreenName);
//让新登陆的用户接到已有的用户:
sendUsersToNewUser();
//然后将用户加入到socket中,让其接收消息:
sockets.put(aScreenName, aSocket);
}
}
}
public void sendUsersToNewUser()
{
Iterator iter = this.sockets.keySet().iterator();
while(iter.hasNext())
datumWriter.println("ADD " + ((String)iter.next()));
datumWriter.flush();
}
//当用户发送悄悄话时,就得用这个函数了:
public void messageToOne(String user, String msg)
{
try
{
out = ((Socket)sockets.get(user)).getOutputStream();
} catch(IOException ioe)
{
serverGUI.appendDisplayArea("给用户" + user + "发消息时,没能得到输出流");
out = null;
} catch(NullPointerException npe)
{
serverGUI.appendDisplayArea("private消息接收者" + user + "不存在");
}
if (out != null)
{
datumOut = new PrintWriter(out);
datumOut.println(msg);
datumOut.flush();
//debug
serverGUI.appendDisplayArea("私聊信息已发出");
}
}
// 广播机制放在这里,就不加重UDPConnction的负担了
public void messageToAll(String msg)
{
iterSockets = sockets.values().iterator();
if (iterSockets != null)
{
//debug:
System.out.println("iterSockets is not null");
while(iterSockets.hasNext())
{
//debug
System.out.println("iterSockets has next");
try
{
out = ((Socket)iterSockets.next()).getOutputStream();
} catch(IOException ioe)
{
serverGUI.appendDisplayArea("得到TCP连接输出时出现错误");
out = null;
}
if (out != null)
{
//debug:
System.out.println("outputStream is not null");
datumOut = new PrintWriter(out);
datumOut.println(msg);
datumOut.flush();
//debug:
System.out.println("to write(packetReceived.getData())");
}
}
}
}
public void closeTcpSocket()
{
Iterator iter = null;
if (sockets != null)
iter = sockets.values().iterator();
try
{
//关闭ServerSocket
if (serverSocket != null)
serverSocket.close();
serverGUI.appendDisplayArea("已关闭serverSocket");
//关闭所有与client的socket:
if (iter != null)
while(iter.hasNext())
((Socket)iter.next()).close();
} catch(IOException e)
{
serverGUI.appendDisplayArea("未能成功关闭所有的tcp连接");
return ;
}
serverGUI.appendDisplayArea("已关闭所有连接");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -