聊天室初步代码(socket客户端和服务器端源代码)~

来源:互联网 发布:java 简单工作流 编辑:程序博客网 时间:2024/05/23 01:23

在老师上课的指导下,自己下来又做了好一会~~知识的综合,还是不错的~~用到了“集合”,socket,io流,异常,多线程,聊天室软件,比以前自己写的那个还是进步了不少,以前自学,自己写的那个只能在本机上自己给自己发信息,实在无聊~!现在这个利用多线程,可以利用网络客服端发信息给服务器,服务器再发回给客服端,可以有多个客服端(实质是socket的多线程);虽然,老师多次指出,这个代码很垃圾。不过毕竟这是java写的第一个小东东~~放在空间里,自己想看的时候,可以又回来看看~~!

客服端代码:

package com.myboss.lcl;

import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Date;

/**1.设置一个客服端的输入的面板继承Frame:
 *  【1】设置布局((launch方法) ,textField,textArea,BorderLayout,pack())
 * 【2】面板的关闭
 *     (1)面板关闭时网络连接随之关闭 (disConnect方法:关闭连接时所用到的资源)
 *  【3】鼠标事件
 *     (1)action()方法:鼠标点击textFiled时,将键盘写入的文字发送到textArea上;
 *     (2)send方法将textField上发送的文字,通过网络,发送给服务器;
 * 【4】网络连接:(connect方法)
 *     (1)客服端socket套接字(ip地址,和端口号);
 *     (2)利用DataInputStream DataOutputStream传输数据;
 *     (3) Receive线程类:接收多个客服端socket发送个服务器的信息,再由服务器,反向发回给这多个客服端(用到DataInputStream的readUTF());
 *  2.main方法调用launch方法.实现客服端的功能
 */
public class chatClient extends Frame
{
 private TextField textField ;
 private TextArea textArea ;
 private DataInputStream dis ;
 private DataOutputStream dos ;
 private Socket socket ;
  
 public void launch(){
  /*面板的关闭*/
  
  setSize(300,300);
  setVisible(true);
  
  addWindowListener(new WindowAdapter(){
   public void windowClosing(WindowEvent e){
    try {
     if(dos != null){
      dos.writeUTF("BYE-BYE");
     }
    } catch (IOException e1) {
     e1.printStackTrace();
    }
    disConnect();//面板关闭时网络连接随之关闭 (disConnect方法:关闭连接时所用到的资源)
    setVisible(false);
    System.exit(0);
   }
  }
  );
  
  String str1 = "请大家文明聊天,谢谢合作!"+"/n";
  
  textField = new TextField();
  textArea = new TextArea(str1);
  
  textField.addActionListener(new action());
  
  add(BorderLayout.NORTH,textArea);
  add(BorderLayout.SOUTH,textField);
  
  pack();
  
  connect();
 }
 
 
  private void connect() {
  /* 网络连接:(connect方法)*/
  
  try {
      socket = new Socket("localhost",8200);//客服端socket套接字(ip地址,和端口号);
   dis = new DataInputStream(socket.getInputStream());//利用DataInputStream DataOutputStream传输数据;
   dos = new DataOutputStream(socket.getOutputStream());
  } catch (UnknownHostException e) {  
   e.printStackTrace();
  } catch (IOException e) {  
   e.printStackTrace();
  }
  
  Receive receive = new Receive();
  new Thread(receive).start();
 }

 
 private void disConnect(){
  //disConnect方法:关闭连接时所用到的资源
  
  try {
   if(dis != null){
    dis.close();
    dis = null;
   }
   if(dos != null){
    dos.close();
    dos = null;
   }
   if(socket != null){
    socket.close();
    socket = null;
   }
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

 
 private class Receive implements Runnable{
 /*Receive线程类:接收多个客服端socket发送个服务器的信息,服务器,反向发回给这多个客服端(用到DataInputStream的readUTF())*/
  
  public void run(){
   try {
    while(socket != null){
     String str = dis.readUTF();
     textArea.append("---------"+str+"/n");
    }
   } catch (IOException e) {
    //e.printStackTrace();
       System.out.println("秘密会话结束,离开聊天室");
   }
  }  
 }
 
 
 public void send() {
  /*send方法将textField上发送的文字,通过网络,发送给服务器;*/
  
  try {
   dos.writeUTF(textField.getText());
   dos.flush();
  } catch (IOException e) {
   e.printStackTrace();
  }     
 }
 
 
 private class action implements ActionListener{
  public void actionPerformed(ActionEvent e){
   String str = textField.getText();
   textArea.append("/n"+"你刚刚对大家说:"+str+"----------"+new Date()+"/n");
   send();
   textField.setText("");
  }
 }
 
 public static void main(String[] args){
  /*main方法调用launch方法,实现客服端的功能*/
  new chatClient().launch();
 }
}

服务器端:

package com.myboss.lcl;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 【1】设置服务器的serivic方法:
 *     (1)serverSocket接收客服端socket发送过来的信息 
 *     (2)建立一个ArrayList容器类,存储多个客服端socket访问时产生的线程类
 *     (3)建立一个ThreadClient线程类(有构造函数传递值socket),该线程类负责接收多个客服端socket发过来的信息,并将其显示在服务器(DataInputStream的readUTF()),
 *         将ThreadClient接收到的信息通过方法send(String str)方法socket发送回客服端
 * 【2】建立一个ThreadClient线程类(有构造函数传递值socket),该线程类负责接收多个客服端socket发过来的信息,并将其显示在服务器(DataInputStream的readUTF()),
 *     将ThreadClient接收到的信息通过方法send(String str)方法socket发送回客服端
 *     (1)释放资源close();
 *     (2)send方法();
 */
public class chatServer{
 
 private boolean started ;
 private boolean connected ;
 private List<ThreadClient> clients = new ArrayList<ThreadClient>();
 
 public void service(){
  
  ServerSocket ss = null ;  
  try{
   ss = new ServerSocket(8200);
   started = true;
  while(started){
   
   Socket socket = ss.accept();//serverSocket接收客服端socket发送过来的信息 
   System.out.println(socket.getInetAddress()+"欢迎进入聊天室!");
   
            connected = true;
           
           ThreadClient tc  = new ThreadClient(socket);//放入多线程的程序;
           clients.add(tc);//将产生的线程放入容器类中
           new Thread(tc).start();
          
  }
  }catch(Exception e){
   e.printStackTrace();
  }
 }
 
 
 private class ThreadClient implements Runnable{
  /*建立一个ThreadClient线程类(有构造函数传递值socket),该线程类负责接收多个客服端socket发过来的信息,并将其显示在服务器(DataInputStream的readUTF()),
 *     将ThreadClient接收到的信息通过方法send(String str)方法socket发送回客服端*/
  
  Socket socket ;
  DataInputStream dis;
  DataOutputStream dos;
  
  
  public ThreadClient(Socket socket){
   this.socket = socket ;
  }
  
  
   public void run(){
   
   try {
    dis = new DataInputStream(socket.getInputStream());
    dos = new DataOutputStream(socket.getOutputStream());
   } catch (IOException e) {
    e.printStackTrace();
   }
   
     try {
    while(connected){
          if(dis == null){
           return ;
          }
         
          String str = dis.readUTF();
         
          if("BYE-BYE".equalsIgnoreCase(str)){
            this.close();//释放资源
            break;
          }
          for(Iterator iter = clients.iterator();iter.hasNext();){           
          ThreadClient tc = (ThreadClient)iter.next();//将产生的线程放于容器中
          tc.send(str);//信息发送回~~~~给客服端
          }
          System.out.println(str);
      }
   } catch (IOException e) {
    e.printStackTrace();
    this.close();
   }
   }


  private void close() {
   /*释放资源close();*/
   try {
    if(dis != null){
      dis.close();
      dis = null;
     }
     if(dos != null){
      dos.close();
      dos = null;
     }
     if(socket != null){
      socket.close();
      socket = null;
     }
    
     clients.remove(this);
    
   } catch (IOException e) {
    e.printStackTrace();
   }
  }


  private void send(String str) {
  /*通过send方法,将ThreadClient接收到的信息通过方法send(String str)方法socket发送回客服端*/
   try {
    dos.writeUTF("IP地址:"+socket.getInetAddress()+"端口号:"+socket.getPort()
           +"--------"+"对大家说:"+str);
    dos.flush();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }
 public static void main(String[] args){
  new chatServer().service();
 }
}