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

📄 e0ecff8be6d5001919beb9595aa95db7

📁 使用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;
    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
            {
                messageGot = datumReader.readLine();
            } 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);
            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);
                serverGUI.appendDisplayArea("用户 " + aScreenName + " 登陆\n");
                broadCast("用户 " + aScreenName + " 登陆\n");
            }
            
        }
    }
    
    public void broadCast(String message)
    {
        //..
    }
    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 + -