SOCKET聊天室字符界面版

共有四個文件,很簡單的,通過這個聊天室的編寫,可以基本了解網絡中客戶端與服務器的原理:Client.java、ListenClient.java、sendMsg.java、Server.java。

運行界面如下:

源程序如下:

Client.java:

import java.io.*;
import java.net.*;
public class Client {
 private static DataInputStream DIS;
 private static DataOutputStream DOS;
 private static Socket cSocket;
 public static void main(String arg[]){
  try{
  //for(int i=0;i<arg.length;i++)
   //System.out.println("/n  "+arg[i]);  
  cSocket=new Socket(arg[0],1111);
  DOS=new DataOutputStream(cSocket.getOutputStream());
  DIS=new DataInputStream(cSocket.getInputStream());
  String word="";
  String msg="";
  msg=DIS.readUTF();
  System.out.println("Server Information:"+msg);  
  //BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
  //System.out.println("My Word:");
  //word=br.readLine();
  //DOS.writeUTF(word);
  //while(!word.equals("bye")){
   //msg=DIS.readUTF();
   //System.out.println(msg);
   //System.out.println("My Word:");
   //word=br.readLine();
   //DOS.writeUTF(word);
   //利用线程发送消息
   new wordToServer(cSocket).start();
   //利用线程接收消息
   new receiveWord(cSocket).start();
  //}
  
  }
  catch(Exception e){
   e.printStackTrace();
   //System.out.println("Welcome again!");
  }
 }
}
class wordToServer extends Thread//用于向服务器发送消息
{    
 private static DataOutputStream DOS;
 private static Socket cSocket;
 public wordToServer(Socket C)
 {
  try{
   cSocket=C;
  }
  catch(Exception e)
  {
   e.printStackTrace();
   //System.out.println("Welcome again!");
  }
 }
 public void run()
 {
  String msg="";
   
                while(!msg.equals("bye"))
  {  
   try{ 
                               DOS=new DataOutputStream(cSocket.getOutputStream());
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    //System.out.print("/nMy Word:");
    msg=br.readLine();//从键盘输入信息
    DOS.writeUTF(msg);//将键盘输入信息发往服务端
   }
   catch(Exception e)
   {
    e.printStackTrace();
    try{
     DOS.writeUTF("bye");//发送再见控制字
    }
    catch(Exception e1)
    {
     e1.printStackTrace();
    }
    //System.out.println("Welcome again!");
    
   }
        }
  try{
   DOS.writeUTF(msg);
   DOS.close();
   cSocket.close();
  }
  catch(Exception e)
  {
   e.printStackTrace();
   //System.out.println("Welcome again!");
  }
  
 }
}
class receiveWord extends Thread//用于接收服务器发送过来的消息
{
 private static DataInputStream DIS;
 Socket cSocket;
 public receiveWord(Socket C)
 {
  try{
   cSocket=C;
   DIS=new DataInputStream(cSocket.getInputStream());
  }
  catch(Exception e)
  {
   e.printStackTrace();
   //System.out.println("Welcome again!");
  }
 }
 public void run()
 { 
  while(true)//循环的侦听由服务端发送过来的消息
  { 
   try{
  
    String msg="";
    msg=DIS.readUTF();
    if(msg.equals(""))
    {
     continue;
    }
    else
    {
     System.out.println(msg);
    }
   }
   catch(Exception e)
   {
    System.out.print(e);
    //System.out.println("Welcome again!");
    break;
   }
      }
  
 } 
 
}

ListenClient.java:

import java.io.*;
import java.net.*;
public class ListenClient extends Thread{
 //private static ServerSocket sSocket;
 private static Socket cSocket;
        private Server server=null;
 DataInputStream DIS;
 DataOutputStream DOS; 
 public ListenClient(Server S,Socket C)
 {
  try{
  server=S;
  cSocket=C;
  }
  catch(Exception e){
   e.printStackTrace();
  }
 }
 public void run(){
  String IPFrom="";
  String msg="";
  try{
  DIS=new DataInputStream(cSocket.getInputStream());
  DOS=new DataOutputStream(cSocket.getOutputStream());  
  IPFrom=cSocket.getInetAddress().getHostAddress();
  System.out.println("Connection From:"+IPFrom);
  InetAddress HostInformation=InetAddress.getLocalHost();
  DOS.writeUTF("Welcome to:"+HostInformation);//向客户端写信息
  String userByeMsg="User "+IPFrom+" has come!";//要发送的消息
  sendMsgToAllUser(userByeMsg);
  //BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
  msg=DIS.readUTF();//读用户输入的数据
  //String word="";
  while(!msg.equals("bye")){   
   msg="Client "+IPFrom+" said:"+msg;
   //将消息打印在服务端
   System.out.println(msg);   
   //word=br.readLine();
   //DOS.writeUTF(word);
   //下面执行向各个用户发送前用户发送的信息(除发送消息用户外)
   sendMsgToAllUser(msg);
   msg=DIS.readUTF();//取得消息
  }
  if(DelUser(cSocket)==0)
  {
   msg="User "+IPFrom+" has gone!";
   System.out.println(msg);
   sendMsgToAllUser(msg);//给所有再线的用户说当前用户已经下线
  }
  else
   System.out.println("Delete user false!");
  }
  catch(Exception e)
  {
   //e.printStackTrace();
   //利用异常来捕获用户下线
   //将用户从所有的用户对象数组中删除
   //System.out.println("FFFFFFFFFFFFFFFFFFFFFFFF");
   if(DelUser(cSocket)==0)
   {
    msg="User "+IPFrom+" has gone!";
    System.out.println(msg);//打印当前客户下线的消息到服务端
    sendMsgToAllUser(msg);//给所有再线的用户说当前用户已经下线
   }
   else
    System.out.println("Delete user false!");
   //向所有当前在线的用户发送下线用户的消息
   //String userByeMsg="User "+IPFrom+" has gone!";//要发送的消息
   //sendMsgToAllUser(userByeMsg);
  }
 }
 int DelUser(Socket C)
 {
  int N=0;
  for(N=0;N<=server.allUser;N++)
  {
   if((Socket)server.totalUser[N]==C)//如果下线的是这个用户
   {
    int N1=N;
    while(N1<server.allUser)
    {
     server.totalUser[N1]=server.totalUser[N1+1];
    }
    server.allUser--;
    return 0;
   }
  }
  return -1;
 }
 void sendMsgToAllUser(String word)//
 {
  int N=0;
  if(server.allUser>-1)//还有用户在线上
  {
   
   //for(N=0;N<=server.allUser;N++)
   while(N<=server.allUser)
   {
    //利用线程向所有在线用户发送该用户已经下线通知
    System.out.println("Test:"+((Socket)server.totalUser[N]).toString());
    Socket T=(Socket)(server.totalUser[N]);
     
    //Thread S=new Thread(new sendMsg((Socket)server.totalUser[N],word));
    Thread S=new Thread(new sendMsg(T,word));
    N++;
    S.start();
    try
    {
      S.wait();
    }
    catch(Exception e)
    {}
    
   }
  }
 }
}

sendMsg.java:

import java.io.*;
import java.net.*;
public class sendMsg extends Thread
{
 private  Socket cSocket;//定义要接收消息的SOCKET
 //DataInputStream DIS;
 DataOutputStream DOS;
 String msg;
 sendMsg(Socket C,String msg)
 {
  try{
   cSocket=C;
   this.msg=msg;
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
 }
 public void run()
 {
  try{
   DOS=new DataOutputStream(cSocket.getOutputStream());
   DOS.writeUTF(msg);
  //DOS.close();
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
 }
}

Server.java:

import java.net.*;
public class Server { 
 /**
  * @param args
  */
 ServerSocket sSocket;
 Socket cSocket;
 public static Object[] totalUser=new Object[200];//用于存放不同用户登陆的SOCKET
 public static int allUser=-1; //用于确定当前有多少用户
 public static void main(String[] args) {
  // TODO 自动生成方法存根
  Server server=new Server();
  try{
   int port;
   port=1111;
   
                        server.sSocket=new ServerSocket(port);
   System.out.println("Listening...");
   while(true){
    server.cSocket=server.sSocket.accept();
    if(server.cSocket!=null)
    {
     //当侦听到后就把侦听到的SOCKET放到OBJECT对象数组中
     totalUser[++allUser]=server.cSocket;
     System.out.println("当前在线用户:");
     for(int i=0;i<=allUser;i++)
     {
      System.out.println(totalUser[i].toString());
     }
     Thread T=new Thread(new ListenClient(server,server.cSocket));
     T.start();
    }
   }
   
   
  }
  catch(Exception e){
   e.printStackTrace();
  }

 }

}
有問題,請留言,本機測試通過。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值