1、(3) 复习聊天、邮件、HTTP服务的相关原理。(4) 熟悉相关编程语言及编程工具环境。7注意事项(1)遵守实验纪律,爱护实验设备。(2)提交详细实验报告一份。实验过程和结果不能简单地复制相关命令或内容,要有理解和分析。8程序代码1.服务器端using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;usi
2、ng System.Net;using System.Net.Sockets;using System.Threading;using System.IO;namespace WindowsFormsApplication1 public partial class Form1 : Form public Form1() InitializeComponent(); this.Init(); tab2.Visible = true; tab3.Visible = false; tab1.Visible = false; private void btnLog_Click(object send
3、er, EventArgs e) if (txtIP.Text = | txtPort.Text = ) MessageBox.Show(请输入IP地址或端口号, 提示信息, MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1); return; else try IPAddress ipadd = IPAddress.Parse(this.txtIP.Text); int port = Convert.ToInt32(this.txtPort.Text); tab3.Visible = t
4、rue; tab1.Visible = true; this.Init2(); this.btnImgFile.Enabled = false; this.Text = 服务器 + DateTime.Now.ToString() + + DateTime.Now.DayOfWeek.ToString(); richTextBox1.AppendText(System:服务器已进入聊天室 + DateTime.Now.ToLongTimeString() + -.rn); string SerIp = txtIP.Text.ToString(); string SerPort = txtPort
5、.Text.ToString(); labip.Text = IP地址: + + SerIp + ; labport.Text = 端口号: + SerPort; catch (Exception)您输入的IP地址或端口号不正确n请重新输入!错误, MessageBoxButtons.OK, MessageBoxIcon.Error); /重置服务器信息 private void btnResent_Click_1(object sender, EventArgs e) txtIP.Clear(); txtPort.Clear(); private void Init() richTextBo
6、x1.Visible = false; txt1_sendinfo.Visible = false; private void Init2() richTextBox1.Visible = true; txt1_sendinfo.Visible = true; private OpenFileDialog openfiledialog = new OpenFileDialog(); private SaveFileDialog savefiledialog = new SaveFileDialog(); private byte img;/传输图片用字节数组 private int imgfl
7、ag = 0; private FileStream fstream; public delegate void UpdateRichTextBox(string msg);/异步委托代理 public delegate void UpdateImg(Stream s); private Socket socket; /服务器端套接字 private Socket clientSocket; /客户端连接套接字 private Thread thread; /启动服务器开始监 private void btn_start_Click(object sender, EventArgs e) IP
8、Address ip = IPAddress.Parse(this.txtIP.Text); IPEndPoint server = new IPEndPoint(ip, Int32.Parse(this.txtPort.Text); /创建服务器套接字 socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Bind(server);/绑定端口号 socket.Listen(10); thread = new Thread(new ThreadStart(Acce
9、ptMessage); thread.Start();/开始监听 服务器Taking. richTextBox1.Clear();服务器已启动 btnImgFile.Enabled = true; btn_start.Enabled = false; btn_stop.Enabled = true; catch (Exception ex)服务器: + ex.Message); this.btn_start.Enabled = true; /接收客户端信息 public void AcceptMessage() /异步接收信息后台线程方法 this.clientSocket = socket.
10、Accept(); this.richTextBox1.Clear();服务器连接成功 while (true) if (this.clientSocket = null | this.clientSocket.Connected = false) break; NetworkStream netStream = new NetworkStream(this.clientSocket);/通 过yclientSocket对象获取NetworkStream对象 /得到一条消息的长度 byte dataSize = new byte4; netStream.Read(dataSize, 0, 4)
11、; int size = System.BitConverter.ToInt32(dataSize, 0); /循环接收直到一条完整的消息全部读入到字节数组中 byte message = new bytesize; int dataleft = size; int start = 0; if (size 0) while (dataleft int recv = netStream.Read(message, start, dataleft); start += recv; dataleft -= recv; if (message0 = 101)/101代表括传输图片 MemoryStre
12、am ms = new MemoryStream(message, 1, message.Length - 1); richTextBox1.BeginInvoke(new UpdateImg(ViewImg), new object ms ); else/默认进行普通传输 string Msg = System.Text.Encoding.Unicode.GetString(message, 1, message.Length - 1); this.richTextBox1.BeginInvoke(new UpdateRichTextBox(UpdateMessage), new objec
13、t Msg ); Thread.Sleep(100); catch (System.Net.Sockets.SocketException se)服务器 + se.Message); /点击“发送”按钮 private void btn_send_Click(object sender, EventArgs e) if (txt1_sendinfo.Text = 请?先输?入?内容!? txt1_sendinfo.Clear(); txt1_sendinfo.Focus(); if (imgflag = 1) /发送图片时 byte imgSize = new byte4; /将32位整数值转
14、换为字节数组 imgSize = System.BitConverter.GetBytes(img.Length + 1);/其中加1是因为后面了一个101做分隔符 NetworkStream netStream = new NetworkStream(clientSocket); netStream.Write(imgSize, 0, 4); netStream.WriteByte(101);/分隔符 netStream.Write(img, 0, img.Length); netStream.Flush(); this.richTextBox1.SelectionColor = Color
15、.SteelBlue; this.richTextBox1.AppendText(+ DateTime.Now.ToLongTimeString() + rn this.richTextBox1.SelectionStart = this.richTextBox1.Text.Length; Clipboard.SetDataObject(Image.FromStream(fstream); richTextBox1.Paste();n fstream.Flush(); fstream.Close();/此流必须在这里才可以消除 txt1_sendinfo.Paste(); this.richT
16、extBox1.Focus(); this.txt1_sendinfo.Text = this.txt1_sendinfo.Focus(); imgflag = 0;/复原/不执行后面的传输文本信息 catch (System.Exception ex) /发送文本信息时 string str = + txt1_sendinfo.Text; int i = str.Length; if (i = 0) /因为astr为aUnicode编括码,每字符占个字节,所以实害际字节数应为字符个数*2 i *= 2; dataSize = System.BitConverter.GetBytes(i +
17、1);/其中加1因为后面写了一个做分隔符 byte sendbytes = System.Text.Encoding.Unicode.GetBytes(str); netStream.Write(dataSize, 0, 4); netStream.WriteByte(1); netStream.Write(sendbytes, 0, sendbytes.Length); richTextBox1.SelectionColor = Color.SteelBlue; this.richTextBox1.AppendText(str + this.txt1_sendinfo.Rtf = /断开连接
18、 private void btn_stop_Click(object sender, EventArgs e) socket.Close(); thread.Abort(); thread.Join(10); btn_stop.Enabled = false;+ DateTime.Now.ToString() + 服务器断开连接. rn /接收文本 private void UpdateMessage(string strmsg) /将异步接收到的信息显示在富文本框里 this.richTextBox1.SelectionColor = Color.LightCoral; this.rich
19、TextBox1.AppendText(strmsg + /接收图片信息 private void ViewImg(Stream s) /将异步接收到的信息显示在富文本框里 richTextBox1.SelectionStart = richTextBox1.Text.Length; richTextBox1.SelectionColor = Color.LightCoral;服务器接图片 Clipboard.SetDataObject(Image.FromStream(s);/利用剪切板 richTextBox1.Focus(); /上传图片文件中的图片 private void btnIm
20、gFile_Click(object sender, EventArgs e) openfiledialog.Filter = 所有文件t(*.*)位图文(*.bmp)文件t(.jpg)文件t(.gif) if (openfiledialog.ShowDialog() = DialogResult.OK) String strpath = openfiledialog.FileName; fstream = new FileStream(strpath, FileMode.Open); BinaryReader breader = new BinaryReader(fstream); img
21、= breader.ReadBytes(int)fstream.Length); imgflag = 1; /退出聊天室 private void btn_Exit_Click(object sender, EventArgs e) if (btn_stop.Enabled != true) this.Close(); Application.Exit();请先断开连接? /取消发送 private void btnRest_Click(object sender, EventArgs e) /清屏 private void btnClear_Click(object sender, EventArgs e)2.客户端 tab1.Visi
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1