📄 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 + -