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

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

?? client.java

?? java聊天室服務(wù)器
?? JAVA
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
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 );//取消默認(rèn)布局管理器
		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 ) {			
			
			ImageIcon img = new ImageIcon( s );
			
			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() );	
						//開(kāi)始等待聯(lián)機(jī)線程
						cThread = new Thread( Client.this );						
						cThread.start();
					}
					catch( UnknownHostException err )
					{
						JOptionPane.showMessageDialog( Client.this, "不正確的地址或端口號(hào),請(qǐng)重新輸入" );
						return;
					}
					catch( IOException err )
					{
						JOptionPane.showMessageDialog( Client.this, "不正確的地址或端口號(hào),請(qǐng)重新輸入" );
						return;
					}
					//初始化UDP端口
					int i = 1000;
					while( true )
					{
						try
						{
							dSkt = new DatagramSocket( i );
							break;
						}
						catch ( SocketException er )
						{
							++ i;
						}
					}

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

		quit.addActionListener( new ActionListener() {
			public void actionPerformed( ActionEvent e ) {
				//發(fā)送QUIT消息,收到服務(wù)器確認(rèn)后調(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( "超出消息長(zhǎng)度限制" );
					return;
				}

				if( s.length() != 0 ) {
					if( ! isPersonal.isSelected() )
						sendMessage( nickName + ": " + s );
					else {
						int i = friends.getSelectedRow();
						if( i == -1 ) {
							//沒(méi)有選中任何用戶
							appendPersonalSystemMsg( "請(qǐng)先選中一位好友\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( "超出消息長(zhǎng)度限制" );
					return;
				}

				if( s.length() != 0 ) {
					if( ! isPersonal.isSelected() )
						sendMessage( nickName + ": " + s );
					else {
						int i = friends.getSelectedRow();
						if( i == -1 ) {
							//沒(méi)有選中任何用戶
							appendPersonalSystemMsg( "請(qǐng)先選中一位好友\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 );

					//啟動(dòng)發(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, "等待對(duì)方回應(yīng)" );
					}
					catch ( UnknownHostException er )
					{
						JOptionPane.showMessageDialog( Client.this, "無(wú)法解析本機(jī)地址" );
						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()
	{
		//刪除好友列表
		removeAllFriends();

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
香蕉加勒比综合久久 | 国产综合一区二区| 蜜臀a∨国产成人精品| 久久99国产精品尤物| 国内精品视频一区二区三区八戒| 日韩电影免费在线观看网站| 免费久久99精品国产| 九色porny丨国产精品| 福利电影一区二区| 日本丰满少妇一区二区三区| 在线不卡中文字幕播放| 日韩精品一区二| 国产精品久久久久久一区二区三区 | 成人精品视频.| av电影天堂一区二区在线观看| 色综合久久久久网| 久久久久国产一区二区三区四区| 欧美激情一区在线| 一区二区不卡在线播放| 久久国产成人午夜av影院| 国产成人av网站| 在线观看亚洲精品| 日韩欧美黄色影院| 亚洲精品少妇30p| 国产资源在线一区| 欧美日韩国产影片| 国产精品久久久久久亚洲伦| 精品一区二区三区在线观看| 91视视频在线直接观看在线看网页在线看| 777xxx欧美| 亚洲欧美电影院| 成人永久看片免费视频天堂| 欧美成人a∨高清免费观看| 亚洲蜜臀av乱码久久精品蜜桃| 国产一区视频在线看| 欧美性一二三区| 亚洲老司机在线| 懂色av一区二区夜夜嗨| 精品国产电影一区二区| 日韩精品乱码免费| 日本韩国精品在线| 国产精品的网站| 波多野结衣中文字幕一区| 日本一区二区免费在线观看视频| 蜜臂av日日欢夜夜爽一区| 7777精品伊人久久久大香线蕉完整版 | 97久久超碰国产精品| 国产精品乱子久久久久| 国产v综合v亚洲欧| 国产精品丝袜一区| 91色婷婷久久久久合中文| 亚洲色图20p| 欧美在线不卡视频| 天天综合网天天综合色| 欧美一区二区三区的| 久久电影国产免费久久电影| 26uuu亚洲婷婷狠狠天堂| 国产精品99久久久久久久女警| 久久久久久久电影| a亚洲天堂av| 午夜精品久久一牛影视| 日韩午夜电影在线观看| 丁香桃色午夜亚洲一区二区三区| 中文字幕色av一区二区三区| 欧美午夜一区二区三区| 免费观看一级欧美片| 国产精品青草久久| 欧美精品欧美精品系列| 成人午夜激情片| 日本不卡免费在线视频| 国产精品情趣视频| 日韩欧美成人一区| 在线免费观看不卡av| 国产不卡视频一区二区三区| 亚洲综合精品自拍| 国产精品拍天天在线| 9191精品国产综合久久久久久| 国产不卡在线一区| 久久不见久久见免费视频7 | 在线成人午夜影院| eeuss鲁一区二区三区| 美腿丝袜一区二区三区| 亚洲精品国产品国语在线app| 日韩三区在线观看| 欧美日高清视频| 91蝌蚪porny九色| 丰满少妇久久久久久久| 免费看黄色91| 美国毛片一区二区三区| 午夜婷婷国产麻豆精品| 一区二区三区中文免费| 成人欧美一区二区三区黑人麻豆| 久久九九全国免费| 精品国产99国产精品| 欧美一区二区三区免费观看视频| 91麻豆精品久久久久蜜臀| 91在线国内视频| 国产91精品免费| 国产a视频精品免费观看| 国产精品一区免费视频| 韩国一区二区三区| 国产精品99久久久| 精品一区二区日韩| 国产一区999| 国产成人精品一区二| 国产成人亚洲综合a∨婷婷| 久久69国产一区二区蜜臀| 久久不见久久见中文字幕免费| 免费观看一级欧美片| 久久精品国产成人一区二区三区 | 日本一区免费视频| 国产精品久久久久四虎| 亚洲美女视频一区| 一区二区三区日韩精品| 日韩精品亚洲一区二区三区免费| 欧美成va人片在线观看| 久久色中文字幕| 亚洲视频在线一区二区| 日本欧美韩国一区三区| 国产成人在线视频网站| 91在线视频免费观看| 欧美r级电影在线观看| 国产精品女人毛片| 日韩精品成人一区二区在线| 国产不卡在线一区| 欧美亚男人的天堂| 国产精品免费久久| 日韩精品亚洲一区二区三区免费| 国产成人一区二区精品非洲| 欧美色图天堂网| 国产精品青草久久| 久久国产精品99精品国产 | 久久国产生活片100| 91行情网站电视在线观看高清版| 91.xcao| 亚洲精品中文字幕乱码三区| 久久精品国产网站| 日本道色综合久久| 中文字幕一区二区三区在线播放 | 丝袜脚交一区二区| 99久精品国产| 久久久久久久久免费| 日韩av网站在线观看| 色婷婷综合久久久| 欧美国产一区视频在线观看| 韩国精品主播一区二区在线观看| 欧美在线你懂得| 亚洲小少妇裸体bbw| 色综合久久久网| 亚洲免费观看高清完整版在线| 不卡的av电影| 国产精品视频一二| 99国产精品久久久久| 国产欧美va欧美不卡在线| 韩国女主播一区| 国产精品网站在线观看| 国产精品88av| 中文字幕亚洲不卡| 在线一区二区三区四区五区| 亚洲色图欧洲色图婷婷| av电影在线观看不卡| 一区二区三区自拍| 在线播放一区二区三区| 麻豆国产精品一区二区三区| 欧美tickling网站挠脚心| 韩国女主播一区二区三区| 国产亚洲成年网址在线观看| 国产精品亚洲一区二区三区在线 | 91精品国产综合久久久久久久| 美国十次综合导航| 国产女人aaa级久久久级| 色婷婷综合五月| 免费一级片91| 国产精品成人在线观看| 欧美自拍偷拍一区| 蜜臂av日日欢夜夜爽一区| 久久久影视传媒| 欧美日韩中文字幕一区二区| 久久综合综合久久综合| 中文字幕av一区 二区| 在线欧美日韩国产| 色国产精品一区在线观看| 天堂午夜影视日韩欧美一区二区| 福利电影一区二区三区| www一区二区| 国产在线观看一区二区| 久久久91精品国产一区二区精品| 亚洲超丰满肉感bbw| 欧美日韩国产三级| 精品亚洲成a人| 色综合久久久久| 日本在线不卡视频一二三区| 国产精品美女久久久久久久久久久 | 欧美丝袜自拍制服另类| 极品少妇xxxx偷拍精品少妇| 五月天激情综合网| 亚洲视频免费在线观看| 国产欧美视频一区二区三区| 欧美精品成人一区二区三区四区| 不卡的电影网站|