⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 901178c531d700191f48b4d0fe87e2ab

📁 使用TCP和UDP协议
💻
字号:
/*
 * 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();
                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());
            }
            try
            {
//                outputStreamToClient = aSocket.getOutputStream();
                datumWriter = new PrintWriter(aSocket.getOutputStream());
            } catch(IOException e)
            {
                serverGUI.appendDisplayArea("输出流错误");
            } catch(NullPointerException npe)
            {
                serverGUI.appendDisplayArea("由于强制停止服务器,导致了强制的accept,这导致了null Pointer,但不影响正常的程序逻辑");
            }
            //格式是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());
            }
            //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);
            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("ADD " + 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;
        }
        if (out != null)
        {
            datumOut = new PrintWriter(out);
            datumOut.println(msg);
        }
    }
    
//  广播机制放在这里,就不加重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 + -