南昌航空大学实验报告
课程名称:   计算机网络    实验名称: Socket编程实现聊天程序 
    级:  ******班         学生姓名:  杨 望  学号:  ********
指导教师评定:            签    名:         
一、实验目的:
1、掌握网络应用程序的开发方法;
2、掌握Client/ Server结构软件的设计与开发方法
3、掌握Socket机制的工作原理。
二、实验题目:
使用Win32 Socket 函数实现聊天程序:能相互对发文本消息。
三、服务端与客户端连接工作流程图:
收发消息工作流程图:
五、实验代码:
1、服务器端:
package yuchen;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.ServerSocket;
import java.Socket;
import java.util.StringTokenizer;
import java.util.Vector;
public class ChatServer {
    static int port = 5566;//端口号
    static Vector<Client> clients = new Vector<Client>(10);//存储连接客户信息
    static ServerSocket server = null; //建立服务器socket
    static Socket socket = null; //套接字连接
    public ChatServer() {
        try {System.out.println("");
            server  = new ServerSocket(port); //初始化服务器套接字
            while (true) {
                socket = server.accept(); //等待连接
                System.out.InetAddress()+"连接\n");//得到客户机地址
                Client client = new Client(socket);               
                clients.add(client);//增加客户线程到向量中
                client.start();//启动线程
                notifyChatRoom(); //监视聊天室连接变化}
        } catch (Exception ex) {
            ex.printStackTrace();//输出出错信息}}
        public static void notifyChatRoom() { //监视客户端线程
        StringBuffer newUser = new StringBuffer("newUser");
        for (int i = 0; i < clients.size(); i++) {
            Client c = (Client)clients.elementAt(i);
            newUser.append(":"+c.name); //客户端姓名字符串}
        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(); // 输出错误信息}
                        veElement(client); //移出客户端}}
    public static void disconnect(Client c) {// 断开客户端
        try {println(c.ip+"断开连接\n");
        } catch (Exception ex) {
            ex.printStackTrace();}
        veElement(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 InputStream()));
                ps = new OutputStream());//得到输出流
                String info = adLine();//读取接收到的信息
                StringTokenizer stinfo = new StringTokenizer(info,":"); //分解字符串
                String head = Token(); //获取关键字
                System.out.String());
socket编程聊天室基本流程                System.out.println(head);
                if (stinfo.hasMoreTokens()){
                    name = Token() ;//获取用户名}
                if (stinfo.hasMoreTokens()) {
                    ip = Token(); //获取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 = adLine();
                    System.out.println("line:"+line);
                } catch (IOException ex) {
                    ex.printStackTrace(); //输出错误信息
                    ChatServer.disconnect(this);//断开连接
                    ifyChatRoom();//更新信息
                    return ;    }
                if (line == null) { //客户离开
                    ChatServer.disconnect(this);
                    ifyChatRoom();
                    return ;}
                StringTokenizer st = new StringTokenizer(line,":");//分解字符串
                String keyword = st.nextToken();
                if (keyword.equals("MSG")) { //发送来的聊天信息
                    StringBuffer msg = new StringBuffer("MSG:");
                    msg.append(name); //在信息上增加用户名
                    msg.Token("\0\n"));
                    ChatServer.sendClients(msg);//发送聊天语句到各个客户端
                    System.out.println(msg);
                } else if (keyword.equals("quit")) { //退出命令
                    ChatServer.disconnect(this); //断开连接
                    ifyChatRoom(); //刷新信息}}}}}
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;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.InetAddress;
import java.Socket;
import java.util.StringTokenizer;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。