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

📄 listenthread.java

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

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

//接受从用户发来的包
class ListenThread extends Thread
{
	ServerThread sThread;
	DatagramSocket dSkt;
	
	byte buffer[] = new byte[ 100 ];

	public ListenThread( ServerThread sThread )
	{
		this.sThread = sThread;
		this.dSkt = sThread.dSocket;
	}

	public void run() 
	{
		while( true )
		{
			try
			{
			//	System.out.println ( dSkt.getLocalPort() );
				//缓冲区清零
				java.util.Arrays.fill( buffer, (byte)0 );

				DatagramPacket dp = new DatagramPacket( buffer, buffer.length );
				dSkt.receive( dp );

				String s = byteToString( buffer );
				
			//	JOptionPane.showMessageDialog( sThread.sFrm, s );
				
				StringTokenizer st = new StringTokenizer( s );
				try
				{
					String s1 = st.nextToken();
					String s2 = st.nextToken();

					String s3 = s.substring( s1.length(), s.length());
					//如果是退出的消息				
					if ( s1.equals( "QUIT:" ) )
					{
				
						s3 = "QUIT " + s.substring( s1.length(), s.length() );
				
						//从table和clients里面删除玩家
						ClientThread ct = null;
						synchronized ( sThread.clients ) {
							for( int i = 0; i < sThread.clients.size(); i ++ ) {
								if( ((ClientThread)sThread.clients.get( i )).nickName.equals( s2 ) ) {
				
									sThread.mThread.addClient( (ClientThread)sThread.clients.get( i ) );
												
									sThread.clients.remove( i );				
									
									break;
								}
							}
						}						
				
						synchronized( sThread.sFrm.table ) {
							LinkTableModel ltm = (LinkTableModel)sThread.sFrm.table.getModel();
							ltm.removeGuestFromNickName( s2 );
							sThread.sFrm.table.updateUI();
						}				
						//如果是聊天的消息直接放入队列,否则在上面处理后放入				
						sThread.sFrm.appendSystemMsg( s2 + "已离开聊天室\n" );

						synchronized( sThread.messages )
						{
						//从包里剥离有意义的字符放入消息队列
							sThread.messages.add( s3 );
						}				
						continue;
					}
					//如果是用户发送文件
					//
					if( s1.equals( "FILE" ) ) {
						try
						{
							String dest = s2;
							String source   = st.nextToken();							
						
							sThread.sFrm.appendSystemMsg ( source + "向" + dest + "要求发送文件\n" );

							synchronized( sThread.messages ) {					
								sThread.messages.add( s );
							}
							continue;
						}
						catch ( NoSuchElementException e )
						{
							JOptionPane.showMessageDialog( sThread.sFrm, "文件传送消息格式错误" );
							continue;
						}
					}
					//如果是拒绝接收文件
					if( s1.equals( "REJECT" ) ) {
						try
						{
							String dest = s2;
							String source   = st.nextToken();							
						
							sThread.sFrm.appendSystemMsg ( source + "拒绝了" + dest + "发送文件的要求\n" );

							synchronized( sThread.messages ) {					
								sThread.messages.add( s );
							}
							continue;
						}
						catch ( NoSuchElementException e )
						{
							JOptionPane.showMessageDialog( sThread.sFrm, "文件传送消息格式错误" );
							continue;
						}
					}
					//如果是中断文件传输
					if( s1.equals( "INTERRUPT" ) ) {
						try
						{
							String dest = s2;
							String source   = st.nextToken();							
						
							sThread.sFrm.appendSystemMsg ( source + "中断了与" + dest + "的文件传输\n" );

							synchronized( sThread.messages ) {					
								sThread.messages.add( s );
							}
							continue;
						}
						catch ( NoSuchElementException e )
						{
							JOptionPane.showMessageDialog( sThread.sFrm, "文件传送消息格式错误" );
							continue;
						}
					}
					//如果是文件传送完毕
					if( s1.equals( "SUCCESS" ) ) {
						try
						{
							String dest = s2;
							String source   = st.nextToken();							
						
							sThread.sFrm.appendSystemMsg ( source + "接受文件完毕\n" );

							synchronized( sThread.messages ) {					
								sThread.messages.add( s );
							}
							continue;
						}
						catch ( NoSuchElementException e )
						{
							JOptionPane.showMessageDialog( sThread.sFrm, "文件传送消息格式错误" );
							continue;
						}
					}
					//如果是悄悄话
					if( s1.equals( "TALK" ) ) {
						try
						{
							String source = st.nextToken();
							s3 = s.substring( s1.length() + s2.length() + source.length() + 3, s.length() );
							
							sThread.sFrm.appendPersonalChatMsg ( source, s2, s3 + "\n" );

							synchronized( sThread.messages ) {					
								sThread.messages.add( s );
							}

							continue;
						}
						catch ( IndexOutOfBoundsException e )
						{
							JOptionPane.showMessageDialog( sThread.sFrm, "悄悄话parse越界" );
							continue;
						}
						catch ( NoSuchElementException e )
						{
							JOptionPane.showMessageDialog( sThread.sFrm, "悄悄话格式错误" );
							continue;
						}
					}
					//如果是聊天的消息直接放入队列,否则在上面处理后放入								
					sThread.sFrm.appendChatMsg( s1 + "\n" , s3 + "\n" );
									
					synchronized( sThread.messages ) {					
						sThread.messages.add( s );
					}


				}
				catch ( NoSuchElementException er )
				{
					JOptionPane.showMessageDialog( sThread.sFrm, "客户端发送消息格式错误" );
					continue;
				}

			}
			catch ( IOException e )
			{
				e.printStackTrace();
				JOptionPane.showMessageDialog( sThread.sFrm, "接收IO异常" );
				continue;
			}			
		}
	}

	public void dispose()
	{
		sThread = null;
		dSkt.close();
		dSkt = null;
		buffer = null;
	}

	public static String byteToString( byte[] buffer )
	{
		int i;
		for( i = 0; i < buffer.length; i ++ )
			if( buffer[ i ] == 0 )break;
		return new String( buffer, 0, i );
	}
}

⌨️ 快捷键说明

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