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

📄 clientthread.java

📁 java聊天室服务器
💻 JAVA
字号:
package XXRoom;

import java.net.*;
import java.io.*;
import java.util.StringTokenizer;
import java.util.NoSuchElementException;
import javax.swing.JOptionPane;

/*向用户发送消息*/
class ClientThread extends Thread
{
	ServerThread sThread;
	//用来向联机者发送信息的TCP
	Socket skt;
	//发送消息的流
	PrintStream write;
	BufferedReader read;
	boolean ready;
	String nickName;

	public ClientThread( ServerThread sThread, Socket skt ) throws IOException
	{		
		this.sThread = sThread;
		write = new PrintStream(  skt.getOutputStream() );
		read  = new BufferedReader( new InputStreamReader( skt.getInputStream() ) );
		this.skt = skt;
		ready = false;
	}
	
	public void run()
	{
		while( true ) {
			try
			{
				String s = read.readLine();
				if( s == null )
					return;
			//	JOptionPane.showMessageDialog( sThread.sFrm, s );

				StringTokenizer st = new StringTokenizer( s );
				try
				{
					String s1 = st.nextToken();
					if( ! s1.equals( "HELO:" ) ) {
			//			JOptionPane.showMessageDialog( sThread.sFrm, "客户名字格式错误" );
						write.println( "NickNameRepeated" );
						continue;
					}
					String s2 = st.nextToken();
					//s2即用户想要使用的 Nickname
					LinkTableModel ltm = (LinkTableModel)sThread.sFrm.table.getModel();

					//如果没有重名的用户,通知用户可以使用并发送UDP端口号
					synchronized( sThread.sFrm.table ) {
						if( ltm.isGuestExsit( s2 ) ) {
			//				JOptionPane.showMessageDialog( sThread.sFrm, "客户名字重复: " + s2 );
							write.println( "NickNameRepeated" );
							continue;
						}
						else {
			//				JOptionPane.showMessageDialog( sThread.sFrm, "客户名字可用: " + s2 );
							nickName = s2;
							write.println( "WELCOME " + sThread.dSocket.getLocalPort() );
							ready = true;
							
							
							//把用户列表发送给新加入的用户							
							for( int i = 0; i < ltm.getRowCount(); i ++ ) {
								write.println ( "LIST " + ltm.getValueAt( i, 1 ) );
							}
							
							synchronized( sThread.messages ) {
								sThread.messages.add( "LIST " + nickName ); 
							}

							ltm.addGuest( skt.getInetAddress().getHostAddress(), s2 );
							sThread.sFrm.table.updateUI();					 

							break;
						}
					}
				}
				catch ( NoSuchElementException er )
				{
					er.printStackTrace();
					continue;
				}
			}
			catch ( IOException e )
			{
				JOptionPane.showMessageDialog( sThread.sFrm, nickName + "发生IO异常" );
			
				synchronized( sThread.sFrm.table ) {
					LinkTableModel ltm = (LinkTableModel)sThread.sFrm.table.getModel();
					ltm.removeGuestFromNickName( nickName );
					sThread.sFrm.table.updateUI();					
				}
			
				sThread.sFrm.appendSystemMsg( nickName + "已经离开聊天室\n" );

				JOptionPane.showMessageDialog( sThread.sFrm, nickName + "quit" );
				synchronized( sThread.messages ) {
					sThread.messages.add( "QUIT " + nickName );
				}
				JOptionPane.showMessageDialog( sThread.sFrm, nickName + "删除" );
				return;
			}
		}
	}

    public void dispose()
	{					
		try
		{
			read.close();			
			skt.close();
		}
		catch ( IOException e )
		{
			e.printStackTrace();
		}
		write.close();		
		
		skt = null;		
	}
}

⌨️ 快捷键说明

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