?? client.java
字號:
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import java.util.Calendar;
import javax.swing.*;
public class Client extends Frame implements ActionListener{
private boolean login = false;
private Color backGround = new Color(255, 255, 255);
private String rightNow;
private InetAddress clientAddress;
private Socket connection;
private DataInputStream in;
private DataOutputStream out;
private recThread receiver;
private Button loginButton = new Button("登陸");
private Button logoutButton = new Button("退出");
private Button sendButton = new Button("發送");
private Label userName = new Label("用戶名:");
private TextField getUserName = new TextField(); // 獲取用戶名
private Label serverIP = new Label("服務器IP:");
private TextField getServerIP = new TextField(); // 獲取服務器 IP 地址
private Label serverPort = new Label("服務器端口:");
private TextField getServerPort = new TextField(); // 獲取服務器端口
private Label inputTitle=new Label("想對大家說:");
private TextArea input = new TextArea(); // 輸入文本框
private Label outputTitle=new Label("點滴心語:");
private TextArea output = new TextArea(); // 輸出文本框
private Label user = new Label("在線好友(0)");
private List userList = new List();
// 用于接收服務器消息的線程類
private class recThread extends Thread
{
public recThread()
{
start();
}
public void run()
{
try{
while(login){
String line = in.readUTF();
rightNow = Calendar.getInstance().getTime().toLocaleString();
if(line.charAt(0) == 'Q'){
if(line.length() == 1){
// 退出
connection.close();
rightNow = Calendar.getInstance().getTime().toLocaleString();
output.append(rightNow+"\n!!!成功退出.\n\n");
login = false;
userList.clear();
getUserName.setEditable(true);
getServerIP.setEditable(true);
getServerPort.setEditable(true);
loginButton.setEnabled(true);
sendButton.setEnabled(false);
logoutButton.setEnabled(false);
break;
}
else{
// 其他用戶退出
userList.remove(line.substring(2));
user.setText("User ("+userList.getItemCount()+")");
output.append(rightNow+"\n"+"!!!很遺憾:"+line.substring(2)+"剛剛下線.\n\n");
}
}
else if(line.charAt(0) == 'L'){
// 其他用戶登錄
userList.add(line.substring(2));
user.setText("User ("+userList.getItemCount()+")");
output.append(rightNow+"\n"+"!!!好消息: "+line.substring(2)+" 剛剛上線.\n\n");
}
else{
output.append(rightNow+"\n"+line+"\n\n");
}
}
}catch(SocketException se){
rightNow = Calendar.getInstance().getTime().toLocaleString();
output.append(rightNow+"\n!!!警告:與服務器斷開連接.\n\n");
login = false;
userList.clear();
getUserName.setEditable(true);
getServerIP.setEditable(true);
getServerPort.setEditable(true);
loginButton.setEnabled(true);
sendButton.setEnabled(false);
logoutButton.setEnabled(false);
}catch (IOException ioe){
output.append("Error: "+ioe+"\n\n");
}
}
}
// 響應關閉按鈕的內部類
private class WindowCloser extends WindowAdapter
{
public void windowClosing(WindowEvent we)
{
System.exit(0);
}
}
//窗口布局
private void openWindow()
{
Font fb = new Font("Helvetica", Font.BOLD, 17);
Font fp = new Font("Courier", Font.PLAIN, 14);
Panel userNamePanel=new Panel();
userNamePanel.setLayout(new BorderLayout());
userNamePanel.add("West",userName);
userName.setBackground(backGround);
userName.setFont(fp);
userNamePanel.add("Center",getUserName);
getUserName.setBackground(backGround);
Panel serverIPPanel=new Panel();
serverIPPanel.setLayout(new BorderLayout());
serverIPPanel.add("West",serverIP);
serverIP.setBackground(backGround);
serverIP.setFont(fp);
serverIPPanel.add("Center",getServerIP);
getServerIP.setBackground(backGround);
Panel serverPortPanel=new Panel();
serverPortPanel.setLayout(new BorderLayout());
serverPortPanel.add("West",serverPort);
serverPort.setBackground(backGround);
serverPort.setFont(fp);
serverPortPanel.add("Center",getServerPort);
getServerPort.setBackground(backGround);
Panel logPanel=new Panel();
logPanel.setLayout(new GridLayout(1,2,5,5));
logPanel.add(loginButton);
loginButton.setBackground(new Color(192, 192, 192));
loginButton.setFont(fb);
logPanel.add(logoutButton);
logoutButton.setBackground(new Color(192, 192, 192));
logoutButton.setFont(fb);
Panel north = new Panel();
north.setLayout(new GridLayout(2,2,10,5));
north.add(serverIPPanel);
north.add(userNamePanel);
north.add(serverPortPanel);
north.add(logPanel);
Panel outputPanel = new Panel();
outputPanel.setLayout(new BorderLayout());
outputPanel.add("North",outputTitle);
outputTitle.setBackground(backGround);
outputTitle.setFont(fp);
outputPanel.add("Center",output);
output.setBackground(backGround);
Panel inputPanel = new Panel();
inputPanel.setLayout(new BorderLayout());
inputPanel.add("North",inputTitle);
inputTitle.setBackground(backGround);
inputTitle.setFont(fp);
inputPanel.add("Center",input);
input.setBackground(backGround);
Panel center = new Panel();
center.setLayout(new BorderLayout());
center.add("Center",outputPanel);
center.add("South",inputPanel);
Panel east = new Panel();
east.setLayout(new BorderLayout());
east.add("North", user);
user.setBackground(backGround);
user.setFont(fp);
east.add("Center", userList);
userList.setBackground(backGround);
Panel south = new Panel();
south.setLayout(new BorderLayout());
south.add("Center", sendButton);
sendButton.setBackground(new Color(192, 192, 192));
sendButton.setFont(fb);
setLayout(new BorderLayout());
add("North", north);
add("Center", center);
add("East", east);
add("South",south);
setBackground(backGround);
}
// 構造方法
public Client()throws UnknownHostException, IOException
{
super("多人聊天室客戶端 Client");
login = false;
clientAddress = InetAddress.getLocalHost();
byte[] ip = clientAddress.getAddress();
String strIP = (ip[0]&0xFF)+"."+(ip[1]&0xFF)+
"."+(ip[2]&0xFF)+"."+(ip[3]&0xFF);
getServerIP.setText(strIP);
getServerPort.setText("1234");
output.setEditable(false); // 輸出文本框設為只讀屬性
loginButton.addActionListener(this);
sendButton.addActionListener(this);
sendButton.setEnabled(false);
logoutButton.addActionListener(this);
logoutButton.setEnabled(false);
addWindowListener(new WindowCloser());
getUserName.setText("請在此處輸入您的名字");
openWindow();
pack();
setSize(500, 550);
show();
rightNow = Calendar.getInstance().getTime().toLocaleString();
output.append(rightNow+"\n多人聊天室客戶端歡迎您!"+"\n\n");
}
// 登錄
private void logIn()
{
if(login) return;
boolean accepted = false, refused = false;
String line= new String("");
try{
connection = new Socket(getServerIP.getText(),
Integer.parseInt(getServerPort.getText()));
in = new DataInputStream(connection.getInputStream());
out = new DataOutputStream(connection.getOutputStream());
out.writeUTF("L "+getUserName.getText());
while(!accepted && !refused){
line = in.readUTF();
if(line.charAt(0) == 'R'){
refused = true;
}
if(line.charAt(0) == 'A'){
accepted = true;
}
}
if(refused){
rightNow = Calendar.getInstance().getTime().toLocaleString();
output.append(rightNow+"\n!!!該用戶已經登錄,請換一個用戶名再試試.\n\n");
}
if(accepted){
rightNow = Calendar.getInstance().getTime().toLocaleString();
output.append(rightNow+"\n!!!登錄成功.\n\n");
login = true;
// 獲取當前在線用戶列表
String[] str = line.split(" ");
for (int i = 1; i < str.length; i ++){
userList.add(str [i]);
}
user.setText("在線好友 ("+userList.getItemCount()+")");
getUserName.setEditable(false);
getServerIP.setEditable(false);
getServerPort.setEditable(false);
loginButton.setEnabled(false);
sendButton.setEnabled(true);
logoutButton.setEnabled(true);
receiver = new recThread();
}
}catch(ConnectException ce){
rightNow = Calendar.getInstance().getTime().toLocaleString();
output.append(rightNow+"\n!!!警告:未找到服務器\n\n");
}catch(UnknownHostException uhe){
rightNow = Calendar.getInstance().getTime().toLocaleString();
output.append(rightNow+"\n!!!警告:未找到服務器\n\n");
}catch(IOException ioe){
output.append("Error: "+ioe+"\n\n");
}
}
// 發送消息
private void sendMsg()
{
if(!login) return;
try{
out.writeUTF("M "+input.getText());
input.setText("");
}catch (IOException ioe){
output.append("Error: "+ioe+"\n\n");
}
}
// 退出登錄
private void Quit()
{
if(!login) return;
try{
out.writeUTF("Q");
}catch (IOException ioe){
output.append("Error: "+ioe+"\n\n");
}
}
// 消息處理方法
public void actionPerformed(ActionEvent e)
{
if(e.getSource() == loginButton){
logIn();
}
if(e.getSource() == sendButton){
sendMsg();
}
if(e.getSource() == logoutButton){
Quit();
}
}
// 程序入口
public static void main(String args [])throws UnknownHostException, IOException
{
Client c = new Client();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -