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

📄 e04272d815d800191895ba9e8b149c92

📁 使用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 client;

/**
 * @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.io.*;

class TCPConnection extends Thread
{
    //服务器主机地址,由主程序给出
    private String host = null;
    //服务器端口号,由主程序给出
    private int portNumber = 0;
    //判断是否成功建立连接的变量
    boolean connectSuccess = true;
    //指向主程序的引用
    private PublicChatGUI tcpGUI = null;
    //客户端Socket
    private Socket clientSocket = null;
    //输入输出流
    InputStream inputStream = null;
    BufferedReader dataInputReader = null;
    PrintWriter dataOutputWriter = null;
    //输入输出缓冲区
    String messageGot;
    byte[] byteIn = new byte[1024];
    //启动和停止线程的信号量:
    boolean runFlag = true;
    
    TCPConnection(PublicChatGUI gui, String host, int portNumber) 
    {
        tcpGUI = gui;
        this.host = host;
        this.portNumber = portNumber;
        
        //建立连接,如果连连接都建立不起来,就直接返回,不再建立输入输出流
        try
        {
            clientSocket = new Socket(host, portNumber);
        } catch(UnknownHostException e)
        {
            connectSuccess = false;
            tcpGUI.appendMessageAreaText(PublicChatGUI.EXCEPTION + "未知主机,请点击\"选项\\服务器地址\"进行配置,然后重新连接");
            return ;
        } catch(IOException e)
        {
            connectSuccess = false;
            tcpGUI.appendMessageAreaText(PublicChatGUI.EXCEPTION + "无法建立数据通路,端口错误或主机服务不存在请点击\"选项\\服务器TCP端口\"进行配置,然后重新连接");
            return ;
        }
        //得到输入输出流,如若失败,就关闭连接
        try
        {
            dataInputReader =new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    		dataOutputWriter = new PrintWriter(clientSocket.getOutputStream());
        } catch(IOException e)
        {
            connectSuccess = false;
            tcpGUI.appendMessageAreaText(PublicChatGUI.EXCEPTION + "无法从Socket得到输入输出流,将关闭连接..");
            try
            {
                clientSocket.close();
            } catch(IOException eclose)
            {
                tcpGUI.appendMessageAreaText("关闭连接失败\n");
            }
            return ;
        }
    }
    
    //关闭连接,释放资源
    public void closeSocket()
    {
        try
        {
            clientSocket.close();
        } catch(IOException e)
        {
            tcpGUI.appendMessageAreaText("关闭连接时出错");
        }
    }
    //向服务器发送登陆信息,如果用户名无重复,返回true
    boolean sendLoginInfo(String screenName)
    {
        boolean noSameName = false;
        tcpGUI.tcpConnection.dataOutputWriter.println("HELO " + screenName);
        tcpGUI.tcpConnection.dataOutputWriter.flush();
        try
        {
            String trueOrFalse = dataInputReader.readLine();
            noSameName = trueOrFalse.equalsIgnoreCase("true");
        } catch(IOException e)
        {
            tcpGUI.appendMessageAreaText(PublicChatGUI.EXCEPTION + "从服务器得到连接确认信息时,出现了异常,即将关闭连接..");
            tcpGUI.disConnect();
        }
        return noSameName;
    }
    
    //从服务器接收欢迎&udp端口消息 
    int getWelcomAndUDPPort()
    {
        int udpPort = 0;
        try
        {
            messageGot = tcpGUI.tcpConnection.dataInputReader.readLine();
        } catch(IOException e)
        {
            tcpGUI.appendMessageAreaText(PublicChatGUI.EXCEPTION + "确认欢迎&端口信息时出现输入输出异常,将使用默认UDP端口号");
        }
        try
        {
            udpPort = Integer.parseInt(messageGot.substring(messageGot.indexOf("WELCOME ") + 8));
        } catch(NumberFormatException nfe)
        {
            tcpGUI.appendMessageAreaText(PublicChatGUI.EXCEPTION + "提取UDP端口号出现异常");
        }
        return udpPort;
    }
    //从服务器接收用户列表:
    
    
    //一切就绪,启动线程,接受服务器发过来的消息:
    

    public synchronized void stopThread()
    {
        runFlag = false;
    }
    
    public synchronized boolean getRunFlag()
    {
        return runFlag;
    }
    //等待服务器端的消息
    public void run()
    {
        runFlag = true;
        while(getRunFlag())
        {
            try
            {
                String messageStr = dataInputReader.readLine();
                if (messageStr.indexOf("SERVERQUIT") != -1)
                {
                    tcpGUI.appendMessageAreaText(PublicChatGUI.PROMPT + "服务器从连接上主动断开!!!\n" + "请尝试另外的主机地址或TCP端口");
                    tcpGUI.disConnect();
                }
                if (messageStr.indexOf("ADD ") != -1)
                {
                    String name = messageStr.substring(messageStr.indexOf("ADD ") + 4);
                    tcpGUI.appendMessageAreaText(PublicChatGUI.PROMPT + name + "登录了!");
                    tcpGUI.lItems.add(0, name);
                }
                if (messageStr.indexOf("ADDOLD ") != -1)
                {
                    String name = messageStr.substring(messageStr.indexOf("ADDOLD ") + 7);
                    //对于先于本用户登陆的用户,就不要显示登陆信息了:
                    tcpGUI.lItems.add(0, name);
                }
                if (messageStr.indexOf("DEL ") != -1)
                {
                    String name = messageStr.substring(messageStr.indexOf("DEL ") + 4);
                    tcpGUI.appendMessageAreaText(PublicChatGUI.PROMPT + name + "下线了!");
                    tcpGUI.lItems.removeElement(name);
                }
                    
                if (messageStr.indexOf("PUBLIC ") != -1)
                {
                    String name = messageStr.substring(messageStr.indexOf("PUBLIC ") + 7, messageStr.indexOf(":"));
                    tcpGUI.appendMessageAreaText(name + "说:      " + messageStr.substring(messageStr.indexOf(":") + 2));
                }
                if (messageStr.indexOf("PRIVATE ") != -1)
                {
                    String sender = messageStr.substring(messageStr.indexOf("FROM ") + 5, messageStr.indexOf("TO") - 1);
                    String qiaoQiaoHua = messageStr.substring(messageStr.indexOf("MSG ") + 4);
                    tcpGUI.appendMessageAreaText(sender + "给你说了一句悄悄话:  " + qiaoQiaoHua);
                }
            } catch(IOException e)
            {
                tcpGUI.appendMessageAreaText(PublicChatGUI.EXCEPTION + "得到聊天信息时出错,系统将退出");
                //如是服务器非法断开而导致的连接错误,要将连接断开:
             //   if (e.getMessage().equals("Connection reset"))
                    tcpGUI.disConnect();
            } catch(NullPointerException npe)
            {
                tcpGUI.appendMessageAreaText(PublicChatGUI.EXCEPTION + "从服务器接收到空串,不影响程序运行");
            }
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -