南昌航空大学实验报告
课程名称: 计算机网络 实验名称: 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小时内删除。
发表评论