1. 程式人生 > >2018.4.28 基於java的聊天系統(帶完善)

2018.4.28 基於java的聊天系統(帶完善)

group false com opera listen nec xtend imp 選擇

Java聊天系統

1.Socket類

Socket(InetAddress address, int port) 
創建一個流套接字並將其連接到指定 IP 地址的指定端口號。


Socket(String host, int port) 
創建一個流套接字並將其連接到指定主機上的指定端口號。


Socket(InetAddress address, int port, InetAddress localAddr, int localPort) 
創建一個套接字並將其連接到指定遠程地址上的指定遠程端口。


Socket(String host, int port, InetAddress localAddr, int localPort) 
創建一個套接字並將其連接到指定遠程主機上的指定遠程端口。




close() 
關閉此套接字。

connect(SocketAddress endpoint) 
將此套接字連接到服務器。

connect(SocketAddress endpoint, int timeout) 
將此套接字連接到服務器,並指定一個超時值。

getInetAddress() 
返回套接字連接的地址。

getInputStream() 
返回此套接字的輸入流。

getLocalPort() 
返回此套接字綁定到的本地端口。

getOutputStream() 
返回此套接字的輸出流。

getPort() 
返回此套接字連接到的遠程端口。

2.ServerSocket類

ServerSocket(int port) 
創建綁定到特定端口的服務器套接字。
accept() 
偵聽並接受到此套接字的連接。
getInetAddress() 
返回此服務器套接字的本地地址。

Socket編程步驟
服務器端創建ServerSocket對象,調用accept方法返回Socket對象
客戶端創建Socket對象,通過端口連接到服務器
客戶端、服務器端都使用Socket中的getInputStream方法和getOutputStream方法獲得輸入流和輸出流,進一步進行數據讀寫操作

(InetAddress用來描述主機地址;
Socket用來創建兩臺主機之間的連接;
ServerSocket用來偵聽來自客戶端的請求;
Socket通常稱作“套接字”,通常通過“套接字”向網絡發出請求或者應答網絡請求。)

3.實現的步驟:

   第一步: ChatUtil工具類:把一些常用的常量放進來

    第二步:Server開啟服務
    第三步:ClientSocket連接服務器的socket
    第四步:CHatFrame(添加兩個屬性(name,sex))2.添加了getSocket方法
    第五步:LoginFrame設置了默認值  處理性別獲得socket對象
package com.lanqiao.demo2;
/**
 * 工具類
 * @author qichunlin
 *
 */
public final class ChatUtil {
    //地址
    public static final String ADDRESS = "localhost";
    //端口
    public static final int PORT = 9999;
}
package com.lanqiao.demo2;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 服務端類
 * @author qichunlin
 */
public class Server {
    public static void main(String[] args) {
        try {
            ServerSocket ss = new ServerSocket(ChatUtil.PORT);
            int count = 0;
            while (true) {
                System.out.println("等待客戶端連接.......");
                Socket socket = ss.accept();
                count++;
                System.out.println("目前有"+count+"個客戶端進入了聊天室");
            }
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
package com.lanqiao.demo2;

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * 客戶端的socket
 * @author qichunlin
 *
 */
public class ClientSocket {
    public static Socket socket;
    public ClientSocket() {
        try {
            socket = new Socket(ChatUtil.ADDRESS, ChatUtil.PORT);
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
package com.lanqiao.demo2;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;

/**
 * 聊天系統的登錄界面
 * @authorqichunlin
 *
 */
public class LoginFrame extends JFrame implements ActionListener{
    //定義組件
    JLabel userLab,addrLab,portLab;//標簽
    JTextField userText,addrText,portText;//文本框
    JRadioButton radioMan,radioWoman,radioser;//單選按鈕
    ButtonGroup group ;//組
    JButton connectBut,closeBut;//按鈕
    //容器
    JPanel p1,p2,p3;
    
    public LoginFrame(){
        //實例化組件
        p1 = new JPanel();
        p1.setLayout(new FlowLayout(FlowLayout.LEFT));
        
        userLab = new JLabel("姓名:");
        userText = new JTextField(10);
        radioMan = new JRadioButton("男");
        radioMan.setSelected(true);
        radioWoman = new JRadioButton("女");
        radioser = new JRadioButton("保密"); 
        //把單選按鈕,添加到組中
        group = new ButtonGroup();
        group.add(radioMan);
        group.add(radioWoman);
        group.add(radioser);
        
        //往p1中,添加組件了(註意:組不需要添加到容器中)
        p1.add(userLab);
        p1.add(userText);
        p1.add(radioMan);
        p1.add(radioWoman);
        p1.add(radioser);
        
        
        p2 = new JPanel();
        p2.setLayout(new FlowLayout(FlowLayout.LEFT));
        addrLab = new JLabel("地址:");
        
        addrText = new JTextField(10);
        addrText.setText(ChatUtil.ADDRESS);
        
        portLab = new JLabel("端口:");
        portText = new JTextField(10);
        portText.setText(ChatUtil.PORT+"");
        
        //把組件添加到p2中
        p2.add(addrLab);
        p2.add(addrText);
        p2.add(portLab);
        p2.add(portText);
        
        
        p3 = new JPanel();
        p3.setLayout(new FlowLayout(FlowLayout.CENTER));
        
        connectBut =new JButton("連接");
        //綁定事件【點擊事件】
        connectBut.addActionListener(this);
        
        closeBut = new JButton("斷開");
        //把組件添加到p3中
        p3.add(connectBut);
        p3.add(closeBut);
        
        
        
        
        
        //設置面板的布局模式(流式布局)
        this.getContentPane().setLayout(new GridLayout(3,1));//網格布局
        
        //把組件添加到面板了
        //1、獲取面板
        Container c =  this.getContentPane();
        //把p1容器添加到面板
        c.add(p1);
        //把p2容器添加到面板
        c.add(p2);
        //把p3容器添加到面板
        c.add(p3);
        
        init();
    }
    /**
     * 初始化窗體的基本信息
     */
    public void init(){
        //1、標題
        this.setTitle("登錄界面");
        //2、大小
        this.setSize(350,200);
        //3、關閉放大功能
        this.setResizable(false);
        //4、位置
        this.setLocationRelativeTo(null);
        //5、是否顯示
        this.setVisible(true);
        //6、關閉
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    
    public static void main(String[] args) {
        new LoginFrame();
    }
    //點擊事件的處理過程
    @Override
    public void actionPerformed(ActionEvent e) {
        //處理選擇中的性別
        String sex = "";
        if(radioWoman.isSelected()) {
            sex = "女";
        }else if(radioMan.isSelected()) {
            sex = "男";
        }else {
            sex = "保密";
        }
        System.out.println("============");
        //1、隱藏當前的界面【登錄界面】
        this.setVisible(false);
        //2、顯示聊天的界面
        ChatFrame c = new ChatFrame(userText.getText(),sex);//登錄名傳遞過來
        c.getSocket();
    }
}


package com.lanqiao.demo2;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 服務端類
 * @author qichunlin
 */
public class Server {
    public static void main(String[] args) {
        try {
            ServerSocket ss = new ServerSocket(ChatUtil.PORT);
            int count = 0;
            while (true) {
                System.out.println("等待客戶端連接.......");
                Socket socket = ss.accept();
                count++;
                System.out.println("目前有"+count+"個客戶端進入了聊天室");
            }
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

2018.4.28 基於java的聊天系統(帶完善)