JavaSE基礎小結--1---基於TCP的聊天程式
阿新 • • 發佈:2019-01-09
伺服器程式碼:
Code:- package cn.itcast.chat;
- import java.awt.Frame;
- import java.awt.TextArea;
- import java.awt.event.WindowAdapter;
- import java.awt.event.WindowEvent;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.io.PrintWriter;
- import java.net.ServerSocket;
- import java.net.Socket;
- import java.util.ArrayList;
- import java.util.List;
- publicclass ChatServer {
- private Frame frame;
- private TextArea infoArea;
- private List<Socket> list;
- public ChatServer() {
- list = new ArrayList();
- init();
- }
- publicvoid init() {
- frame = new Frame("聊天的服務端");
- frame.setBounds(300, 200, 400, 400);
- infoArea = new TextArea();
- frame.add(infoArea);
- myEvent();
- frame.setVisible(
- }
- publicvoid myEvent() {
- frame.addWindowListener(new WindowAdapter() {
- @Override
- publicvoid windowClosing(WindowEvent e) {
- for(Socket s : list){
- try {
- s.shutdownOutput();
- } catch (IOException e1) {
- System.out.println("server shut out ");
- }
- }
- System.exit(0);
- }
- });
- }
- publicvoid connection(){
- try {
- ServerSocket ss = new ServerSocket(30000);
- while(true){
- Socket socket = ss.accept();
- String ip = socket.getInetAddress().getHostAddress();
- list.add(socket);
- infoArea.append(ip+"已進入到聊天室/r/n");
- ServerThread st = new ServerThread(list,socket,infoArea);
- new Thread(st).start();
- }
- } catch (IOException e) {
- System.out.println("監聽埠失敗");
- }
- }
- publicstaticvoid main(String[] args) {
- new ChatServer().connection();
- }
- }
- class ServerThread implements Runnable{
- private Socket socket;
- private List<Socket> list;
- private TextArea infoArea;
- public ServerThread(List<Socket> list,Socket socket,TextArea infoArea) {
- this.list = list;
- this.socket = socket;
- this.infoArea = infoArea;
- }
- @Override
- publicvoid run() {
- try {
- String ip = socket.getInetAddress().getHostAddress();
- BufferedReader bufr =
- new BufferedReader(new InputStreamReader(socket.getInputStream()));
- String line = null;
- while((line=bufr.readLine())!=null){
- for(Socket s : list){
- PrintWriter out = new PrintWriter(s.getOutputStream(),true);
- out.println(ip+":"+line);
- }
- }
- if(socket!=null){
- socket.close();
- infoArea.append(ip+"已離開聊天室!!!!!!/r/n");
- list.remove(socket);
- }
- } catch (IOException e) {
- System.out.println("server thread exception "+e.toString());
- }
- }
- }
客戶端程式碼:
Code:- package cn.itcast.chat;
- import java.awt.Button;
- import java.awt.Color;
- import java.awt.FlowLayout;
- import java.awt.Frame;
- import java.awt.TextArea;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.awt.event.WindowAdapter;
- import java.awt.event.WindowEvent;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.io.PrintWriter;
- import java.net.Socket;
- import java.net.UnknownHostException;
- publicclass ChatClient {
- private Frame frame;
- private TextArea receArea,sendArea;
- private Button sendBut;
- private Socket socket;
- public ChatClient(){
- init();
- }
- publicvoid init(){
- frame = new Frame("聊天的客戶端");
- frame.setBounds(300, 200, 500, 420);
- frame.setLayout(new FlowLayout(FlowLayout.RIGHT));
- receArea = new TextArea(14,65);
- receArea.setEditable(false);
- receArea.setBackground(Color.white);
- sendArea = new TextArea(6,65);
- sendBut = new Button("發 送");
- sendBut.setEnabled(false);
- frame.add(receArea);
- frame.add(sendArea);
- frame.add(sendBut);
- myEvent();
- frame.setResizable(false);
- frame.setVisible(true);
- initConnection();
- }
- publicvoid myEvent(){
- sendBut.addActionListener(new ActionListener() {
- @Override
- publicvoid actionPerformed(ActionEvent e) {
- if(socket!=null && socket.isClosed()){
- receArea.append("通訊中斷");
- sendBut.setEnabled(false);
- return;
- }
- String text = sendArea.getText();
- try {
- PrintWriter out = new PrintWriter(socket.getOutputStream(),true);
- out.println(text);
- } catch (IOException e1) {
- }
- sendArea.setText("");
- }
- });
- frame.addWindowListener(new WindowAdapter() {
- @Override
- publicvoid windowOpened(WindowEvent e) {
- sendArea.requestFocus();
- }
- @Override
- publicvoid windowClosing(WindowEvent e) {
- if(socket!=null){
- try {
- socket.shutdownOutput();
- } catch (IOException e1) {
- System.out.println("shut out");
- }
- }
- System.exit(0);
- }
- });
- }
- publicvoid initConnection(){
- try {
- socket = new Socket("192.168.1.254",30000);
- } catch (UnknownHostException e) {
- receArea.append("未知主機");return;
- } catch (IOException e) {
- receArea.append("網路服務失敗");return;
- }
- sendBut.setEnabled(true);
- ClientThread ct =new ClientThread(socket, receArea);
- new Thread(ct).start();
- }
- publicstaticvoid main(String[] args) {
- new ChatClient();
- }
- }
- class ClientThread implements Runnable{
- private Socket socket;
- private TextArea receArea;
- ClientThread(Socket socket,TextArea receArea){
- this.socket = socket;
- this.receArea = receArea;
- }
- @Override
- publicvoid run() {
- BufferedReader bufr = null;
- try {
- bufr =
- new BufferedReader(new InputStreamReader(socket.getInputStream()));
- String line = null;
- while((line=bufr.readLine())!=null){
- receArea.append(line+"/r/n");
- }
- if(socket!=null){
- socket.close();
- }
- } catch (IOException e) {
- System.out.println("client thread exception"+e.toString());
- }
- }
- }