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 clients = new Vector(10);//存储连接客户信息

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


本文标签: 连接 信息 客户端