`
JAVA天地
  • 浏览: 673515 次
  • 性别: Icon_minigender_1
  • 来自: 太原
文章分类
社区版块
存档分类
最新评论

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();
}

}

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

分享到:
评论

相关推荐

    聊天室基础项目资料_socket聊天室_聊天室_java项目_socket_

    【标题】"聊天室基础项目资料_socket聊天室_聊天室_java项目_socket_" 涉及的是基于Java的Socket编程技术,用于实现一个TCP/IP通信的即时聊天室。在这个项目中,开发者将学习如何利用Java的Socket类来创建客户端和...

    C#socket聊天室

    本项目"**C# Socket聊天室**"就是基于C#语言实现的,它为我们提供了了解和学习Socket通信的一个实例。下面将详细介绍这个项目的核心知识点。 首先,让我们了解什么是Socket。Socket在计算机网络中是一种进程间通信...

    C# SOCKET 聊天室

    在聊天室中,字符串消息通常会被转换为字节流并通过Socket发送。接收端再将接收到的字节流解码回原始的文本信息。 6. **事件驱动编程**: C#中的事件驱动编程模型适用于网络通信。服务器端监听Socket的`Accept`...

    基于C#的一个Socket聊天室实例

    本文将深入探讨基于C#实现的Socket聊天室实例,旨在帮助开发者理解和应用这一技术。 首先,让我们理解Socket的基本概念。Socket是网络通信中的一个端点,它允许两个应用程序通过网络进行数据交换。在C#中,我们可以...

    C#实现Socket聊天室源码

    本篇将详细解析"**C#实现Socket聊天室源码**"的相关知识点,帮助你深入理解如何利用C#进行Socket编程,创建一个简单的聊天室。 首先,Socket在计算机网络中扮演着客户端和服务器之间通信桥梁的角色。它允许两个网络...

    java版基于socket的聊天室

    Java版基于Socket的聊天室是一种实现网络通信的基本示例,非常适合初学者理解网络编程和Socket编程的概念。在本文中,我们将深入探讨这个话题,讲解相关的技术知识点。 首先,Socket是网络编程中的一个基本概念,它...

    Socket_聊天室_

    Socket编程是网络通信的核心技术,尤其在开发多人在线聊天室这样的应用中,它的重要性不言而喻。Socket,又称套接字,是操作系统提供的一种进程间通信机制,它允许两个或多个应用程序通过网络进行数据交换。在这个...

    Java实现带有GUI界面的聊天室,双方通过socket通信

    在这个项目中,我们将讨论如何使用Java实现一个带有图形用户界面(GUI)的聊天室,其中双方通过socket进行通信。Socket是网络编程中的基本组件,它允许两个或多个应用程序通过网络交换数据。 首先,我们需要了解...

    ActionScript简单的Socket聊天室系统

    在本项目中,“ActionScript简单的Socket聊天室系统”是利用ActionScript 3.0(AS3.0)构建的一个基本的网络通信应用。这个系统依赖于Adobe Integrated Runtime (AIR) 来运行服务端,AIR允许开发人员创建桌面应用...

    Socket +WinForm聊天室(经典)

    总之,结合Socket的网络通信能力和WinForm的图形界面设计,我们可以构建出功能丰富的聊天室应用程序。这个过程中涉及的知识点广泛,包括网络编程、多线程、UI设计等,对于提升程序员的综合技能非常有帮助。

    JAVA Socket聊天室源程序

    Java Socket聊天室源程序是一个基于Java编程语言实现的网络通信应用,主要利用Socket API来创建一个简单的多人在线聊天环境。Socket是TCP/IP协议的一部分,它允许两个或多个网络应用程序之间进行双向通信。在这个...

    Python实现的多人聊天室源码,基于socket tcp通信,使用tkinter做客户端界面,含可执行文件

    在本项目中,我们探讨的是一个使用Python编程语言实现的多人聊天室,它基于socket TCP通信协议,并且利用Tkinter库构建了用户友好的客户端界面。这个聊天室系统允许多个用户同时在线交流,增强了实时互动性。以下是...

    C#.Net Socket网络聊天室编程实例附教程

    在本文中,我们将深入探讨如何使用C#.NET进行Socket网络编程,特别关注如何构建一个简单的网络聊天室。这个实例教程适合初学者,旨在提供一种理解网络通信基础的方式,并且源码可供直接使用和扩展,可以作为内网即时...

    Java socket聊天程序 有界面

    通过学习和实践这个Java Socket聊天程序,你可以深入理解网络编程的基本原理,掌握多线程编程,以及如何将这些技术应用于创建用户友好的图形界面。这不仅对提升你的Java编程技能大有裨益,而且对于理解和开发其他...

    C# WinForm使用Socket通信搭建简易聊天室

    在本文中,我们将深入探讨如何使用C# WinForm和Socket通信技术来搭建一个简单的聊天室。Socket编程是网络通信的基础,而C# WinForm则提供了一个用户友好的图形界面,两者结合可以创建出功能丰富的交互式应用。 首先...

    socket 简易多人聊天室

    本项目"socket 简易多人聊天室"就是一个基于Java Socket技术构建的多用户交互平台,允许多个客户端同时连接到一个服务端进行实时聊天。下面我们将深入探讨相关知识点。 首先,我们来理解Java Socket的基本概念。...

    javaSocket带界面聊天室

    在这个"javaSocket带界面聊天室"项目中,开发者利用Java的Socket类和Swing库创建了一个具有图形用户界面(GUI)的多人聊天平台。下面我们将深入探讨这个项目中的关键知识点。 1. **Java Socket**: Java Socket 提供...

    socket聊天室服务端

    本项目“socket聊天室服务端”采用Microsoft Foundation Class (MFC) 框架下的Socket API来实现一个异步的聊天室服务端,为用户提供实时、多用户交互的聊天环境。 MFC是一个C++库,它提供了面向对象的接口来访问...

    socket编程聊天室(C++)

    9. **用户界面**:虽然这里只提到了C++的Socket编程,但实际的聊天室应用往往还需要一个用户界面,可能是命令行界面或者图形用户界面。对于C++,可以使用如Qt或SFML等库来构建用户界面。 10. **网络编程规范**:在...

    基于Socket的MFC聊天室程序

    总的来说,基于Socket的MFC聊天室程序是一个结合了网络编程和GUI编程的项目,它展示了如何利用MFC来构建用户友好的界面,同时通过Socket实现网络通信,满足多人实时交流的需求。通过学习和理解这个项目,开发者可以...

Global site tag (gtag.js) - Google Analytics