📄 20bbacff9dd6001919bff8f785df8e18
字号:
/*
* 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;
TCPThread(ServerGUI serverGUI, int tcpPort)
{
this.serverGUI = serverGUI;
this.port = tcpPort;
sockets = new HashMap();
try
{
serverGUI.appendDisplayArea("正在建立连接...\n");
serverSocket = new ServerSocket(port);
} catch(IOException e)
{
System.err.println("Meet some difficult in " +
"producing serversocket");
return ;
}
serverGUI.appendDisplayArea("已建立连接\n");
}
public void run()
{
while(true)
{
/*try
{
aSocket = serverSocket.accept();
datumFromClient = new DataInputStream(aSocket.getInputStream());
aScreenName = datumFromClient.readLine();
sockets.put(aScreenName, aSocket);
dataToClient = new PrintStream(aSocket.getOutputStream());
dataToClient.println("WELCOM <6001>");
} catch(IOException e)
{
System.err.println("difficult in serverSocket connection");
}*/
try
{
aSocket = serverSocket.accept();
// inputStreamFromClient = aSocket.getInputStream();
datumReader = new BufferedReader(new InputStreamReader((aSocket.getInputStream())));
} catch(IOException e)
{
serverGUI.appendDisplayArea(e.getMessage() + "\n");
}
try
{
// outputStreamToClient = aSocket.getOutputStream();
datumWriter = new PrintWriter(aSocket.getOutputStream());
} catch(IOException e)
{
serverGUI.appendDisplayArea("输出流错误\n");
}
//格式是HELO screenName,故取第五个字符以后的:
//debug
try
{
System.out.println("befor readlin(O");
messageGot = datumReader.readLine();
System.out.println(messageGot);
if(messageGot == null)
{
System.out.println("messageGot is null");
}
} catch(IOException e)
{
serverGUI.appendDisplayArea("读取一行时出现错误" + e.getMessage() + "\n");
}
//dedbug:
//System.err.println("print messageGot:" + messageGot);
//如果消息不是以HELO开头的,说明不是想要的用户连接,或是有错误的协议,不予理睬:
if (messageGot.indexOf("HELO ") == -1)
continue;
aScreenName = messageGot.substring(messageGot.indexOf("HELO ") + 5);
System.out.println( aScreenName );
serverGUI.appendDisplayArea("接到用户名" + aScreenName + "\n");
System.out.println("接到用户名" + aScreenName + "\n");
exist = sockets.containsKey(aScreenName);
//
System.out.println("!exist: " + !exist);
datumWriter.println(!exist);
datumWriter.flush();
if (exist)
{
try
{
serverGUI.appendDisplayArea("用户尝试用相同的登陆名,强制关闭连接\n");
datumReader.close();
datumWriter.close();
aSocket.close();
} catch(IOException e)
{
serverGUI.appendDisplayArea("关闭socket连接(aSocket.close();)时出错\n");
}
} else
{
sockets.put(aScreenName, aSocket);
datumWriter.println("WELCOME " + serverGUI.udpPort);
datumWriter.flush();
serverGUI.appendDisplayArea("用户 " + aScreenName + " 登陆\n");
messageToAll("用户 " + aScreenName + " 登陆\n");
}
}
}
// 广播机制放在这里,就不加重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连接输出时出现错误\n");
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("\nto write(packetReceived.getData())");
}
}
}
}
public void closeSocket()
{
Iterator iter = null;
if (sockets != null)
iter = sockets.values().iterator();
try
{
//关闭ServerSocket
if (serverSocket != null)
serverSocket.close();
serverGUI.appendDisplayArea("已关闭serverSocket\n");
//关闭所有与client的socket:
if (iter != null)
while(iter.hasNext())
((Socket)iter.next()).close();
} catch(IOException e)
{
serverGUI.appendDisplayArea("未能成功关闭所有的tcp连接");
return ;
}
serverGUI.appendDisplayArea("已关闭所有连接\n");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -