C#编写简单的聊天程序

C#编写简单的聊天程序
C#编写简单的聊天程序

程序的分析与设计

1.明确程序功能

如果大家现在已经参加了工作,你的经理或者老板告诉你,“小王,我需要你开发一个聊天程序”。那么接下来该怎么做呢?你是不是在脑子里有个雏形,然后就直接打开VS2005开始设计窗体,编写代码了呢?在开始之前,我们首先需要进行软件的分析与设计。就拿本例来说,如果只有这么一句话“一个聊天程序”,恐怕现在大家对这个“聊天程序”的概念就很模糊,它可以是像QQ那样的非常复杂的一个程序,也可以是很简单的聊天程序;它可能只有在对方在线的时候才可以进行聊天,也可能进行留言;它可能每次将消息只能发往一个人,也可能允许发往多个人。它还可能有一些高级功能,比如向对方传送文件等。所以我们首先需要进行分析,而不是一上手就开始做,而分析的第一步,就是搞清楚程序的功能是什么,它能够做些什么。在这一步,我们的任务是了解程序需要做什么,而不是如何去做。

了解程序需要做什么,我们可以从两方面入手,接下来我们分别讨论。

1.1请求客户提供更详细信息

我们可以做的第一件事就是请求客户提供更加详细的信息。尽管你的经理或老板是你的上司,但在这个例子中,他就是你的客户(当然通常情况下,客户是公司外部委托公司开发软件的人或单位)。当遇到上面这种情况,我们只有少得可怜的一条信息“一个聊天程序”,首先可以做的,就是请求客户提供更加确切的信息。比如,你问经理“对这个程序的功能能不能提供一些更具体的信息?”。他可能会像这样回答:“哦,很简单,可以登录聊天程序,登录的时候能够通知其他在线用户,然后与在线的用户进行对话,如果不想对话了,就注销或者直接关闭,就这些吧。”

有了上面这段话,我们就又可以得出下面几个需求:

程序可以进行登录。

登录后可以通知其他在线用户。

可以与其他用户进行对话。

可以注销或者关闭。

1.2对于用户需求进行提问,并进行总结

经常会有这样的情况:可能客户给出的需求仍然不够细致,或者客户自己本身对于需求就很模糊,此时我们需要做的就是针对用户上面给出的信息进行提问。接下来我就看看如何对上面的需求进行提问,我们至少可以向经理提出以下问题:

NOTE:这里我穿插一个我在见到的一个印象比较深刻的例子:客户往往向你表达了强烈的意愿他多么多么想拥有一个属于自己的网站,但是,他却没有告诉你网站都有哪些内容、栏目,可以做什么。而作为开发者,我们显然关心的是后者。

登录时需要提供哪些内容?需不需要提供密码?

允许多少人同时在线聊天?

与在线用户聊天时,可以将一条消息发给一个用户,还是可以一次将消息发给多个用户?

聊天时发送的消息包括哪些内容?

注销和关闭有什么区别?

注销和关闭对对方需不需要给对方提示?

由于这是一个范例程序,而我在为大家讲述,所以我只能再充当一下客户的角色,来回答上面的问题:

登录时只需要提供用户名称就可以了,不需要输入密码。

允许两个人在线聊天。(这里我们只讲述这种简单情况,允许多人聊天需要使用多线程)

因为只有两个人,那么自然是只能发给一个用户了。

聊天发送的消息包括:用户名称、发送时间还有正文。

注销并不关闭程序,只是离开了对话,可以再次进行连接。关闭则是退出整个应用程序。

注销和关闭均需要给对方提示。

好了,有了上面这些信息我们基本上就掌握了程序需要完成的功能,那么接下来做什么?开始编码了么?上面的这些属于业务流程,除非你对它已经非常熟悉,或者程序非常的小,那么可以对它进行编码,但是实际中,我们最好再编写一些用例,这样会使程序的流程更加的清楚。

1.3编写用例

通常一个用例对应一个功能或者叫需求,它是程序的一个执行路径或者执行流程。编写用例的思路是:假设你已经有了这样一个聊天程序,那么你应该如何使用它?我们的使用步骤,就是一个用例。用例的特点就每次只针对程序的一个功能编写,最后根据用例编写代码,最终完成程序的开发。我们这里的需求只有

简单的几个:登录,发送消息,接收消息,注销或关闭,上面的分析是对这几点功能的一个明确。接下来我们首先编写第一个用例:登录。

在开始之前,我们先明确一个概念:客户端,服务端。因为这个程序只是在两个人(机器)之间聊天,那么我们大致可以绘出这样一个图来:

我们期望用户A和用户B进行对话,那么我们就需要在它们之间建立起连接。尽管“用户A”和“用户B”的地位是对等的,但按照约定俗称的说法:我们将发起连接请求的一方称为客户端(或叫本地),另一端称为服务端(或叫远程)。所以我们的登录过程,就是“用户A”连接到“用户B”的过程,或者说客户端(本地)连接到服务端(远程)的过程。在分析这个程序的过程中,我们总是将其分为两部分,一部分为发起连接、发送消息的一方(本地),一方为接受连接、接收消息的一方(远程)。

登录和连接(本地)

主路径可选路径

1.打开应用程序,显示登录窗口

2.输入用户名

3.点击“登录”按钮,登录成功

3.“登录”失败

如果用户名为空,重新进入第2步。

4.显示主窗口,显示登录的用户名称

5.点击“连接”,连接至远程

6.连接成功

6.1提示用户,连接已经成功。6.连接失败

6.1 提示用户,连接不成功

5.在用户界面变更控件状态

5.2连接为灰色,表示已经连接

5.3注销为亮色,表示可以注销

5.4发送为亮色,表示可以发消息

这里我们的用例名称为登录和连接,但是后面我们又打了一个括号,写着“本地”,它的意思是说,登录和连接是客户端,也就是发起连接的一方采取的动作。同样,我们需要写下当客户端连接至服务端时,服务端采取的动作。

登录和连接(远程)

主路径可选路径

1-4 同客户端

5.等待连接

6.如果有连接,自动在用户界面显示“远程主机连接成功”

接下来我们来看发送消息。在发送消息时,已经是登录了的,也就是“用户A”、“用户B”已经做好了连接,所以我们现在就可以只关注发送这一过程:发送消息(本地)

主路径可选路径

1.输入消息

2.点击发送按钮 2.没有输入消息,重新回到第1步

3.服务端已经断开连接或者关闭

3.在用户界面上显示发出的消息

3.1在客户端用户界面上显示错误消息

然后我们看一下接收消息,此时我们只关心接收消息这一部分。

接收消息(远程)

主路径可选路径

1.侦听到客户端发来的消息,自动显示在用户界面上。

注意到这样一点:当远程主机向本地返回消息时,它的用例又变为了上面的用例“发送消息(本地)”。因为它们的角色已经互换了。

最后看一下注销,我们这里研究的是当我们在本地机器点击“注销”后,双方采取的动作:

注销(本地主动)

主路径可选路径

1.点击注销按钮,断开与远程的连接

2.在用户界面显示已经注销

3.更改控件状态

3.1注销为灰色,表示已经注销

3.2连接为亮色,表示可以连接

3.3发送为灰色,表示无法发送

与此对应,服务端应该作出反应:

注销(远程被动)

主路径可选路径

1.自动显示远程用户已经断开连接

注意到一点:当远程主动注销时,它采取的动作为上面的“本地主动”,本地采取的动作则为这里的“远程被动”。

至此,应用程序的功能分析和用例编写就告一段落了,通过上面这些表格,之后再继续编写程序变得容易了许多。另外还需要记得,用例只能为你提供一个操作步骤的指导,在实现的过程中,因为技术等方面的原因,可能还会有少量的修改。如果修改量很大,可以重新修改用例;如果修改量不大,那么就可以直接编码。这是一个迭代的过程,也没有一定的标准,总之是以高效和合适为标准。

2.分析与设计

我们已经很清楚地知道了程序需要做些什么,尽管现在还不知道该如何去做。我们甚至可以编写出这个程序所需要的接口,以后编写代码的时候,我们只要去实现这些接口就可以了。这也符合面向接口编程的原则。另外我们注意到,

尽管这是一个聊天程序,但是却可以明确地划分为两部分,一部分发送消息,一部分接收消息。另外注意上面标识为自动的语句,它们暗示这个操作需要通过事件的通知机制来完成。关于委托和事件,可以参考这两篇文章:

C#中的委托和事件 - 委托和事件的入门文章,同时捎带讲述了Observer

设计模式和.NET的事件模型

C#中的委托和事件(续) - 委托和事件更深入的一些问题,包括异常、超时的处理,以及使用委托来异步调用方法。

2.1消息Message

首先我们可以定义消息,前面我们已经明确了消息包含三个部分:用户名、时间、内容,所以我们可以定义一个结构来表示这个消息:

public struct Message {

private readonly string userName;

private readonly string content;

private readonly DateTime postDate;

public Message(string userName, string content) {

https://www.360docs.net/doc/6e14675486.html,erName = userName;

this.content = content;

this.postDate = DateTime.Now;

}

public Message(string content) : this("System", content) { }

public string UserName {

get { return userName; }

}

public string Content {

get { return content; }

}

public DateTime PostDate {

get { return postDate; }

}

public override string ToString() {

return String.Format("{0}[{1}]:rn{2}rn", userName, postDate, content);

}

}

2.2消息发送方IMessageSender

从上面我们可以看出,消息发送方主要包含这样几个功能:登录、连接、发送消息、注销。另外在连接成功或失败时还要通知用户界面,发送消息成功或失败时也需要通知用户界面,因此,我们可以让连接和发送消息返回一个布尔类型的值,当它为真时表示连接或发送成功,反之则为失败。因为登录没有任何的业务逻辑,仅仅是记录控件的值并进行显示,所以我不打算将它写到接口中。因此我们可以得出它的接口大致如下:

public interface IMessageSender {

bool Connect(IPAddress ip, int port); // 连接到服务端

bool SendMessage(Message msg); // 发送用户

void SignOut();

// 注销系统

}

2.3消息接收方IMessageReceiver

而对于消息接收方,从上面我们可以看出,它的操作全是被动的:客户端连接时自动提示,客户端连接丢失时显示自动提示,侦听到消息时自动提示。注意到上面三个词都用了“自动”来修饰,在C#中,可以定义委托和事件,用于当程序中某种情况发生时,通知另外一个对象。在这里,程序即是我们的IMessageReceiver,某种情况就是上面的三种情况,而另外一个对象则为我们的用户界面。因此,我们现在首先需要定义三个委托:

public delegate void MessageReceivedEventHandler(string msg);

public delegate void ClientConnectedEventHandler(IPEndPoint endPoint); public delegate void ConnectionLostEventHandler(string info);

接下来,我们注意到接收方需要侦听消息,因此我们需要在接口中定义的方法是StartListen()和StopListen()方法,这两个方法是典型的技术相关,而不是业务相关,所以从用例中是看不出来的,可能大家现在对这两个方法是做什么的还不清楚,没有关系,我们现在并不写实现,而定义接口并不需要什么成本,我们写下IMessageReceiver的接口定义:

public interface IMessageReceiver {

event MessageReceivedEventHandler MessageReceived; // 接收到发来的消息

event ConnectionLostEventHandler ClientLost;

// 远程主动断开连接

event ClientConnectedEventHandler ClientConnected; // 远程连接到了本地

void StartListen(); // 开始侦听端口

void StopListen(); // 停止侦听端口

}

我记得曾经看过有篇文章说过,最好不要在接口中定义事件,但是我忘了他的理由了,所以本文还是将事件定义在了接口中。

2.4主程序Talker

而我们的主程序是既可以发送,又可以接收,一般来说,如果一个类像获得其他类的能力,以采用两种方法:继承和复合。因为C#中没有多重继承,所以我们无法同时继承实现了IMessageReceiver和IMessageSender的类。那么我们可以采用复合,将它们作为类成员包含在Talker内部:

public class Talker {

private IMessageReceiver receiver;

private IMessageSender sender;

public Talker(IMessageReceiver receiver, IMessageSender sender) {

this.receiver = receiver;

this.sender = sender;

}

}

现在,我们的程序大体框架已经完成,接下来要关注的就是如何实现它,现在让我们由设计走入实现,看看实现一个网络聊天程序,我们需要掌握的技术吧。

C#网络编程基础(篇外篇)

这部分的内容请参考 C#网络编程系列文章,共5个部分较为详细的讲述了基于Socket的网络编程的初步内容。

编写程序代码

如果你已经看完了上面一节C#网络编程,那么本章完全没有讲解的必要了,所以我只列出代码,对个别值得注意的地方稍微地讲述一下。首先需要了解的就是,我们采用的是三个模式中开发起来难度较大的一种,无服务器参与的模式。还有就是我们没有使用广播消息,所以需要提前知道连接到的远程主机的地址和端口号。

1.实现IMessageSender接口

public class MessageSender : IMessageSender {

TcpClient client;

Stream streamToServer;

// 连接至远程

public bool Connect(IPAddress ip, int port) {

try {

client = new TcpClient();

client.Connect(ip, port);

streamToServer = client.GetStream(); // 获取连接至远程的流

return true;

} catch {

return false;

}

}

// 发送消息

public bool SendMessage(Message msg) {

try {

lock (streamToServer) {

byte[] buffer =

Encoding.Unicode.GetBytes(msg.ToString());

streamToServer.Write(buffer, 0, buffer.Length);

return true;

}

} catch {

return false;

}

}

// 注销

public void SignOut() {

if (streamToServer != null)

streamToServer.Dispose();

if (client != null)

client.Close();

}

}

这段代码可以用朴实无华来形容,所以我们直接看下一段。

2.实现IMessageReceiver接口

public delegate void PortNumberReadyEventHandler(int portNumber);

public class MessageReceiver : IMessageReceiver {

public event MessageReceivedEventHandler MessageReceived;

public event ConnectionLostEventHandler ClientLost;

public event ClientConnectedEventHandler ClientConnected;

// 当端口号Ok的时候调用 -- 需要告诉用户界面使用了哪个端口号在侦听

// 这里是业务上体现不出来,在实现中才能体现出来的

public event PortNumberReadyEventHandler PortNumberReady;

private Thread workerThread;

private TcpListener listener;

public MessageReceiver() {

((IMessageReceiver)this).StartListen();

}

// 开始侦听:显示实现接口

void IMessageReceiver.StartListen() {

ThreadStart start = new ThreadStart(ListenThreadMethod);

workerThread = new Thread(start);

workerThread.IsBackground = true;

workerThread.Start();

}

// 线程入口方法

private void ListenThreadMethod() {

IPAddress localIp = IPAddress.Parse("127.0.0.1");

listener = new TcpListener(localIp, 0);

listener.Start();

// 获取端口号

IPEndPoint endPoint = listener.LocalEndpoint as IPEndPoint;

int portNumber = endPoint.Port;

if (PortNumberReady != null) {

PortNumberReady(portNumber); // 端口号已经OK,通知用户界面

}

while (true) {

TcpClient remoteClient;

try {

remoteClient =

listener.AcceptTcpClient();

} catch {

break;

}

if (ClientConnected != null) {

// 连接至本机的远程端口

endPoint =

remoteClient.Client.RemoteEndPoint as IPEndPoint;

ClientConnected(endPoint);

// 通知用户界面远程客户连接

}

Stream streamToClient =

remoteClient.GetStream();

byte[] buffer = new byte[8192];

while (true) {

try {

int bytesRead = streamToClient.Read(buffer, 0, 8192);

if (bytesRead == 0) {

throw new Exception("

客户端已断开连接");

}

string msg =

Encoding.Unicode.GetString(buffer, 0, bytesRead);

if (MessageReceived != null) {

MessageReceived(msg);

// 已经收到消息

}

} catch (Exception ex) {

if (ClientLost != null) {

ClientLost(ex.Message); // 客户连接丢失

break;

// 退出循环

}

}

}

}

}

// 停止侦听端口

public void StopListen() {

try {

listener.Stop();

listener = null;

workerThread.Abort();

} catch { }

}

}

这里需要注意的有这样几点:我们StartListen()为显式实现接口,因为只能通过接口才能调用此方法,接口的实现类看不到此方法;这通常是对于一个接口采用两种实现方式时使用的,但这里我只是不希望MessageReceiver类型的客户调用它,因为在MessageReceiver的构造函数中它已经调用了StartListen。意思是说,我们希望这个类型一旦创建,就立即开始工作。我们使用了两个嵌套的while循环,这个它可以为多个客户端的多次请求服务,但是因为是同步操作,只要有一个客户端连接着,我们的后台线程就会陷入第二个循环中无法自拔。所以结果是:如果有一个客户端已经连接上了,其它客户端即使连接了也无法对它应答。最后需要注意的就是四个事件的使用,为了向用户提供侦听的端口号以进行连接,我又定义了一个PortNumberReadyEventHandler委托。

3.实现Talker类

Talker类是最平庸的一个类,它的全部功能就是将操作委托给实际的IMessageReceiver和IMessageSender。定义这两个接口的好处也从这里可以看出来:如果日后想重新实现这个程序,所有Windows窗体的代码和Talker的代码都不需要修改,只需要针对这两个接口编程就可以了。

public class Talker {

private IMessageReceiver receiver;

private IMessageSender sender;

public Talker(IMessageReceiver receiver, IMessageSender sender) {

this.receiver = receiver;

this.sender = sender;

}

public Talker() {

this.receiver = new MessageReceiver();

this.sender = new MessageSender();

}

public event MessageReceivedEventHandler MessageReceived {

add {

receiver.MessageReceived = value;

}

remove {

receiver.MessageReceived -= value;

}

}

public event ClientConnectedEventHandler ClientConnected {

add {

receiver.ClientConnected = value;

}

remove {

receiver.ClientConnected -= value;

}

}

public event ConnectionLostEventHandler ClientLost {

add {

receiver.ClientLost = value;

}

remove {

receiver.ClientLost -= value;

}

}

// 注意这个事件

public event PortNumberReadyEventHandler PortNumberReady {

add {

((MessageReceiver)receiver).PortNumberReady = value;

}

remove {

((MessageReceiver)receiver).PortNumberReady -= value;

}

}

// 连接远程 - 使用主机名

public bool ConnectByHost(string hostName, int port) {

IPAddress[] ips = Dns.GetHostAddresses(hostName);

return sender.Connect(ips[0], port);

}

// 连接远程 - 使用IP

public bool ConnectByIp(string ip, int port) {

IPAddress ipAddress;

try {

ipAddress = IPAddress.Parse(ip);

} catch {

return false;

}

return sender.Connect(ipAddress, port);

}

// 发送消息

public bool SendMessage(Message msg) {

return sender.SendMessage(msg);

}

// 释放资源,停止侦听

public void Dispose() {

try {

sender.SignOut();

receiver.StopListen();

} catch {

}

}

// 注销

public void SignOut() {

try {

sender.SignOut();

} catch {

}

}

}

4.设计窗体,编写窗体事件代码

现在我们开始设计窗体,我已经设计好了,现在可以先进行一下预览:

这里需要注意的就是上面的侦听端口,是程序接收消息时的侦听端口,也就是IMessageReceiver所使用的。其他的没有什么好说的,下来我们直接看一下代码,控件的命名是自解释的,我就不多说什么了。唯一要稍微说明下的是txtMessage指的是下面发送消息的文本框,txtContent指上面的消息记录文本框:

public partial class PrimaryForm : Form {

private Talker talker;

private string userName;

public PrimaryForm(string name) {

InitializeComponent();

userName = lbName.Text = name;

this.talker = new Talker();

this.Text = userName " Talking ...";

talker.ClientLost =

new

ConnectionLostEventHandler(talker_ClientLost);

talker.ClientConnected =

new

ClientConnectedEventHandler(talker_ClientConnected);

talker.MessageReceived =

new

MessageReceivedEventHandler(talker_MessageReceived);

talker.PortNumberReady =

new

PortNumberReadyEventHandler(PrimaryForm_PortNumberReady);

}

void ConnectStatus() { }

void DisconnectStatus() { }

// 端口号OK

void PrimaryForm_PortNumberReady(int portNumber) {

PortNumberReadyEventHandler del = delegate(int port) {

lbPort.Text = port.ToString();

};

lbPort.Invoke(del, portNumber);

}

// 接收到消息

void talker_MessageReceived(string msg) {

MessageReceivedEventHandler del = delegate(string m) {

txtContent.Text = m;

};

txtContent.Invoke(del, msg);

}

// 有客户端连接到本机

void talker_ClientConnected(IPEndPoint endPoint) {

ClientConnectedEventHandler del = delegate(IPEndPoint end) {

IPHostEntry host =

Dns.GetHostEntry(end.Address);

txtContent.Text =

String.Format("System[{0}]:rn远程主机{1}连接至本地。rn", DateTime.Now, end);

};

txtContent.Invoke(del, endPoint);

}

// 客户端连接断开

void talker_ClientLost(string info) {

ConnectionLostEventHandler del = delegate(string information) {

txtContent.Text =

String.Format("System[{0}]:rn{1}rn", DateTime.Now, information);

};

txtContent.Invoke(del, info);

}

// 发送消息

private void btnSend_Click(object sender, EventArgs e) {

if (String.IsNullOrEmpty(txtMessage.Text)) {

MessageBox.Show("请输入内容!");

txtMessage.Clear();

txtMessage.Focus();

return;

}

Message msg = new Message(userName, txtMessage.Text);

if (talker.SendMessage(msg)) {

txtContent.Text = msg.ToString();

txtMessage.Clear();

} else {

txtContent.Text =

String.Format("System[{0}]:rn远程主机已断开连接rn", DateTime.Now);

DisconnectStatus();

}

}

// 点击连接

private void btnConnect_Click(object sender, EventArgs e) {

string host = txtHost.Text;

string ip = txtHost.Text;

int port;

if (String.IsNullOrEmpty(txtHost.Text)) {

MessageBox.Show("主机名称或地址不能为空");

}

try{

port = Convert.ToInt32(txtPort.Text);

}catch{

MessageBox.Show("端口号不能为空,且必须为数字");

return;

}

if (talker.ConnectByHost(host, port)) {

ConnectStatus();

txtContent.Text =

String.Format("System[{0}]:rn已成功连接至远程rn", DateTime.Now);

return;

}

if(talker.ConnectByIp(ip, port)){

ConnectStatus();

txtContent.Text =

String.Format("System[{0}]:rn已成功连接至远程rn", DateTime.Now);

}else{

MessageBox.Show("远程主机不存在,或者拒绝连接!");

}

txtMessage.Focus();

}

// 关闭按钮点按

private void btnClose_Click(object sender, EventArgs e) {

try {

talker.Dispose();

Application.Exit();

} catch {

}

}

// 直接点击右上角的叉

private void PrimaryForm_FormClosing(object sender, FormClosingEventArgs e) {

try {

talker.Dispose();

Application.Exit();

} catch {

}

}

// 点击注销

private void btnSignout_Click(object sender, EventArgs e) { talker.SignOut();

DisconnectStatus();

txtContent.Text =

String.Format("System[{0}]:rn已经注销

rn",DateTime.Now);

}

private void btnClear_Click(object sender, EventArgs e) {

txtContent.Clear();

}

}

在上面代码中,分别通过四个方法订阅了四个事件,以实现自动通知的机制。最后需要注意的就是SignOut()和Dispose()的区分。SignOut()只是断开连接,Dispose()则是离开应用程序。

总结

这篇文章简单地分析、设计及实现了一个聊天程序。这个程序只是对无服务器模式实现聊天的一个尝试。我们分析了需求,随后编写了几个用例,并对本地、远程的概念做了定义,接着编写了程序接口并最终实现了它。这个程序还有很严重的不足:它无法实现自动上线通知,而必须要事先知道端口号并进行手动连接。为了实现一个功能强大且开发容易的程序,更好的办法是使用集中型服务器模式。

感谢阅读,希望这篇文章能对你有所帮助。

用VB做聊天程序的方法

.用VB做聊天程序的方法 2009-03-10 20:38 .用VB做聊天程序的方法 所谓“聊天”是指两个程序能够发送数据给对方。这个程序涉及到数据通讯的知识,仿佛很复杂,不过,由于VB给我们个Winsock控件,问题就变得很简单了。 首先编写“聊天(主机)”程序。在窗体里添加Winsock控件,并设置其Protocol属性为1-SckUDPProtocol,其他属值。接着添加两个标签和两个文本框,设置两个标签的标题属性分别为“接收窗”和“发送窗”;两个文本框的标题属性为编写代码: 1.“聊天(主机)” Private Sub Form—Load() ′设置网络地址 Winsock1.LocalPort=1024 Winsock1.RemoteHost="202.96.6.1" Winsock1.RemotePort=1999 End Sub Private Sub Text1—Change() ′发送用户输入的内容 Winsock1.SendData Text1.Text End Sub Private Sub Winsock1—DataArrival(Byval bytesTotal As Long) Dim rec As String ′接收对方数据并在文本框内显示 Winsock1.GetData rec, vb String Text2.Text=rec End Sub 2.“聊天(副机)” Private Sub Form_Load() ′设置网络地址 Winsock1.LocalPort=1999 Winsock1.RemoteHost="202.96.6.1" Winsock1.RemotePort=1024 其他部分程序与(主机)相同。最后将两个程序存盘,并编译成执行(.Exe)文件。现在就可以使用这个程序进行对

JAVA代码编写一简单网络聊天程序

要求:聊天室服务器、聊天室客户端;客户端之间可以聊天。 因为我是初级选手,想借此程序分析学习java,所以代码最好多一点注释... 分数有限,望大家不吝赐教!!问题补充: 需要图形用户界面哦,最好用swing组件 服务器端:采用多线程,可以向客户广播:当前聊天室人数,客户名称列表,客户进入离开提示; 客户端:可以设定昵称,性别,客户间可以私聊 服务器端: import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; import https://www.360docs.net/doc/6e14675486.html,.*; public class Server extends JFrame implements ActionListener{ JPanel contentPane; JLabel jLabel2 = new JLabel(); JTextField jTextField2 = new JTextField("4700"); JButton jButton1 = new JButton(); JLabel jLabel3 = new JLabel(); JTextField jTextField3 = new JTextField(); JButton jButton2 = new JButton(); JScrollPane jScrollPane1 = new JScrollPane(); JTextArea jTextArea1 = new JTextArea(); ServerSocket server = null; Socket socket = null;BufferedReader instr =null;PrintWriter os=null ; //Construct the frame public Server() { jbInit(); } class MyThread extends Thread{//该线程负责接受数据 public void run(){ try{ while(true){ this.sleep(100); instr= new BufferedReader(new InputStreamReader(socket.getInputStream())); if(instr.ready()){ //检查是否有数据 jTextArea1.append("客户端: "+instr.readLine()+"\n"); } } }catch(Exception ex){} }

计算机网络--简单聊天程序的设计与实现

实验报告 课程计算机网络实验名称简单聊天程序的设计与实现第 1 页 一、实验目的 1.熟悉VisualC++的基本操作;掌握最基本的Client/Server(客户机/服务器)模式 的网络编程技术,并在此基础上实现更为复杂的网络编程。 2.基本了解基于对话框的windows应用程序的编写过程。 3.对于Windows Socket编程建立初步概念。 二、实验内容 1、按实验步骤中参考程序使用VC++设计出程序; 2、在第1步的基础上使用VC++或其他工具设计出一个能实现两个人聊天的网络程序。 三、实验原理 1.Windows Socket和套接字的基本概念; 程序分为服务端和客户端两个,其主要工作过程如图1所示: 服务器端:服务器程序首选启动,通过调用socket()函数建立一个套接字,然后调用bind()函数使套接字和本地网络地址联系在一起,再调用listen()使套接字做好侦听的准备,并规定它的请示队列的长度,之后就调用accept()来接收连接。客户机端:客户机程序也使用socket()建立套接字,然后调用connect()函数和服务器建立连接。连接一旦建立,客户机和服务器之间就可以通过调用read()和write()来发送和接收数据。 最后,等数据传送结束后,双方调用close()关闭套接字。 四、实验环境和实验工具 实验环境:Windows 平台、实验工具:VC++ 五、实验步骤 服务器端程序 (1)运行VC++,选择File --->New,弹出如图2所示的窗口。 (2)创建一个名为CS的工程:选中Projects中的MFC AppWizard[exe],在Project name中 输入Server,在Location中选择存储的目录,如本例中为D:\VC temp\.接着点击OK。 (3)在弹出的窗口中选择Dialog based,然后点击“Next”。出现图3所示的窗口,选择Windows Sockets,并输入服务器,点击“Next”. 如果忘了添加Windows Sockets选项,可以在文件头部添加下列语句进行补救: #include "Winsock.h" #include "Ws2tcpip.h" #pragma comment(lib,"Ws2_32.lib" ) 注:这些语句支持winsock2。 (4)其余窗口一直默认,点击“Next”直至“Finish”

java简单聊天小程序

网络编程java简单聊天小程序[下次修改成多线程的,这个必须等待对方输入结束,有机会修改成可视化窗口] By 刘汪洋 写入正确的ip地址即可正常用当然目前只停留在命令行界面 还没有写成可视化窗口界面 运行时请带上参数 如java TransServer 张三 Java TransClient 李四 ( 和刘正南在局域网试验的截图成功 这是修改后的 加上了姓名! ) (修改前的截图)

代码: 客户端: package com.baidu.chat; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import https://www.360docs.net/doc/6e14675486.html,.Socket; import https://www.360docs.net/doc/6e14675486.html,.UnknownHostException; // 简单聊天小程序客户端 public class TransClient { public static void main(String[] args)

{ if(args[0]==null) args[0] = "他"; startClient(args[0]); } private static void startClient(String name) { Socket sk = null; BufferedReader bufr = null; try { sk = new Socket("127.0.0.1",10000);// 1 创建 socket服务 bufr = new BufferedReader(new InputStreamReader(System.in));// 2 获取录入键盘 PrintWriter out = new PrintWriter(sk.getOutputStream(),true);// 3 获取输出流true表示自动刷新 BufferedReader bufIn = new BufferedReader(new InputStreamReader(sk.getInputStream()));// 4 获取输入流 // 5 发送获取 String text_send = ""; String text_get = ""; String ServerName = ""; System.out.print("聊天已开启..."+"\r\n"+"我说:");

java编写的简单局域网聊天室(适合初学者).

import java.awt.BorderLayout; import java.awt.Button; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Frame; import java.awt.Panel; import java.awt.Point; import java.awt.TextArea; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.io.FileWriter; import java.io.IOException; import https://www.360docs.net/doc/6e14675486.html,.DatagramPacket; import https://www.360docs.net/doc/6e14675486.html,.DatagramSocket; import https://www.360docs.net/doc/6e14675486.html,.InetAddress; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class GUI_Chat extends Frame { private static final long serialVersionUID = 1L; private TextArea viewTextArea = new TextArea(20, 1; private TextArea sendTextArea = new TextArea(; private TextField ipTextField = new TextField(20; private Button sendButton = new Button(" 发送" ; private Button clearButton = new Button(" 清屏" ; private Button logButton = new Button(" 记录" ; private Button shakeButton = new Button(" 震动" ; private Panel panel = new Panel(; private DatagramSocket socket ;

实现一对一聊天程序

实现一个一对一的聊天程序 一实习题目 实现一个一对一的聊天程序。其基本过程如下:服务器首先启动,创建套接字后等待客户的连接;客户启动以后,创建套接字,然后和服务器建立连接;连接建立后,客户机和服务器可以通过建立的套接字连接进行通信。服务器和客户端可以是一台电脑上的两个进程,也可以分别部署在两台电脑上。 二原理概述 本题是一个简单的聊天室程序,采用客户/服务器模式,分为客户端程序和服务器端程序。由于服务器只能支持一个客户,实际上是一个点对点通信的程序。客户端程序和服务器程序通过网络交换聊天字符串内容,并在窗口的列表框中显示。重点是流式套接字对象的使用,处理网络事件的方法。本此课程设计是利用网络聊天程序的基本设计思想,并按照网络通信的协议设计出来的一个基于UDP 的网络聊天程序。端口号拼接到IP地址即构成了套接字(socket)。套接字(socket)=(IP地址:端口号)。在网络编程时常常把套接字作为应用进程和运输层协议之间的接口。当应用进程(客户或服务器)需要使用网络进行通信时,必须首先发出socket系统调用,请求操作系统为其创建一个“套接字”。这个调用的实际效果是请求操作系统把网络通信所需要的一些资源分配给该应用进程。操作系统为这些资源的总和用一个叫做套接字描述符的号码来表示,然后把这个套接字描述符返回给应用进程。此后,应用进程所进行的网络操作都必须使用这个套接字描述符。 三设计方案 1 问题分析: 本次计算机网络与通信实习的任务是设计一个一对一的聊天程序。根据课程设计要求程序采用客户/服务器模式,分为客户端程序和服务器端程序。其基本过程如下:服务器首先启动,创建套接字后等待客户的连接;客户启动以后,创建套接字,然后和服务器建立连接;连接建立后,客户机和服务器可以通过建立的套接字连接进行通信。服务器和客户端可以是一台电脑上的两个进程,也可以分别部署在两台电脑上。客户端程序和服务器程序通过网络交换聊天字符串内容,并在窗口的列表框中显示。重点是流式套接字对象的使用,处理网络事件的方法。 2 设计思路: 程序采用VB语言编写,运用UDP面向无连接数据报协议完成实验,程序的核心是运用的空间为VB网络编程中的Winsock控件。数据之前不必建立连接,只需要将Winsock绑定到一个端口上,其他无连接协议的Winsock若想向此处发送数据,需要指明地址和端口。 (1)将RemoteHost 属性设置为另一台计算机的名称或者IP地址。 (2)将RemotePort 属性设置为另一台计算机Winsock控件所绑定的LocalPort 属性。 (3)调用Bind 方法,指定使用的LocalPort。 3 系统模块结构: 根据程序设计要求,设计出整个网络聊天程序的设计框图。

java课程设计聊天小程序

java课程设计聊天小程序

课程设计指导书 姓名学 号 班 级 一 班 课程名称Java课程设计课程性质 设计时间2010年11月4日——2010年12月31日设计名称聊天小程序 设计目的本次课程设计是对前面学过的面向对象的编程思想以及编程方法的一个总结、回顾和实践。开始设计前学生一定要先回顾以前所学的内容,明确本次设计所要用到的技术点并到网上搜索以及查阅相关的书籍来搜集资料。通过编写一个基于JA V A的应用系统综合实例,来掌握Java语言编程技巧。 设计要求1、使用图形用户界面。 2、能实现一个聊天室中多人聊天。 3、可以两人私聊。

计划与进度计划在两个月内完成任务,首先在前半个月内(11月4日--11月19日),构思通过网上(图书馆)的知识与课本上的相关内容的了解与认识,确认好选择的课题与怎样设计,基本的思路想好。十五天(11月19日--12月5日)内参考资料争取完成服务端的程序,在12月5日--12月20日完成客户端的程序设计,在12月20日—12月30日内完成实现报告的填写工作。在12月31日全面完成整个课题,并上交给老师。 任课教师意见备注

课程设计报告 课程: 学号: 姓名: 班级 教师: 时间

计算机科学与技术 设计名称:聊天小程序日期:2010 年 11月 4 日 设计内容:设计一个在图形界面下,实现一个聊天室中多人聊天,也可以私聊的聊天小程序 设计目的与要求:目的是为了更好的掌握java 这门课程的内容,同时更好的理解与掌握socket 编程,对所有面向对象的编程思想以及编程方法的一个总结、回顾和实践,掌握Java语言编程技巧。要求使用图形用户界面。能实现一个聊天室中多人聊天。可以两人私聊。(提示:使用socket通信)程序描述清晰准确,思路清晰,程序能够实现相应的功能。

JAVA课程设计--简单的网络聊天程序

本科课程设计课程设计题目:简单的网络聊天程序

课程设计报告1.设计目的:

序言 1.1 背景 在当今的信息时代,越来越多的聊天工具被应用,Java语言是当今流行的网络编程语言,它具有面向对象、与平台无关、安全、多线程等特点。使用Java语言不仅可以实现大型企业级的分布式应用系统,还能够为小型的、嵌入式设备进行应用程序的开发。面向对象的开发方法是当今世界最流行的开发方法,它不仅具有更贴近自然的语义,而且有利于软件的维护和继承。为了进一步巩固课堂上所学到的知识,深刻把握Java语言的重要概念及其面向对象的特性,锻炼我们熟练的应用面向对象的思想和设计方法解决实际问题的能力,开设了Java程序设计课程设计。 此次课程设计的题目为简单的聊天室,通过做巩固所学Java语言基本知识,增进Java语言编辑基本功,掌握JDK、JCreator等开发工具的运用,拓宽常用类库的应用。使我们通过该教学环节与手段,把所学课程及相关知识加以融会贯通,全面掌握Java语言的编程思想及面向对象程序设计的方法,为今后从事实际工作打下坚实的基础。 1.2 相关技术 CPU:Pentium 2.8GHz以上 内存:256MB以上 硬盘空间:80G以上 操作系统:Windows7 运行环境:eclips

2. 程序设计与实现 2.1需求分析 Java是一种简单的,面向对象的,分布式的,解释的,键壮的,安全的,结构中立的,可移植的,性能很优异的,多线程的,动态的语言。Java去掉了C++语言的许多功能,如:指针运算、结构、typedefs、#define,让Java的语言功能很精炼,并增加了一些很有用的功能,如自动收集碎片。这将减少平常出错的50%。而且,Java很小,整个解释器只需215K的RAM。 因此运用JAVA程序编写聊天室,实现简单聊天功能。本次课程设计做的是Java简单聊天室,它是图形界面、线程、流与文件等技术的综合应用,其界面主要采用了java.awt包,javax.swing包等。程序实现了聊天室的基本功能,其中有: (1)启动服务器:实现网络的连接,为注册进入聊天室做准备。 (2)启动客户端:实现网络的链接,可以进行正式的聊天 (3)发送信息:为用户发送信息提供平台。 (4)离开界面:使用户退出聊天室。 (5)关闭服务器:断开与网络的连接,彻底退出聊天室。

简易聊天应用程序的设计与实现模板

简易聊天应用程序的设计与实现

Java网络程序设计大作业分组报名表

目录 一、团队介绍及人员分工.............................................. 错误!未定义书签。 1.1 团队介绍............................................................. 错误!未定义书签。 1.2 人员分工............................................................. 错误!未定义书签。 二、作品概述 ................................................................. 错误!未定义书签。 2.1 创作背景............................................................. 错误!未定义书签。 2.2 功能概要............................................................. 错误!未定义书签。 2.3相关技术............................................................. 错误!未定义书签。 2.4 作品可行性分析 ................................................. 错误!未定义书签。 三、需求分析 ................................................................. 错误!未定义书签。 3.1 功能性需求......................................................... 错误!未定义书签。 3.2 非功能性需求 ..................................................... 错误!未定义书签。 四、作品实现 ................................................................. 错误!未定义书签。 4.1服务端界面实现 ................................................. 错误!未定义书签。 4.2客户端界面实现 ................................................. 错误!未定义书签。 4.3登录实现............................................................. 错误!未定义书签。

利用JAVA实现简单聊天室

利用JAVA实现简单聊天室 1.设计思路 Java是一种简单的,面向对象的,分布式的,解释的,键壮的,安全的,结构中立的,可移植的,性能很优异的,多线程的,动态的语言。而且,Java 很小,整个解释器只需215K的RAM。 因此运用JAVA程序编写聊天室,实现简单聊天功能。程序实现了聊天室的基本功能,其中有: (1)启动服务器:实现网络的连接,为注册进入聊天室做准备。 (2)注册登陆界面:填写基本信息如姓名等,可以供多人进入实现多人聊天功能。 (3)发送信息:为用户发送信息提供平台。 (4)离开界面:使用户退出聊天室。 (5)关闭服务器:断开与网络的连接,彻底退出聊天室。 2.设计方法 在设计简单聊天室时,需要编写5个Java源文件:Server.java、Objecting.java、LogIn.java、ClientUser.java、Client.java。 3 程序功能图及程序相关说明 (1)主功能框图

(2) 聊天室基本功能表 4.程序代码是说明 程序中引入的包: package Chat; import https://www.360docs.net/doc/6e14675486.html,.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*;

import java.io.*; (1)服务器端代码中用户自定义类: 类名:Server 作用:服务器启动 继承的接口名:ActionListener public class Server implements ActionListener{ 定义的对象: count //记录点机关闭按钮次数2次关闭 soconly //只有SOCKET,用于群发 sockets//所有客户的SOCKET socket_thread //Socket所在的线乘,用于退出;frame // 定义主窗体 panel //定义面板 start,stop //启动和停止按钮 主要成员方法: public void center //定义小程序查看器的位置 public void actionPerformed //定义处理异常机制 定义子类:serverRun,Details 继承的父类名:Thread class serverRun extends Thread //启线乘用于接收连入的Socket class Details extends Thread //具体处理消息的线乘,只管发送消息创建一个ServerSocket 对象,用于接受指定端口客户端的信息 ServerSocket server = new ServerSocket("1234"); 接受请求时候,通过accept()方法,得到一个socket对象。 Socket socket = server.accept(); 通过socket创建流(输入,输出)。 BufferedReaderbr=newBufferedReader(newInputStreamReader (socket.getInputStream())) DataInputStream dis = new DataInputStream(socket.getInputStream());

基于socket简易聊天程序毕业设计(论文)

简单的socket程序 虽然很简单,但还是调试了很长时间。本科时候接触过socket——那个帅帅的刘 老师的课,现在重新再捡起来。 程序中专门建立一个FunThread线程用来接收数据,实现双向通信,也可以连续发送、连续接收。代码贴上来,如果还能保留VA View那样的颜色区别就好看 了,但是试了好几遍都不行 server: #include #include #define PORT 6000 //服务器端口 #define MSGSIZE 1024 //收发缓冲区的大小 #pragma comment(lib, "ws2_32.lib") //链接静态库 DWORD WINAPI FunThread(LPVOID); //创建一个线程,专门用来接收数据 SOCKET sClient; //连接所用套节字 SOCKET sListen; //监听套接字 SOCKADDR_IN client; //保存客户的地址信息 int iaddrSize = sizeof(SOCKADDR_IN); int main() { WSADATA wsaData; SOCKADDR_IN local; char s_Message[MSGSIZE]; //收发缓冲区 WSAStartup(0x0202, &wsaData); //Initialize Windows socket library sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器监听套节字。TCP协议 local.sin_family = AF_INET; //AF_INET指明使用TCP/IP协议族 local.sin_port = htons(PORT);//指明连接服务器的端口号 local.sin_addr.s_addr = htonl(INADDR_ANY);//自动获取本机地址 bind(sListen, (struct sockaddr *)&local, sizeof(SOCKADDR_IN));//地址绑定到套接字

若干个经典的Java小程序源代码

一个Java小程序源代码(反转字符串)//BorderLayoutTest.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; import javax.swing.event.*; public class test1 { public static void main(String[] args) { cloneFrame frame = new cloneFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.show(); } } class cloneFrame extends JFrame { public cloneFrame() {

setTitle("机试程序"); setSize(600, 400); JPanel buttonPanel = new JPanel(); buttonPanel.setBackground(new Color(56,43,85)); Button1 = new JButton("点击复制反转字符串"); Button1.addActionListener(new turnListener()); buttonPanel.add(Button1); JPanel textPanel = new JPanel(); textPanel.setBackground(new Color(100,100,100)); field1 = new JTextField("姓名:老孙;学号:2004132028", 20); field2 = new JTextField("反转", 20); field2.setEditable(false); textPanel.add(field1); textPanel.add(field2); JPanel tuPanel = new JPanel();

基于TCP的简单一对一聊天程序设计

基于TCP的简单一对一聊天程序设计 一、课程设计目的 1、通过课程设计,使学生理论联系实际,在实践中进一步了解计算机网络体系结构,深入理解TCP/IP参考模型 2、培养学生分析、解决问题的能力,提高学生动手能力。 3、使学生掌握搜集资料、调查研究、整理报告的方法。 4、初步掌握网络应用程序开发技术以及互联网的应用技术。 二、课程设计的要求及原理 1、课程设计要求。实现一个一对一的聊天程序。其基本过程如下:服务器首先启动,创建套节字等待客户连接;客户启动以后,创建套届字,然后和服务器建立连接;连接建立以后,客户机和服务器可以通过建立的套节字连接进行通信。服务器和客户端可以是一台电脑上的两个进程,也可以使分别部署在两台电脑上。 2、课程设计原理。 客户服务器模型。它是指客户/服务器模型是所有网络应用的基础。客户/服务器分别指参与一次通信的两个应用实体,客户方主动地发起通信请求,服务器方被动地等待通信的建立。它是一个在建立分布式应用时最常用的范例。在这种方案中客户应用程序向服务器程序请求服务。这种方式隐含了在建立客户机/服务器间通讯时的非对称性。客户机/服务器模型工作时要求有一套为客户机和服务器所共识的惯例来保证服务能够被提供(或被接受)。这一套惯例包含了一套协议。它必须在通讯的两头都被实现。根据不同的实际情况,协议可能是对称的或是非对称的。在对称的协议中,每一方都有可能扮演主从角色;在非对称协议

中,一方被不可改变地认为是主机,而另一方则是从机。无论具体的协议是对称的或是非对称的,当服务被提供时必然存在"客户进程"和"服务进程"。一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户对这个服务的地址提出了连接请求。在这个时刻,服务程序被"惊醒"并且为客户提供服务-对客户的请求作出适当的反应。虽然基于连接的服务是设计客户机/服务器应用程序时的标准,但有些服务也是可以通过数据报套接口提供的。 相关协议。应用到的网络协议主要有TCP协议。TCP协议被称作一种端对端协议。这是因为它为两台计算机之间的连接起了重要作用:当一台计算机需要与另一台远程计算机连接时,TCP协议会让它们建立一个连接、发送和接收资料以及终止连接。传输控制协议TCP协议利用重发技术和拥塞控制机制,向应用程序提供可靠的通信连接,使它能够自动适应网上的各种变化。即使在Internet 暂时出现堵塞的情况下,TCP也能够保证通信的可靠。IP协议只保证计算机能发送和接收分组资料,而TCP协议则可提供一个可靠的、可流控的、全双工的信息流传输服务。 三、设计方案 首先本程序的定位是一对一的聊天程序;程序没有采用图形界面;程序的设计语言采用的是C++;基于winsock;开发工具为VC++。 聊天程序的设计可以采用UDP或者TCP,程序采用TCP。采用的是客户服务器模型。在本程序中,一个用户作为Server端,另一个用户作为Client端。也就是说,作为Server端的用户,需要首先启动程序,等待Client端的连接请求。Client端自动建立连接请求。当TCP连接握手以后,双方方可进行交互。

Java swing实现简单的聊天室可发信息传文件

大家好,今天给大家演示一下如何用Java swing实现一个简单的聊天室系统,源码已经写好了,这里演示一下怎么导入运行,该系统基于cs架构,即客户端和服务端,采用socket通信方式,该项目可运行在任何Java环境下,jdk版本不限,一般来说网络编程都是大家的弱项,所以此项目可以用来好好学习一下Java关于网络方面的编程知识点。下面我们来看看导入运行步骤。 1.将源码导入到eclipse中(源码有客户端和服务端,必须先启动服务端客户端才可以使用)。 2.服务端导入进来了,现在我们先开启服务端。 3.服务端已开启,接下来导入客户端。 4.发现客户端导入后有个错误,一般是jre和jar包的问题,我们来配置一下,配置了jre后发现错误没有了,接下来我们来运行客户端。客户端运行结果如下: 由于第一次运行,没有账号,所以我们先注册一个账号,点击注册按

钮,注册界面如下图所示: 注册成功后我们用刚注册好的账号登录进去,如下所示: 登录上线后有声音提示,由于要聊天,所以我们还得再注册一个账号,

实现两个人之间的聊天。 再次运行login类,再启动一个程序。此时可以发现,在右侧的在线列表里面多了一个人,选择相应的人就可以聊天了。 我们来试试,下面是一些操作截图(双击右侧的在线好有就可以发文件):

上面是发信息的一些操作,下面我们来看看发文件的操作:

点击是后,文件就开始传送了,如下:

文件传完了,我们打开看看可以不可以,文件传输正常,视频可以播放。好了今天的演示就到这里吧,对这个源码感兴趣的可以加我V:qixinfang002获取源码,备注项目名称哦,适当收取一点搬运费哦!介意的勿扰!此外本人在工作学习过程中还收集整理了大量的经典项目,有需要的可以看看我的博客, 博客地址: Java项目地址:

基于CS简单聊天程序课程设计

计算机网络课程设计任务书

基于C/S模式的简单聊天程序设计说明书 学院名称:计算机与信息工程学院 班级名称:网络工程142 学生:三 学号:2014211540 题目:基于C/S模式的简单聊天程序 指导教师 姓名:海宝 起止日期:2016.6.13-2016.6.26

目录 一、选题背景 (1) 二、方案论证 (1) 三、过程论述 (2) 3.1 服务器端 (2) 3.2 客户机端 (10) 四、结果分析 (20) 五、结论 (21)

第一部分:正文部分 一、选题背景 使用Socket实现网上聊天功能。用户可以通过客户端连接到服务器端并进行网上聊天。聊天时可以启动多个客户端。 服务器端启动后,接收客户端发来的用户名和密码验证信息。验证通过则以当前的聊天客户列表信息进行响应;此后接收客户端发来的聊天信息,转发给客户端指定的聊天客户(即私聊)或所有其他客户端;在客户断开连接后公告其退出聊天系统的信息。 客户端启动后在GUI界面接收用户输入的服务器端信息、账号和密码等验证客户的身份。验证通过则显示当前系统在线客户列表。客户可以与指定对象进行私聊,也可以向系统中所有在线客户发送信息。 二、方案论证 基于C/S的简单聊天室可以实现用户与服务器间,服务器与多个用户间的通信。 聊天室程序通常需要完成以下一些基本功能: (1)登录聊天室; (2)启动服务器; (3)关闭服务器; (4)用户之间的聊天; (5)退出聊天室。 本系统其体功能需求如下: (1)聊天室管理员经登录界面登录到管理界面,即系统的服务器端。用户

经登录界面进入聊天大厅。 (2)不论是管理员还是用户都需要在登录界面输入正确的用户名和密码后 才可以登录到各自的界面中去。 (3)系统的两个主要界面都是为方便管理员和用户操作的。首先,管理员 进入到管理界面后可以方便的启动/停止服务器,看到在线用户的信息和聊天信息。用户进入到聊天大厅中可以聊天,查看服务器状态。 (4) 一个用户退出聊天室对其他用户不能产生影响,而服务器断开与客户 端的连接则所有的用户都失去与服务器的连接。 (5)用户的聊天信息录入,重写,发送,接收方便,快捷。 (6)服务器状态,聊天信息和在线用户人数及时刷新。 (7)聊天室系统运行稳定、安全性高、 三、过程论述 3.1 服务器端 (1)首先实现的是服务器开始工作界面,如图3-1所示: 图3-1

java简单聊天程序实验报告及代码

一、实验内容 实验题目: 1、使用URL访问用户指定网站,获取该网页的HTML代码显示给用户,并能保存至指定文件中。 2、使用ServerSockt,Socket对象实现两个用户之间的端到端聊天。 要求:采用UI界面设计,界面友好。 二、实验过程 (这是实验报告极其重要的内容。要抓住重点,可以从理论和实践两个方面考虑。这部分要写明依据什么知识点以及使用方法进行实验以及实验步骤。不要简单照抄实习指导,更不可写一大堆源代码) 题目1、 1、分析题目,了解URL类及其方法。 2、设计一个模拟浏览器界面,有一个文本框,文本区域,一个搜索按钮,一个保存按钮。 3、在搜索事件里面写获取HTML的代码,在保存你面写将内容保存至文件中。 题目2、 1、分析题目,了解import https://www.360docs.net/doc/6e14675486.html,.*,包下用到的一些类,比如URL, Socket和ServerSocket,以及这些类的方法,根据要实现的功能,进行调用。了解端到端的通讯,以及怎样建立连接。 2、设计界面:服务器界面,客户端界面。 3、写出对内容的读写代码,注意哪部分功能,在什么时候实现,应该写在哪部分。以及怎样通信:如图 三、实验结果 (应先列出测试数据,要写明实验的现象,实验数据的处理等。对于实验结果的表述,一般有三种方法:文字叙述(根据实验目的将实验结果系统化、条理化,用准确的专业术语客观地描述实验现象和结果,要有时间顺序以及各项指标在时间上的关系),图表(用表格或坐标图的方式使实验结果突出、清晰,便于相互比较,尤其适合于分组较多,且各组观察指标

一致的实验,使组间异同一目了然;每一图表应有表目和计量单位,应说明一定的中心问题),屏幕截图(实验结果也可以是屏幕截图,充分表明实验的实际情况)。在实验报告中,可任选其中一种或几种方法并用,以获得最佳效果。) 题目一、 界面与结果截图: 题目2、 服务器端截屏: 客户端截屏:

简易聊天工具详细设计报告

简易聊天工具总体设计报告 班级:网络工程10-1班 姓名: 学号: 08103609 指导老师: 目录

一、引言 (1) 设计聊天工具的背景及意义 (1) 课题现状 (1) 开发平台介绍 (1) 二、需求分析 (2) 编写目标 (2) 可行性分析 (2) 分析需求 (2) 2.3.1 功能需求分析 (2) 2.3.2 数据需求分析 (2) 2.3.3 性能需求分析 (3) 2.3.4系统运行需求 (3) 本系统的主要功能部分组成: (3) 2.4.1服务器端模块 (3) 2.4.2客户端模块 (3) 数据流图 (4) 2.5.1 顶层数据流图 (4) 2.5.2一层数据流图 (4) 2.5.3二层数据流图 (5) 三、概要设计 (6) 系统总模块图 (6) 模块功能之间的关系 (7) 3.2.1服务器端模块 (7) 3.2.1.1用户上下线识别及显示模块 (7) 3.2.1.2信息识别转发模块 (7) 3.2.2客户端模块 (7)

3.2.2.1用户注册模块 (7) 3.2.2.2用户登陆模块 (7) 3.2.2.3用户密码修改模块 (7) 两大模块工作流程 (8) 系统数据结构设计 (9) 3.4.1数据逻辑设计 (9) 3.4.2数据字典 (9) 四、详细设计与编码实现 (10) 服务器端详细设计 (10) 4.1.1服务器界面设计 (10) 4.1.2服务器程序类 (11) 4.1.3服务器端连接用户的线程设计 (12) 4.1.4服务器端线程的管理 (13) 客户端的详细设计 (13) 4.2.1界面包的设计(view包) (14) 4.2.1.1用户登录界面 (14) 4.2.1.2用户好友列表界面 (15) 4.2.1.3用户聊天界面 (18) 4.2.2模块包的设计(model包) (19) 4.2.2.1客户端连接服务器类 (19) 4.2.2.2客户检查使用者类 (20) 4.2.3用户端工具包的设计(tools包) (21) 4.2.3.1客户端连接服务器线程类 (21) 4.2.3.2管理客户端连接服务器线程类 (22) 4.2.3.3管理用户的聊天界面的类 (23) 4.2.3.4管理好友列表、黑名单界面类 (23)

java经典小程序,java入门100例!

1,编写程序,判断给定的某个年份是否是闰年。 闰年的判断规则如下: (1)若某个年份能被4整除但不能被100整除,则是闰年。 (2)若某个年份能被400整除,则也是闰年。 import java.util.Scanner; class Bissextile{ public static void main(String[] arge){ System.out.print("请输入年份"); int year; //定义输入的年份名字为“year” Scanner scanner = new Scanner(System.in); year = scanner.nextInt(); if (year<0||year>3000){ System.out.println("年份有误,程序退出!"); System.exit(0); } if ((year%4==0)&&(year%100!=0)||(year%400==0)) System.out.println(year+" is bissextile"); else System.out.println(year+" is not bissextile "); } } 2,给定一个百分制的分数,输出相应的等级。 90分以上 A级 80~89 B级 70~79 C级 60~69 D级 60分以下 E级 import java.util.Scanner; class Mark{ public static void main(String[] args){ System.out.println("请输入一个分数"); //定义输入的分数为“mark”,且分数会有小数 double mark; Scanner scanner = new Scanner(System.in); mark = scanner.nextDouble(); //判断是否有输入错误。 if(mark<0||mark>100){

相关文档
最新文档