?? listenthread.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 + -