今天开始自己学习java后第一个小项目的编写——“一个小型的聊天窗口互动小模型”,从昨天晚上开始看有关内容,今天早晨继续,算是完成了最初步的一些工作...现在来做一个小小的总结:
Chat0.1版本: 仅仅是new出来一个Frame的窗口,作为Client端;
Chat0.2版本: 在此Frame窗口内添加了TextFiled和TextArea,完善了Client端窗口的搭建。
Chat0.3版本: 仅仅添加了一个匿名类完成对Client端的关闭工作。
Chat0.4版本: 完成将TextField中输入的内容,显示到TextArea中的功能。
在这里,我将这4个版本合在一起,称为MyChat0.1版本:
import java.awt.*;
import java.awt.event.*;
public class ChatClient extends Frame{
TextField tfTxt = new TextField();
TextArea taContent = new TextArea();
public static void main(String[] args) {
new ChatClient().launchFrame();
}
public void launchFrame() {
setLocation(400, 300);
setSize(300, 300);
add(tfTxt, BorderLayout.SOUTH);
add(taContent, BorderLayout.NORTH);
// taContent.setBackground(Color.LIGHT_GRAY);
pack();
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
setVisible(false);
System.exit(-1);
}
});
tfTxt.addActionListener(new TFListener());
setVisible(true);
}
private class TFListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String s = tfTxt.getText().trim();
taContent.setText(s);
tfTxt.setText("");
}
}
}
得到结果为:
Chat0.5版本: 增加了Server端,实现Sever端的基本功能。
Chat0.6版本: 在Clint端添加方法Connect(),实现和Server端建立联接的功能;并在实现ActionListener接口时添加代码,将Client端TextField中输入的内容在Server端输出;在Server端添加必要代码,接收Client端传来的数据。
这里,我将这两个版本合并在一起,称为MyChat0.2版本:
ChatServer.java为:
import java.io.*;
import java.net.*;
public class ChatServer {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(8888);
while (true) {
Socket s = ss.accept();
System.out.println("a client connected!");
DataInputStream dis = new DataInputStream(s.getInputStream());
String str = dis.readUTF();
System.out.println(str);
dis.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
ChatClient.java为:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class ChatClient extends Frame{
Socket s = null;
TextField tfTxt = new TextField();
TextArea taContent = new TextArea();
public static void main(String[] args) {
new ChatClient().launchFrame();
}
public void launchFrame() {
setLocation(400, 300);
setSize(300, 300);
add(tfTxt, BorderLayout.SOUTH);
add(taContent, BorderLayout.NORTH);
// taContent.setBackground(Color.LIGHT_GRAY);
pack();
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
setVisible(false);
System.exit(-1);
}
});
tfTxt.addActionListener(new TFListener());
setVisible(true);
connect();
}
private void connect() {
try {
s = new Socket("127.0.0.1", 8888);
System.out.println("connected!");
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private class TFListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String str = tfTxt.getText().trim();
taContent.setText(str);
tfTxt.setText("");
try {
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
dos.writeUTF(str);
dos.flush();
dos.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
在Client窗口输入"FIRST",运行结果为:
但是当第二次在Client窗口输入"SECOND”时,程序抛出异常,如图:
异常显示提示:Socket已经关闭,检查程序,发现在ChatClient.java里有dos.close()语句关闭了Socket,应去掉此语句。将在MyChat0.3中改进。
Chat0.7版本同0.6,嘿嘿,貌似0.6版本改太多了。。。
Chat0.8版本: 在ChatClient.java里注释掉dos.close()语句,将DataOutputStream dos变为外部类成员变量,增加disconnect()方法;在ChatServer.java里修改while(true)语句。
在这里,我将Chat0.8版本修改的内容分开,在我的MyChat0.3版本里,实现Chat0.8版本分号前的变化。在MyChat0.4版本里,实现Chat0.8版本分号后的变化:
ChatServer.java同0.2版本,ChatClient.java为:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class ChatClient extends Frame{
Socket s = null;
DataOutputStream dos;
TextField tfTxt = new TextField();
TextArea taContent = new TextArea();
public static void main(String[] args) {
new ChatClient().launchFrame();
}
public void launchFrame() {
setLocation(400, 300);
setSize(300, 300);
add(tfTxt, BorderLayout.SOUTH);
add(taContent, BorderLayout.NORTH);
// taContent.setBackground(Color.LIGHT_GRAY);
pack();
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
setVisible(false);
disconnect();
System.exit(-1);
}
});
tfTxt.addActionListener(new TFListener());
setVisible(true);
connect();
}
private void connect() {
try {
s = new Socket("127.0.0.1", 8888);
dos = new DataOutputStream(s.getOutputStream());
System.out.println("connected!");
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void disconnect() {
try {
dos.close();
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private class TFListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String str = tfTxt.getText().trim();
taContent.setText(str);
tfTxt.setText("");
try {
dos.writeUTF(str);
dos.flush();
// dos.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
最后得到结果: 解决了0.2版中Client一方不能多次输入的问题,但是在Server端出现新问题,即在Client端第二次及以后输入的数据在Server端无法显示。这是因为Server端String str = dis.readUTF();为阻塞式语句,代码会一直停在那里等待read,不能回到之前代码ServerSocket ss = new ServerSocket(8888);和DataInputStream dis = new DataInputStream(s.getInputStream());MyCaht0.4版本将通过修改while(true)的方式解决这一问题。
MyChat0.4版本ChatClient.java同0.3版本,ChatServer.java代码如下:
import java.io.*;
import java.net.*;
public class ChatServer {
public static void main(String[] args) {
boolean started = false;
try {
ServerSocket ss = new ServerSocket(8888);
started = true;
while (started) {
boolean bConnected = false;
Socket s = ss.accept();
System.out.println("a client connected!");
bConnected = true;
DataInputStream dis = new DataInputStream(s.getInputStream());
while (bConnected) {
String str = dis.readUTF();
System.out.println(str);
}
dis.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
得到结果如图:
解决了之前两个版本的小BUG。
但是,当关闭窗口时,系统会抛出如下所示的异常:
java.io.EOFException
at java.io.DataInputStream.readUnsignedShort(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at ChatServer.main(ChatServer.java:17)
这是因为
Server端String str = dis.readUTF()语句造成的!
- 大小: 12.5 KB
- 大小: 34.2 KB
- 大小: 106.6 KB
- 大小: 33 KB
分享到:
相关推荐
基于C/S模型的聊天工具,主要用的是Delphi7,还有数据库,希望对大家有帮助
ChatALL是一个聊天工具,可以同时与多个聊天模型进行交互,包括ChatGPT、Bing chat、bard、羊驼、Vincuna、Claude、ChatGLM、MOSS、科大讯飞Spark和ERNIE等。它的目标是通过与多个聊天模型对话,从中发现最佳答案,...
WSAAsyncSelect实现简单聊天工具——包含客户端和服务器端
本聊天工具是模拟QQ,使用MFC编写的基于C/S模型的聊天工具,并有数据库支持
使用VC6编写的TCP协议的Socket通信程序,总共分三套程序,Server端、教师端、学生端,是一套教学软件的一个模型框架,可以学习编程,也可以基于其进行进一步开发,这套是Server。
基于DES和RSA的加密聊天工具,共包含4个文件: chat.cpp、des.h、rsa.h、makefile。 编译:命令行模式下,切换到代码所在目录,输入make后回车即可。 运行:命令行模式下输入 ./chat,然后选择程序执行角色(客户端或...
设计实现了一个基于C/S模型下的网络聊天工具,主要具有以下功能(服务端使用并发服务器) 1) 用户注册、登录 2) 支持多人聊天 3) 支持离线消息 实现扩展要求: 1) 该工具具有友好的用户界面和服务器界面 2) ...
为了让在局域网内的用户能够轻松地进行聊天和文件共享,我们设计了一种无固定服务器纯P2P的通讯模型,用户与用户之间就靠软件的协议进行通讯。本文主要对这种模型的设计、原理和实现进行了详细的阐述,并且对在此...
基于GPT-3.5大语言模型,用于理解、回应和查询用户上传PDF相关内容的聊天式界面工具 GPT, 通常指的是“Generative Pre-trained Transformer”(生成式预训练转换器),是一个在自然语言处理(NLP)领域非常流行的...
这是一个提供给unity开发者的工具库,用于快速实现AI聊天相关功能。目前这个库包含了对chatgpt、rwkv以及chatglm等大语言模型的api调用的代码实现以及实现了微软Azure以及百度AI的语音合成、语音识别的web api接入。...
局域网聊天工具 群聊私聊 多信道文件传输 语音 一年前的作品 还有一些bug未调试 不过功能基本实现。 选择自己想知道的模块看看吧 用的异步IO模型
看书做的一个小例子,可以在局域网内发信息,只是个小模型,但也是用来开发更好的东东,做复杂了看起来了也不方便
使用VC6编写的TCP协议的Socket通信程序,总共分三套程序,Server端、教师端、学生端,是一套教学软件的一个模型框架,可以学习编程,也可以基于其进行进一步开发,这套是学生端。
使用VC6编写的TCP协议的Socket通信程序,总共分三套程序,Server端、教师端、学生端,是一套教学软件的一个模型框架,可以学习编程,也可以基于其进行进一步开发,这套是教师端。
早些时候实现的通信功能比较弱,因为没有引入多线程和异步通信模型,只能Server发一句,Client发一句。本例已经实现了这些功能,不过还有需要改进的地方,例如只能一台Server和一台Client进行通信。如何实现一台...
C/S架构,采用select模型,消息由服务器转发
ChatGPT是美国人工智能研究实验室OpenAI新推出的一种人工智能技术驱动的自然语言处理工具,使用了Transformer神经网络架构,也是GPT-3.5架构,这是一种用于处理序列数据的模型,拥有语言理解和文本生成能力,尤其是...
无论您是构建聊天机器人、自然语言处理应用还是进行大规模数据分析,这一资源都将是您的强大工具。 此外,我们为您提供了持续的技术支持和资源更新,以确保您的项目始终保持在技术领域的前沿。无需担心高昂的费用,...