亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? client.java.bak

?? java聊天室服務(wù)器
?? BAK
?? 第 1 頁 / 共 2 頁
字號:
package XXRoom;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.List;
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;
import javax.swing.event.*;
import javax.swing.text.*;
import java.net.*;
import java.io.*;
import java.util.*;

public class Client extends JFrame implements Runnable
{	
	JLabel label1;
	JLabel label2;
	JTextField ip;
	JTextField port;
	JButton    connect;
	JButton    quit;

	JTextPane  tp;
	JTextPane  ptp;
	JTextField tf;
	JButton    send;
	JScrollPane jsp;
	JScrollPane pjsp;
	AbstractDocument doc;
	AbstractDocument pdoc;
	SimpleAttributeSet sacBlue;
	SimpleAttributeSet sacRed;
	SimpleAttributeSet sacBlack;

	JButton   file;//傳送文件
	JButton   ok;  //接收文件
	JButton   cancel;//拒絕或者取消文件傳送
	
	JLabel    fileCondition;
	JCheckBox isPersonal;	

	JTable    friends;

	JPanel    link;
	JPanel    chat;
	JPanel    say;

	JPopupMenu     menu;
	JMenuItem clear;

	Socket    skt;
	DatagramSocket dSkt;
	BufferedReader read;
	PrintStream   write;
	//服務(wù)器的UDP端口
	int serverUDPPort;
	String nickName;

	Thread cThread;

	NickNameDlg nickNameDlg;	

	boolean isFileTrans;
	//傳送文件線程
	FileThread ft;	

	public Client()
	{
		super( "XX聊天室" );
		
		nickName = "XX聊天室";

		initComponent();
	
		addListeners();

		reLocate();		

		cThread = null;
		nickNameDlg = new NickNameDlg( this );

		isFileTrans = false;
	}	

	private void initComponent()
	{
		label1 = new JLabel( "服務(wù)器IP" );
		label2 = new JLabel( "端口" );
		ip = new JTextField( 16 );
		port = new JTextField( 4 );
		connect = new JButton( "連接" );
		quit   = new JButton( "退出聊天室" );
		quit.setEnabled( false );

		tp = new JTextPane( );		
		tp.setEditable( false );
		ptp = new JTextPane();
		ptp.setEditable( false );

		tf = new JTextField( 40 );
		send = new JButton( "發(fā)送" );
		tf.setEditable( false );
		send.setEnabled( false );

		file = new JButton();
		ok   = new JButton();
		cancel = new JButton();
		file.setToolTipText( "文件傳送" );
		ok.setToolTipText( "接收" );
		cancel.setToolTipText( "取消" );
		isPersonal = new JCheckBox( "悄悄話" );		
		isPersonal.setBackground( Color.white );
		
		ImageIcon img = createImageIcon( "XXRoom/images/file.png" );
		if( img != null )
			file.setIcon( img );
		else
			file.setText( "傳送文件" );
		img = createImageIcon( "XXRoom/images/ok.png" );
		if( img != null )
			ok.setIcon( img );
		else
			ok.setText( "接收" );
		img = createImageIcon( "XXRoom/images/cancel.png" );
		if( img != null )
			cancel.setIcon( img );
		else
			cancel.setText( "取消" );		
		
		ok.setBackground( Color.white );
		cancel.setBackground( Color.white );
		file.setBackground( Color.white );
		file.setBorder( null );
		ok.setBorder( null );
		cancel.setBorder( null );
		file.setEnabled( false );
		ok.setEnabled( false );
		cancel.setEnabled( false );
		fileCondition = new JLabel( "等待傳送文件" );
		fileCondition.setBackground( Color.white );		
	
		
		
		friends = new JTable( new FriendsTableModel() );		
		friends.setPreferredScrollableViewportSize( new Dimension( 100, 400 ) );
		//令table單選
		friends.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
		link = new JPanel( new FlowLayout() );
		chat = new JPanel( new BorderLayout() );
		say  = new JPanel( new FlowLayout() );

		link.add( label1 );
		link.add( ip );
		link.add( label2 );
		link.add( port );
		link.add( connect );
		link.add( quit );
		
		jsp = new JScrollPane( tp );
		jsp.setPreferredSize( new Dimension( 100, 300 ) );
		pjsp = new JScrollPane ( ptp );
		pjsp.setPreferredSize( new Dimension( 100, 100 ) );
		JSplitPane sp = new JSplitPane( JSplitPane.VERTICAL_SPLIT, jsp, pjsp );
		sp.setOneTouchExpandable( true );
		
		chat.add( sp, BorderLayout.NORTH);	
		JPanel jp2 = new JPanel();
		jp2.setPreferredSize( new Dimension( 100, 25 ) );
		jp2.setLayout( null );//取消默認布局管理器
		jp2.setBackground( Color.white );		
		jp2.add( file );
		jp2.add( ok );
		jp2.add( cancel );
		jp2.add( fileCondition );
		jp2.add( isPersonal );
		file.setBounds( 0, 0, 25, 25 );
		ok.setBounds( 30, 0, 25, 25 );
		cancel.setBounds( 60, 0, 25, 25 );
		fileCondition.setBounds( 100, 0, 300, 25 );
		isPersonal.setBounds( 400, 0, 75, 25 );
		chat.add( jp2, BorderLayout.CENTER );
		JPanel jp1 = new JPanel();
		jp1.add( tf );
		jp1.add( send );
		chat.add( jp1, BorderLayout.SOUTH );
		

		getContentPane().add( link, BorderLayout.NORTH );
		getContentPane().add( chat, BorderLayout.CENTER );
		getContentPane().add( new JScrollPane( friends ), BorderLayout.EAST );
		
		menu = new JPopupMenu();
		clear = new JMenuItem( "Clear" );
		menu.add( clear );

		StyledDocument sd = tp.getStyledDocument();
		if( sd instanceof AbstractDocument ) {
			doc = (AbstractDocument) sd;
		}
		else {
			System.err.println( "can't cast to AbstractDocument" );
			System.exit( 0 );
		}
		sd = ptp.getStyledDocument();
		if( sd instanceof AbstractDocument ) {
			pdoc = (AbstractDocument) sd;
		}
		else {
			System.err.println( "can't cast to AbstractDocument" );
			System.exit( 0 );
		}
		sacBlue = new SimpleAttributeSet();
		StyleConstants.setForeground( sacBlue, Color.blue );
		sacRed = new SimpleAttributeSet();
		StyleConstants.setForeground( sacRed, Color.red );
		sacBlack = new SimpleAttributeSet();
		StyleConstants.setForeground( sacBlack, Color.black );
	}
	
	public ImageIcon createImageIcon( String s ) {			
			URL url =  Client.class.getResource( s ) ;
			if( url == null )
				return null;
			ImageIcon img = new ImageIcon( url );
			
			return img;
	}

	public void addListeners()
	{
		//連接服務(wù)器
		connect.addActionListener( new ActionListener() {
			public void actionPerformed( ActionEvent e ) {
				try
				{
					String address = ip.getText();
					int    p       = Integer.parseInt( port.getText() );
					try					
					{
						skt = new Socket( address, p );
						read = new BufferedReader( new InputStreamReader( skt.getInputStream() ) );						
						write = new PrintStream( skt.getOutputStream() );	
						//開始等待聯(lián)機線程
						cThread = new Thread( Client.this );						
						cThread.start();
					}
					catch( UnknownHostException err )
					{
						JOptionPane.showMessageDialog( Client.this, "不正確的地址或端口號,請重新輸入" );
						return;
					}
					catch( IOException err )
					{
						JOptionPane.showMessageDialog( Client.this, "不正確的地址或端口號,請重新輸入" );
						return;
					}
					//初始化UDP端口
					int i = 1000;
					while( true )
					{
						try
						{
							dSkt = new DatagramSocket( i );
							break;
						}
						catch ( SocketException er )
						{
							++ i;
						}
					}

				//	JOptionPane.showMessageDialog( Client.this, "聯(lián)機成功" );
					//取得用戶昵稱
					getNickName();					
					
				}
				catch ( NumberFormatException er )
				{
					JOptionPane.showMessageDialog( Client.this, "數(shù)字格式不正確, 請重新輸入" );
					return;
				}
			}			
		});

		quit.addActionListener( new ActionListener() {
			public void actionPerformed( ActionEvent e ) {
				//發(fā)送QUIT消息,收到服務(wù)器確認后調(diào)用leave
				sendMessage( "QUIT: " + nickName );
				leave();
			}
		});
		
		this.addWindowListener( new WindowAdapter() {
			public void windowClosing( WindowEvent e ) {
				if( cThread != null ) {
					sendMessage( "QUIT: " + nickName );
					leave();
				}
				System.exit( 0 );
			}
		});
		//先判斷是不是悄悄話
		send.addActionListener( new ActionListener() {
			public void actionPerformed( ActionEvent e ) {
				//發(fā)送消息
				String s = tf.getText();				

				if( s.length() >= 100 ) {
					appendPersonalSystemMsg( "超出消息長度限制" );
					return;
				}

				if( s.length() != 0 ) {
					if( ! isPersonal.isSelected() )
						sendMessage( nickName + ": " + s );
					else {
						int i = friends.getSelectedRow();
						if( i == -1 ) {
							//沒有選中任何用戶
							appendPersonalSystemMsg( "請先選中一位好友\n" );
							return;
						}
						else {
							//選中了一位好友
							String name = (String) friends.getValueAt( i , 0 );
							sendMessage( "TALK " + name + " " + nickName + " " + s );
						}
					}
				}
				tf.setText( "" );
			}
		});
		//先判斷是不是悄悄話
		tf.addActionListener( new ActionListener() { 
			public void actionPerformed( ActionEvent e ) {
				//發(fā)送消息
				String s = tf.getText();		
				
				if( s.length() >= 100 ) {
					appendPersonalSystemMsg( "超出消息長度限制" );
					return;
				}

				if( s.length() != 0 ) {
					if( ! isPersonal.isSelected() )
						sendMessage( nickName + ": " + s );
					else {
						int i = friends.getSelectedRow();
						if( i == -1 ) {
							//沒有選中任何用戶
							appendPersonalSystemMsg( "請先選中一位好友\n" );
							return;
						}
						else {
							//選中了一位好友
							String name = (String) friends.getValueAt( i , 0 );
							sendMessage( "TALK " + name + " " + nickName + " " + s );
						}
					}
				}
				tf.setText( "" );
			}
		});

		tp.addMouseListener( new MouseAdapter() {
			public void mouseReleased( MouseEvent e ) {
				if( e.isPopupTrigger() ) {
					menu.show( e.getComponent(), e.getX(), e.getY() );
				}
			}
		});

		clear.addActionListener( new ActionListener() {
			public void actionPerformed( ActionEvent e ) {
				try
				{
					doc.remove( 0, doc.getLength() );
				}
				catch ( BadLocationException er )
				{
					er.printStackTrace();
				}
			}
		});
		
		friends.getSelectionModel().addListSelectionListener( new ListSelectionListener() {
			public void valueChanged( ListSelectionEvent e ) {
				if( e.getValueIsAdjusting() )
					return;
				ListSelectionModel lsm = (ListSelectionModel)e.getSource();
				if( lsm.isSelectionEmpty() )
					file.setEnabled( false );
				else
					if( ! isFileTrans )
					file.setEnabled( true );
			}
		});

		//發(fā)送文件
		file.addActionListener( new ActionListener() {
			public void actionPerformed( ActionEvent e ) {
				JFileChooser jfc = new JFileChooser( "." );
				jfc.setMultiSelectionEnabled( false );
				int result = jfc.showOpenDialog( Client.this );
				if( result == JFileChooser.APPROVE_OPTION ) {
					File file = jfc.getSelectedFile();
			//		JOptionPane.showMessageDialog( Client.this, file.getPath() );

					int i = friends.getSelectedRow();
					String s = (String)friends.getValueAt( i, 0 );

					//啟動發(fā)送文件線程
					ft = new FileSendThread( Client.this, file.getPath() , s );
					((FileSendThread)ft).start();

					
					try
					{
						sendMessage( "FILE " + s + " " + nickName + " " + InetAddress.getLocalHost().getHostAddress() 
						+ " " + ((FileSendThread)ft).sSkt.getLocalPort() + " " + file.length()
						+ " " + file.getName() ); 
			//			JOptionPane.showMessageDialog( Client.this, "等待對方回應(yīng)" );
					}
					catch ( UnknownHostException er )
					{
						JOptionPane.showMessageDialog( Client.this, "無法解析本機地址" );
						ft = null;
					}					
				}
			}
		});
		//取消文件傳送
		cancel.addActionListener( new ActionListener() {
			public void actionPerformed ( ActionEvent e ) {
				if( ft.getClass() == FileReceiveThread.class ) {
					((FileReceiveThread)ft).stop();
					ft.dispose();
					sendMessage( "INTERRUPT " + ((FileReceiveThread)ft).name + " " + nickName );
				}
				if( ft.getClass() == FileSendThread.class ) {
					((FileSendThread)ft).stop();
					ft.dispose();
					sendMessage( "INTERRUPT " + ((FileSendThread)ft).name + " " + nickName );
				}
			}
		});
	}

	private void reLocate()
	{
		setResizable( false );
		pack();
		//重新設(shè)定窗口位置
		int screenWidth = getToolkit().getScreenSize().width;
		int screenHeight = getToolkit().getScreenSize().height;		
		setLocation( screenWidth/2 - getSize().width/2, screenHeight/2 - getSize().height/2 );		
	}

	public void leave()
	{
		//刪除好友列表

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人夜色高潮福利影视| 色综合久久久网| 日韩精品成人一区二区三区| 日韩精品乱码免费| 宅男噜噜噜66一区二区66| 久久青草国产手机看片福利盒子| 国产精品美女www爽爽爽| 亚洲精品视频自拍| 精品一区二区在线视频| av网站免费线看精品| 欧美日韩精品高清| 中文字幕欧美日本乱码一线二线| 亚洲精品国产成人久久av盗摄| 91久久精品日日躁夜夜躁欧美| 26uuu国产一区二区三区| 亚洲电影在线免费观看| 成人性视频免费网站| 日韩免费视频一区二区| 亚洲伊人色欲综合网| 成人激情开心网| 久久久精品一品道一区| 97久久超碰国产精品| 中文字幕乱码日本亚洲一区二区 | 欧美亚洲国产怡红院影院| 久久一夜天堂av一区二区三区| 国产精品亚洲综合一区在线观看| 正在播放一区二区| 国产精品一区二区91| 亚洲人成网站影音先锋播放| 成人av网站免费观看| 亚洲国产精品自拍| 久久久不卡网国产精品二区| 欧美亚洲国产怡红院影院| 国产在线麻豆精品观看| 精品久久久久av影院| 蜜臀91精品一区二区三区| 欧美日韩一区不卡| 亚洲图片自拍偷拍| 国产欧美精品区一区二区三区| 久久精品理论片| 欧美一区二区三区四区五区| 婷婷开心激情综合| 欧美人狂配大交3d怪物一区| 一本色道a无线码一区v| 欧美网站一区二区| 国产一级精品在线| 欧美一区二区三区成人| 丁香婷婷综合色啪| 日本一区二区久久| 欧洲一区在线电影| 奇米在线7777在线精品| 欧美一区二区三区日韩| 91在线看国产| 国产成人亚洲综合色影视| 美女网站一区二区| 国产福利一区二区三区在线视频| 偷拍亚洲欧洲综合| 亚洲人成网站影音先锋播放| 亚洲国产精品成人综合| 久久色在线视频| 91精品国产综合久久久蜜臀粉嫩| 色婷婷av一区| 99精品久久免费看蜜臀剧情介绍| 国产精品中文字幕一区二区三区| 免费在线看一区| 热久久免费视频| 成人激情校园春色| 日韩精品一区二区三区在线播放| 91在线观看下载| 欧美电影免费观看高清完整版 | 波波电影院一区二区三区| 久久99最新地址| 麻豆精品视频在线观看视频| 三级影片在线观看欧美日韩一区二区| 亚洲一区二区三区在线播放| 国产精品久久久久久久久免费桃花 | 91免费国产在线观看| 国产成人精品午夜视频免费| 久久狠狠亚洲综合| 久久99精品久久久久久动态图| 久久99精品国产麻豆婷婷| 久久精品国产99国产| 久久成人免费网| 精品中文字幕一区二区小辣椒| 久久不见久久见中文字幕免费| 美日韩黄色大片| 国产一区中文字幕| 国产精品亚洲专一区二区三区| 国产真实精品久久二三区| 奇米色一区二区三区四区| 国产精品中文字幕日韩精品| 亚洲综合一区二区精品导航| 亚洲精品视频免费观看| 亚洲免费av网站| 亚洲国产美国国产综合一区二区| 亚洲午夜电影网| 毛片一区二区三区| 国产一区二区影院| 99久久久久免费精品国产| 91国在线观看| 91精品国产91久久综合桃花| 久久综合网色—综合色88| 国产精品日韩精品欧美在线| 亚洲另类在线制服丝袜| 日韩电影一区二区三区四区| 久久超碰97中文字幕| 激情深爱一区二区| aaa亚洲精品一二三区| 色综合视频一区二区三区高清| 欧美日韩高清一区二区不卡| 日韩免费高清av| 国产精品免费视频观看| 亚洲一卡二卡三卡四卡五卡| 久久国产综合精品| 91老司机福利 在线| 欧美一区二区免费观在线| 国产午夜精品美女毛片视频| 亚洲九九爱视频| 亚洲精品一卡二卡| 久久国内精品自在自线400部| 波多野结衣的一区二区三区| 欧美人动与zoxxxx乱| 久久久久久影视| 亚洲sss视频在线视频| 亚洲女人的天堂| 蜜桃视频免费观看一区| 99精品偷自拍| 2020日本不卡一区二区视频| 亚洲国产精品一区二区久久恐怖片 | 国产激情91久久精品导航| 日本乱人伦一区| 国产欧美一区二区精品性色超碰| 亚洲成av人**亚洲成av**| 成人激情图片网| 精品福利在线导航| 精品国产百合女同互慰| 一区二区三区在线高清| 亚洲第一福利一区| 国产91在线|亚洲| 日韩视频永久免费| 久久男人中文字幕资源站| 亚洲小说春色综合另类电影| 国产精品99久久久久久似苏梦涵 | 国产精品 日产精品 欧美精品| 欧美婷婷六月丁香综合色| 国产精品国产精品国产专区不片| 裸体一区二区三区| 精品污污网站免费看| 亚洲欧洲日本在线| 水蜜桃久久夜色精品一区的特点| 成人黄色大片在线观看| 久久中文字幕电影| 日本亚洲免费观看| 欧美美女一区二区三区| 日韩欧美久久一区| 偷偷要91色婷婷| 欧美美女喷水视频| 亚洲一区二区在线视频| 91同城在线观看| 国产精品国产自产拍高清av王其| 久久精品国产在热久久| 91精品国产综合久久久久久| 亚洲国产视频直播| 欧美亚洲一区二区在线观看| 亚洲黄色片在线观看| 91香蕉视频污| 亚洲美女淫视频| 欧美午夜免费电影| 亚洲国产日韩在线一区模特| 在线观看日韩国产| 亚洲aⅴ怡春院| 91精品国产综合久久福利软件| 三级欧美在线一区| 欧美成人a∨高清免费观看| 美女在线视频一区| 欧美精品一区二区三区蜜桃 | 91精品国产91久久久久久一区二区 | 亚洲免费在线观看视频| 91成人在线观看喷潮| 亚洲h在线观看| 日韩视频免费观看高清完整版在线观看 | 欧美视频一区在线观看| 亚洲国产日韩综合久久精品| 51精品久久久久久久蜜臀| 蜜桃视频一区二区三区| 26uuu国产在线精品一区二区| 国产精品自拍在线| 一区二区中文字幕在线| 91国产丝袜在线播放| 亚洲成a人片在线不卡一二三区| 在线电影一区二区三区| 老汉av免费一区二区三区| 久久综合九色综合欧美亚洲| 成人精品视频.| 亚洲最大的成人av| 日韩一二三四区| 懂色av中文一区二区三区| 亚洲免费在线观看| 日韩无一区二区| www.亚洲色图|