您的位置:首页 > 其它

SOCKET聊天室字符界面版

2006-04-19 17:17 218 查看
共有四個文件,很簡單的,通過這個聊天室的編寫,可以基本了解網絡中客戶端與服務器的原理: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
==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
).toString());
Socket T=(Socket)(server.totalUser
);

//Thread S=new Thread(new sendMsg((Socket)server.totalUser
,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();
}

}

}
有問題,請留言,本機測試通過。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: