admin 管理员组文章数量: 887044
2023年12月22日发(作者:程序和流程有什么区别)
南昌航空大学实验报告
课程名称: 计算机网络 实验名称: Socket编程实现聊天程序
班 级: 090451班 学生姓名: 杨 望 学号: 09045131
指导教师评定: 签 名:
一、 实验目的:
1、 掌握网络应用程序的开发方法;
2、 掌握Client/ Server结构软件的设计与开发方法
3、 掌握Socket机制的工作原理。
二、 实验题目:
使用Win32 Socket 函数实现聊天程序:能相互对发文本消息。
三、 服务端与客户端连接工作流程图:
开始
监听
有新客户端请
求连接服务器
不允许
允许连接?
提示错误信息
允许
建立连接
更新用户信息
四、收发消息工作流程图:
1
向客户端B
发送消息
监听
是 用户B在上线 ?
是用户B在忙碌 ?
是 用户B在隐身 ?
否发送给
用户B在离线?
客户端B
发送给服务器
五、 实验代码:
1、服务器端:
package yuchen;
import edReader;
import ption;
import treamReader;
import tream;
import Socket;
import ;
import Tokenizer;
import ;
public class ChatServer {
static int port = 5566;//端口号
static Vector
static ServerSocket server = null; //建立服务器socket
static Socket socket = null; //套接字连接
public ChatServer() {
try {n("");
server = new ServerSocket(port); //初始化服务器套接字
while (true) {
socket = (); //等待连接
n(tAddress()+"连接n");//得到客户机地址
Client client = new Client(socket);
2
(client);//增加客户线程到向量中
();//启动线程
notifyChatRoom(); //监视聊天室连接变化}
} catch (Exception ex) {
tackTrace();//输出出错信息}}
public static void notifyChatRoom() { //监视客户端线程
StringBuffer newUser = new StringBuffer("newUser");
for (int i = 0; i < (); i++) {
Client c = (Client)tAt(i);
(":"+); //客户端姓名字符串}
sendClients(newUser);//发送信息到客户端}
public static void sendClients(StringBuffer message) {
for (int i= 0 ; i < (); i++) {
Client client = (Client)tAt(i);//分别得到每个客户端的连接
(message);//发送信息}}
public void closeAll() { //关闭所有连接
while (() > 0 ) { //遍历整个Vector
Client client = (Client) lement(); //得到一个客户端
try {();
} catch(IOException ex) {
tackTrace(); // 输出错误信息}
Element(client); //移出客户端}}
public static void disconnect(Client c) {// 断开客户端
try {n(+"断开连接n");
} catch (Exception ex) {
tackTrace();}
Element(c);
= null;}
public static void main(String[] args) {
new ChatServer();}
class Client extends Thread {
Socket socket;//连接端口
String name ;//用户姓名
String ip; //客户端ip地址
BufferedReader reader;//输入流
PrintStream ps;//输出流
public Client(Socket s) {socket = s;
try {reader = new BufferedReader(new InputStreamReader(utStream()));
ps = new PrintStream(putStream());//得到输出流
String info = ne();//读取接收到的信息
StringTokenizer stinfo = new StringTokenizer(info,":"); //分解字符串
String head = ken(); //获取关键字
n(ng());
n(head);
3
if (eTokens()){
name = ken() ;//获取用户名}
if (eTokens()) {
ip = ken(); //获取IP地址}
} catch (IOException ex) {
tackTrace();}
n(name);
n(ip);
} public void send (StringBuffer msg) {
n(msg); //输出信息
();}
public void run() {
while (true) {
String line = null;
try {line = ne();
n("line:"+line);
} catch (IOException ex) {
tackTrace(); //输出错误信息
nect(this);//断开连接
ChatRoom();//更新信息
return ; }
if (line == null) { //客户离开
nect(this);
ChatRoom();
return ;}
StringTokenizer st = new StringTokenizer(line,":");//分解字符串
String keyword = ken();
if (("MSG")) { //发送来的聊天信息
StringBuffer msg = new StringBuffer("MSG:");
(name); //在信息上增加用户名
(ken("0n"));
ients(msg);//发送聊天语句到各个客户端 n(msg);
} else if (("quit")) { //退出命令
nect(this); //断开连接
ChatRoom(); //刷新信息}}}}}
2、客户端:package yuchen;
import Layout;
import ;
import ;
import ;
import ea;
import eld;
import Event;
4
import Listener;
import edReader;
import ption;
import treamReader;
import tream;
import dress;
import ;
import Tokenizer;
import ;
import nPane;
import ;
public class ChatClient extends JFrame implements ActionListener ,Runnable
TextField tfName = new TextField(15);//姓名输入文本域
Button btConnect = new Button("连接");//连接按钮
Button btDisconnect = new Button("断开连接");//断开连接按钮
TextArea tfChat = new TextArea(8,27);//显示聊天信息文本域
Button btSend = new Button("发送");
TextField tfMessage = new TextField(30);//聊天输入
list1 = new (9);//显示在线用户信息
Socket socket = null;//连接端口
PrintStream ps = null;//输出流
Listen listen = null;
class Listen extends Thread {
BufferedReader reader;
PrintStream ps;
String cname;
Socket socket;
ChatClient chatClient;
public Listen(ChatClient client,String name,Socket socket) {
try {ient = client;
= socket;
= name;
reader = new BufferedReader(new InputStreamReader(utStream()));
ps = new PrintStream(putStream());
} catch (IOException e) {
tackTrace();}}
public void run() {
while (true) {
String line=null ;
try {
line = ne(); //读取数据流
n("客户端:"+line);}catch (IOException ex) {
tackTrace();
n("quit");; //断开连接
5
return;}
StringTokenizer stinfo = new StringTokenizer(line,":"); //分解字符串
String keyword = ken();
if (("MSG")) {
(line+"n");}
else if (("newUser")){
();
("users", 0);
int i = 1;
while (eTokens()) {
(ken(), i++);}}} }}
public void actionPerformed(ActionEvent e) {
try{if(rce()==btConnect) { //点击连接按钮
if (socket == null) {
socket = new Socket(alHost(),5566);
ps = new PrintStream(putStream());//获取输出流,写入信息
StringBuffer info = new StringBuffer("info:");
String userinfo = t()+":"+alHost().toString();
n((userinfo));//输出信息
();
listen = new Listen(this,t(),socket);
();}
} else if (rce() == btDisconnect) { //点击断开连接按钮
disconnect();
} else if (rce() == btSend) { //点击发送按钮
if (socket != null) {
StringBuffer msg = new StringBuffer("MSG:");
String msgtxt = new String(t());
n((msgtxt));//发送信息
();
} else {
ssageDialog(this, "请先连接!", "提示", 1);}}}
catch (Exception ex) {
tackTrace();//输出错误信息 }}
public void disconnect() { //断开连接方法
if (socket != null) {
n("quit");//发送信息
();
socket = null;
t("");}}
public ChatClient(Socket socket) {
out(new BorderLayout());
JPanel panel1 = new JPanel();
Label label = new Label("姓名");
6
kground();
(label);
(tfName);
(btConnect);
(btDisconnect);
(panel1,);
JPanel panel2 = new JPanel();
(tfChat);
(list1);
(panel2,);
JPanel panel3 = new JPanel();
Label label2 = new Label("聊天信息");
(label2);
(tfMessage);
(btSend);
(panel3,);
nds(50,50,400,350);
ible(true);
ionListener(this);
ionListener(this);
ionListener(this); }
public static void main(String[] args) {
ChatClient client = new ChatClient(new Socket());
n();}}}
六、 实验结果:
下面是杨和望的聊天记录:
7
七、 实验小结:
通过本次实验更好的掌握TCP和UDP网络编程。了解URL编程。掌握网络应用程序的开发方法;掌握Client/ Server结构软件的设计与开发方法掌握Socket机制的工作原理最后对于Java网络编程的知识有了更好的理解。
8
版权声明:本文标题:网络实验6Socket编程实现聊天程序 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1703199770h441983.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论