1、陈振辉虞在洋网络编程聊天程序报告网络编程实验报告 -C#语言编写聊天程序Winform平台学号 12224506 姓名 : 陈振辉 姓名: 虞在洋 专业: 计算机科学与技术 班级: 5班 一、实验目的:(1)熟悉和掌握网络编程的基本方法和步骤;(2)进一步理解client/server交互模式;(3)加深学生对于网络协议概念的理解以及协议的设计和实现方法。二、实验任务:使用任意网络编程语言(Java、C、VB、Delphi等)编写网络选课模拟程序,它由client和server两部分组成,client和server之间的通信基于TCP协议。实现数据的收发。三、网络编程:大多数网络应用程序都遵从
2、client/server交互模型。该模型中,服务器应用是一种专门用来提供某一种服务的程序,它被动地等待通信,而客户应用主动地启动通信,请求服务器的服务。服务器程序既可以接收信息也能发送信息,还可以成为客户。TCP/UDP赋予每个服务一个唯一的协议端口号。服务器程序通过协议端口号来指定它所提供的服务,然后被动地等待通信。客户在发送连接请求时,必须说明服务器程序运行主机的IP地址和协议端口号来指定它所希望的服务。服务器端计算机通过此端口号将收到的请求转向正确的服务器程序。大多数网络编程语言都提供或者使用控件封装了套接字应用程序接口(Socket API),应用程序通过套接字接口调用来实现和传输层
3、交互。用户目前可以使用两种套接口,即流套接字TCP和数据报套接字UDP。流式套接字定义了一种可靠的面向连接的服务,提供了双向的,有序的,无重复并且无记录边界的数据流服务。数据报套接字定义了一种无连接的服务,支持双向的数据流,但并不保证是可靠,有序,无重复的。也就是说,一个从数据报套接字接收信息的进程有可能发现信息重复了,或者和发出时的顺序不同。数据报套接字的一个重要特点是它保留了记录边界。套节字API主要包括表1所示的接口。使用面向连接的套接字编程,通过图2来表示其时序。套接字工作过程如下:服务器首先启动,通过调用socket()建立一个套接字,然后调用bind()将该套接字和本地网络地址联系
4、在一起,再调用listen()使套接字做好侦听的准备,并规定它的请求队列的长度,之后就调用accept()来接收连接。客户在建立套接字后就可调用connect()和服务器建立连接,连接一旦建立,客户机和服务器之间就可以通过调用read()和write()来发送和接收数据。最后,待数据传送结束后,双方调用close()关闭套接字。表1 套节字API主要接口接口解释SOCKETBINDLISTENACCEPTCONNETSENDRECVCLOSE创建一个新的套接字给服务器绑定一个传输层地址将服务器设为被动模式接收客户的一个请求客户向服务器发起连接向一个连接的套接字发送数据从一个连接的套接字接收数据
5、终止一个连接四程序设计及编程思路打开Vc2010新建一个winform工程文件如图客户端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;using System.Net.Sockets;using System.Threading;using System.Net;using System.IO
6、;using System.IO; namespace ChatClient public partial class FClient : Form public FClient() InitializeComponent(); /关闭对文本框的非法线程操作检查 TextBox.CheckForIllegalCrossThreadCalls = false; /创建 1个客户端套接字 和1个负责监听服务端请求的线程 Socket socketClient = null; Thread threadClient = null; private void btnBeginListen_Click(
7、object sender, EventArgs e) /定义一个套字节监听 包含3个参数(IP4寻址协议,流式连接,TCP协议) socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); /需要获取文本框中的IP地址 IPAddress ipaddress = IPAddress.Parse(txtIP.Text.Trim(); /将获取的ip地址和端口号绑定到网络节点endpoint上 IPEndPoint endpoint = new IPEndPoint(ipa
8、ddress, int.Parse(txtPort.Text.Trim(); /这里客户端套接字连接到网络节点(服务端)用的方法是Connect 而不是Bind socketClient.Connect(endpoint); /创建一个线程 用于监听服务端发来的消息 threadClient = new Thread(RecMsg); /将窗体线程设置为与后台同步 threadClient.IsBackground = true; /启动线程 threadClient.Start(); button1.Enabled = false; /MessageBox.Show(连接成功!); txtM
9、sg.Text = niechen.Text + 连接服务器成功+n; btnBeginListen.Enabled = false; / 接收服务端发来信息的方法 / private void RecMsg() while (true) /持续监听服务端发来的消息 /定义一个1M的内存缓冲区 用于临时性存储接收到的信息 byte arrRecMsg = new byte1024 * 1024; /将客户端套接字接收到的数据存入内存缓冲区, 并获取其长度 int length = socketClient.Receive(arrRecMsg); /将套接字获取到的字节数组转换为人可以看懂的字符
10、串 string strRecMsg = Encoding.UTF8.GetString(arrRecMsg, 0, length); /将发送的信息追加到聊天内容文本框中 / txtMsg.AppendText(服务器: + GetCurrentTime() + rn + strRecMsg + rn); txtMsg.AppendText( strRecMsg ); / 发送字符串信息到服务端的方法 / / 发送的字符串信息 private void ClientSendMsg(string sendMsg) /将输入的内容字符串转换为机器可以识别的字节数组 byte arrClientS
11、endMsg = Encoding.UTF8.GetBytes(sendMsg); /调用客户端套接字发送字节数组 socketClient.Send(arrClientSendMsg); /将发送的信息追加到聊天内容文本框中 / txtMsg.AppendText(niechen.Text + GetCurrentTime() + rn + sendMsg + rn); private void btnSend_Click(object sender, EventArgs e) if (niechen.Text = ) niechen.Text = 游客; /调用ClientSendMsg方
12、法 将文本框中输入的信息发送给服务端 ClientSendMsg(niechen.Text + GetCurrentTime() + rn + txtCMsg.Text.Trim() + rn); txtCMsg.Text = ; txtCMsg.Focus(); /快捷键 Enter发送信息 private void txtCMsg_KeyDown(object sender, KeyEventArgs e) /当光标位于文本框时 如果用户按下了键盘上的Enter键 if (e.KeyCode = Keys.Enter) /则调用客户端向服务端发送信息的方法 ClientSendMsg(tx
13、tCMsg.Text.Trim(); / 获取当前系统时间的方法 / / 当前时间 private DateTime GetCurrentTime() DateTime currentTime = new DateTime(); currentTime = DateTime.Now; return currentTime; private void button1_Click(object sender, EventArgs e) this.Hide(); FServer f = new FServer(); f.ShowDialog(); /发送文件/* string strFile=; b
14、ool isFile = false; bool ready = false; TcpClient client = new TcpClient(txtIP.Text, 8000); /TcpListener listener = new TcpListener(8000); /Socket s = listener.AcceptSocket(); static Int32 port = 13000; static IPAddress localAddr = IPAddress.Parse(127.0.0.1); static TcpListener tcpListener = new TcpListener(localAddr, port); Socket s = tcpListener.AcceptSocket(); private void SendFile() if (strFile != )/strFile是全局变量,用于保存发送发的文件路径 /发送传送文件请求 isFile = true;/is
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1