receivingthread.java

来自「本系统实现在几台计算机屏幕上连贯地显示一条鱼游动大动画.」· Java 代码 · 共 79 行

JAVA
79
字号
//ReceivingThread是一个线程,它负责监听特定客户端的消息并且把消息发到一个MessageListener.
package fish.server;

import java.io.*;
import java.net.*;
import java.util.StringTokenizer;

import fish.*;

public class ReceivingThread extends Thread {
	private BufferedReader input;
	private MessageListener messageListener;
	private boolean keepListening = true;

	public ReceivingThread(MessageListener listener,Socket socket) {
		super("ReceivingThread: " + socket);
		//设置消息应该被发到的listener 
		messageListener = listener;
   
		try {         
			//设置Timeout
			socket.setSoTimeout( 5000 );
			input = new BufferedReader( 
					new InputStreamReader(socket.getInputStream()));
			}
		catch (IOException ex) {
			ex.printStackTrace();
			}
		} 
	// 监听新消息并且把他们发送到MessageListener
	public void run() 
	{    
		String message;
		while ( keepListening ) {   
			try {            
				message = input.readLine();
				System.out.println(message);
				}
			//如果过了规定时间则处理如下异常
			catch ( InterruptedIOException ex ) {
				//继续下一次的监听
				continue;
				}
			//如果读失败则处理如下异常
			catch ( IOException ex ) {
				//退出循环
				ex.printStackTrace();            
				break;
				}
			if (message != null) {
				StringTokenizer tokenizer = new StringTokenizer( 
						message, FishConstants.MESSAGE_SEPARATOR );             
				if (tokenizer.countTokens() == 2) {
					//把消息发送到MessageListener
					messageListener.messageReceived(tokenizer.nextToken(),   //客户端ID
							tokenizer.nextToken() ); //消息
					}
				else
					if ( message.equalsIgnoreCase( 
							FishConstants.MESSAGE_SEPARATOR +
							FishConstants.DISCONNECT_STRING ) ) 
						stopListening();
				} 
			} 
		try {         
			input.close();      
			}
		catch ( IOException ioException ) {
			ioException.printStackTrace();     
			}       
		} 

	public void stopListening() {
		keepListening = false;
		}
	
}

⌨️ 快捷键说明

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