南昌航空大学实验报告
课程名称: 计算机网络 实验名称: Socket编程实现聊天程序 班 级: 090451班 学生姓名: 杨 望 学号: 09045131 指导教师评定: 签 名:
一、
实验目的:
1、 掌握网络应用程序的开发方法;
2、 掌握Client/ Server结构软件的设计与开发方法 3、 掌握Socket机制的工作原理。
二、
实验题目:
使用Win32 Socket 函数实现聊天程序:能相互对发文本消息。
三、 服务端与客户端连接工作流程图:
开始 监听 有新客户端请 求连接服务器 不允许 允许连接? 提示错误信息 允许 建立连接 更新用户信息
四、收发消息工作流程图:
1
向客户端B 发送消息 监听 是 用户B在上线 ? 是用户B在忙碌 ? 是 用户B在隐身 ? 否发送给 用户B在离线? 客户端B 发送给服务器
五、 实验代码: 1、服务器端: package yuchen;
import java.io.BufferedReader; import java.io.IOException;
import java.io.InputStreamReader; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket;
import java.util.StringTokenizer; import java.util.Vector; public class ChatServer { static int port = 5566;//端口号 static Vector
2
clients.add(client);//增加客户线程到向量中 client.start();//启动线程 notifyChatRoom(); //监视聊天室连接变化} } catch (Exception ex) { ex.printStackTrace();//输出出错信息}} public static void notifyChatRoom() { //监视客户端线程 StringBuffer newUser = new StringBuffer(\ for (int i = 0; i < clients.size(); i++) { Client c = (Client)clients.elementAt(i); newUser.append(\客户端姓名字符串} sendClients(newUser);//发送信息到客户端} public static void sendClients(StringBuffer message) { for (int i= 0 ; i < clients.size(); i++) { Client client = (Client)clients.elementAt(i);//分别得到每个客户端的连接 client.send(message);//发送信息}} public void closeAll() { //关闭所有连接 while (clients.size() > 0 ) { //遍历整个Vector Client client = (Client) clients.firstElement(); //得到一个客户端 try {client.socket.close(); } catch(IOException ex) { ex.printStackTrace(); // 输出错误信息} clients.removeElement(client); //移出客户端}} public static void disconnect(Client c) {// 断开客户端 try {System.err.println(c.ip+\断开连接\\n\ } catch (Exception ex) { ex.printStackTrace();} clients.removeElement(c); c.socket = 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(s.getInputStream())); ps = new PrintStream(s.getOutputStream());//得到输出流 String info = reader.readLine();//读取接收到的信息 StringTokenizer stinfo = new StringTokenizer(info,\分解字符串 String head = stinfo.nextToken(); //获取关键字 System.out.println(stinfo.toString()); System.out.println(head);
3
if (stinfo.hasMoreTokens()){ name = stinfo.nextToken() ;//获取用户名} if (stinfo.hasMoreTokens()) { ip = stinfo.nextToken(); //获取IP地址} } catch (IOException ex) { ex.printStackTrace();} System.out.println(name); System.out.println(ip); } public void send (StringBuffer msg) { ps.println(msg); //输出信息 ps.flush();} public void run() { while (true) { String line = null; try {line = reader.readLine(); System.out.println(\ } catch (IOException ex) { ex.printStackTrace(); //输出错误信息 ChatServer.disconnect(this);//断开连接 ChatServer.notifyChatRoom();//更新信息 return ; } if (line == null) { //客户离开 ChatServer.disconnect(this); ChatServer.notifyChatRoom(); return ;} StringTokenizer st = new StringTokenizer(line,\分解字符串 String keyword = st.nextToken(); if (keyword.equals(\发送来的聊天信息 StringBuffer msg = new StringBuffer(\ msg.append(name); //在信息上增加用户名 msg.append(st.nextToken(\ ChatServer.sendClients(msg);//发送聊天语句到各个客户端 System.out.println(msg); } else if (keyword.equals(\退出命令 ChatServer.disconnect(this); //断开连接 ChatServer.notifyChatRoom(); //刷新信息}}}}} 2、客户端:package yuchen; import java.awt.BorderLayout; import java.awt.Button; import java.awt.Color; import java.awt.Label; import java.awt.TextArea; import java.awt.TextField;
import java.awt.event.ActionEvent;
4
import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException;
import java.io.InputStreamReader; import java.io.PrintStream; import java.net.InetAddress; import java.net.Socket;
import java.util.StringTokenizer; import javax.swing.JFrame;
import javax.swing.JOptionPane; import javax.swing.JPanel;
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);//聊天输入 java.awt.List list1 = new java.awt.List(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 {this.chatClient = client; this.socket = socket; this.cname = name; reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); ps = new PrintStream(socket.getOutputStream()); } catch (IOException e) { e.printStackTrace();}} public void run() { while (true) { String line=null ; try { line = reader.readLine(); //读取数据流 System.out.println(\客户端:\ ex.printStackTrace(); ps.println(\断开连接
5
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库网络实验6Socket编程实现聊天程序在线全文阅读。
相关推荐: