Tcp与Ip协议的客户端和服务器编程
Tcp与Ip协议的客户端和服务器编程
本文就TCP和Ip协议的客户端和服务器分别进行编程,实现了客户端和服务端进行通信的功能,服务端对多个客户端进行监听,并能与多个客户端通信。
服务器端代码如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms;namespace 服务端 {public partial class Form1 : Form{public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){Control.CheckForIllegalCrossThreadCalls = false;}/// <summary>/// 获取本机IP地址/// </summary>/// <returns>返回一个IP</returns>private string GetIpAddress(){string hostName = Dns.GetHostName();//获取本机名IPHostEntry localhost = Dns.GetHostByName(hostName);//方法已过期了,只能得到一个IPV4的地址 IPAddress localaddr = localhost.AddressList[0];return localaddr.ToString();}private void btnStart_Click(object sender, EventArgs e){try{//当点击开始监听时,在服务器端创建一个负责监听IP地址和端口号的Socket//IP V4,流式服务,TCP协议Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);IPAddress ip = IPAddress.Any; //IPAddress.Parse(txtServer.Text);我的理解是获取本机IPtxtServer.Text = GetIpAddress();//将IP地址给文本//创建端口号对象IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));//监听 socketWatch.Bind(point);ShowMsg("监听成功");socketWatch.Listen(10);//一次监听10 人///创建一个线程来监听,否则没监听时就卡死了Thread th = new Thread(Listen);th.IsBackground = true;th.Start(socketWatch);}catch { }}Dictionary<string, Socket> dicSock = new Dictionary<string, Socket>();//创建键值对来存放IP和socket Socket socketSend;void Listen(object o)//必须用object类型 ,因为线程要使用 {Socket socketWatch = o as Socket;//将传递过来的参数转换为Socket类型while (true){try{//等待客户端的连接 并且创建一个负责通信的SocketsocketSend = socketWatch.Accept();//获得远端 IP+端口号:连接成功ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + "连接成功");dicSock.Add(socketSend.RemoteEndPoint.ToString(), socketSend);//将IP地址添加到下拉列表中 comboBox1.Items.Add(socketSend.RemoteEndPoint.ToString());Thread th = new Thread(ReciveMsg);//在线程中只写方法名,括号和里面的参数不写在这里th.IsBackground = true;//写为后台线程,这样关闭窗口时线程就关闭了,否则关闭不了,会报错 th.Start(socketSend);}catch{ }}}/// <summary>/// 用来接收客户端发送来的信息,线程来调用他/// </summary>/// <param name="o"></param>void ReciveMsg(object o){Socket socketSend = o as Socket;while (true){try{//连接成功之后,客户端就要给服务端发送数据了byte[] buffer = new byte[1024 * 1024 * 2];int r = socketSend.Receive(buffer);//实际接收到的有效字符if (r == 0){break;}string str = Encoding.UTF8.GetString(buffer, 0, r);ShowMsg(socketSend.RemoteEndPoint + ":" + str);}catch { }}}/// <summary>/// 在上面一个文本框中显示信息的方法/// </summary>/// <param name="str"></param>void ShowMsg(string str){txtLOg.AppendText(str + "\r\n");//写AppendText追加,不然会覆盖 }/// <summary>/// 服务端给客户端发送消息/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button4_Click(object sender, EventArgs e){try{if (comboBox1.Text == ""){MessageBox.Show("请选中一个客户端地址再发送消息", "谢谢");}string str = textBox4.Text;textBox4.Clear();byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);List<byte> list = new List<byte>();list.Add(0);list.AddRange(buffer);byte[] newbuffer = list.ToArray();string ip = comboBox1.SelectedItem.ToString();dicSock[ip].Send(newbuffer);//通过键IP地址找到值socketSend //socketSend.Send(buffer); }catch{ }}private void button2_Click(object sender, EventArgs e){if (comboBox1.Text == ""){MessageBox.Show("请选择一个客户端IP地址再选择要发送的文件", "提示!");}else{OpenFileDialog ofd = new OpenFileDialog();ofd.Title = "请选择要发送的文件";ofd.InitialDirectory = @"C:\Users\Administrator\Desktop";ofd.Filter = "所有文件|*.*";ofd.ShowDialog();textBox5.Text = ofd.FileName;//获得选中的一个文件名 }}/// <summary>/// 发送文件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button3_Click(object sender, EventArgs e){try{//发送文件string path = textBox5.Text;using (FileStream fsRead = new FileStream(path, FileMode.Open, FileAccess.Read)){byte[] buffer = new byte[1024 * 1024 * 5];int r = fsRead.Read(buffer, 0, buffer.Length);List<byte> list = new List<byte>();list.Add(1);list.AddRange(buffer);byte[] newbuffer = list.ToArray();//int r= fsRead.Read(newbuffer , 0, newbuffer.Length);//实际读取的有效字节dicSock[comboBox1.SelectedItem.ToString()].Send(newbuffer, 0, r + 1, SocketFlags.None);}}catch { }}///让客户端震动private void button5_Click(object sender, EventArgs e){try{if (comboBox1.Text == ""){MessageBox.Show("请选择一个客户端IP地址再震动", "提示!");}else{byte[] buffer = new byte[1];buffer[0] = 2;dicSock[comboBox1.SelectedItem.ToString()].Send(buffer);}}catch { }}} }
客户端代码如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms;namespace 客户端 {public partial class Form1 : Form{public Form1(){InitializeComponent();}Socket socketConnect = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);private void button1_Click(object sender, EventArgs e){try{//建立负责通讯的Socketif (textBox1.Text == "" || textBox2.Text == ""){MessageBox.Show("IP地址或者端口号不能为空", "去你大爷的!");}IPAddress ip = IPAddress.Parse(textBox1.Text);IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(textBox2.Text));socketConnect.Connect(point);ShowMsg("连接成功");Thread th = new Thread(Receive);th.IsBackground = true;th.Start();}catch { }}void ShowMsg(string str){textBox3.AppendText(str + "\r\n");}private void button2_Click(object sender, EventArgs e){try{//客户端要给服务器发送消息string str = textBox4.Text.Trim();//Trim()就是把所写内容前后空格去除byte[] buffer = Encoding.UTF8.GetBytes(str);//System.Text.Encoding.UTF8.GetBytes(str); socketConnect.Send(buffer);textBox4.Clear();}catch { }}///写一个不断接收服务端发过来的消息的方法,创建线程来调用他void Receive(){try{while (true)//不停的接收 {byte[] buffer = new byte[1024 * 1024 * 3];int r = socketConnect.Receive(buffer);//实际接收到的有效字节数if (r == 0){break;}if (buffer[0] == 0)//接收到文字 {string str = Encoding.UTF8.GetString(buffer, 1, r - 1);ShowMsg(socketConnect.RemoteEndPoint + ":" + str);}else if (buffer[0] == 1){//接收的是文件SaveFileDialog ofd = new SaveFileDialog();//保存对话框 ofd.Title = "请选择保存文件的路径";ofd.InitialDirectory = @"C:\Users\Administrator\Desktop";ofd.Filter = "所有文件|*.*";ofd.ShowDialog(this);string path = ofd.FileName;using (FileStream fsWrite = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write)){fsWrite.Write(buffer, 1, r - 1);}MessageBox.Show("保存成功", "kao");}else if(buffer [0]==2){ZD();}}}catch { }} /// <summary> /// 写个方法来使窗体震动 /// </summary>void ZD(){for (int i = 0; i < 500; i++){this.Location = new Point(200 , 200);this.Location = new Point(280 , 280);}}private void Form1_Load(object sender, EventArgs e){Control.CheckForIllegalCrossThreadCalls = false;}} }
转载于:https://www.cnblogs.com/xiaoyaohan/p/9755748.html
Tcp与Ip协议的客户端和服务器编程相关推荐
- 打印服务器协议,基于TCP/IP协议的嵌入式网络打印服务器设计
摘要: 随着电子技术和计算机网络技术的发展,嵌入式系统在家庭和工业的各个领域都得到了广泛的应用,各种信息家电,网络设备以及工业控制领域都出现了嵌入式系统的身影,其数量已经远远超过了各种通用计算机.但是 ...
- java socket5源码_Java利用TCP协议实现客户端与服务器通信【附通信源码】
进行TCP协议网络程序的编写,关键在于ServerSocket套接字的熟练使用,TCP通信中所有的信息传输都是依托ServerSocket类的输入输出流进行的. TCP协议概念 先来了解一下TCP协议 ...
- 全网疯传!Java利用TCP协议实现客户端与服务器通信【附通信源码
目录 TCP协议概念 ServerSocket类 服务器端程序 客户端程序 Hello!大家好哇!我是灰小猿! 上一篇博客和大家分享了在网络编程中要注意的基础知识,关于IP.TCP.UDP以及端口和套 ...
- http协议跟服务器交互,基于HTTP协议的客户端与服务器之间的数据交互方法专利_专利查询 - 天眼查...
L-种基于HTTP协议的客户端与服务器之间的数据交互方法,应用于智能$居系统 中,以使用户的客户端与智能家居系统的服务器之间建立稳定的网络连接并进行数据交 互,所述方法包括步骤: 所述客户端与所述服务 ...
- C++基于TCP/IP简单的客户端、服务器通信程序实例
本篇文章实现了一个基于TCP 的一个非常简单的客户/服务器通信程序实例.该程序中通讯协议使用的是面向连接的TCP协议SOCK_STREAM, 服务器的ip地址为本地地址即: 127.0.0.1,端口号 ...
- 客户端发送协议包给服务器,TCP协议的客户端与服务器的通信过程
使用TCP时,客户端与服务器端的通信流程 服务器初始化 1)调用socket,创建文件描述符fd 2) 调用bind将fd与服务器的IP与PORT绑定 3)调用listen将套接字设为监听模式,准备接 ...
- 金蝶站点重新输入服务器ip,金蝶KIS客户端和服务器不在同一IP段互相访问
金蝶KIS客户端和服务器不在同一IP段互相访问 现象:金蝶KIS的服务器在内网192.168.1.*这个网段中,同时在这个网段中我增加一个无线路由器分配的IP段是192.168.2.*:金蝶的客户端就 ...
- 网络协议报文理解刨析篇二(再谈Http和Https), 加上TCP/UDP/IP协议分析(理解着学习), 面试官都惊讶你对网络的见解
目录 前文链接(系列助学, 也为后文学习做铺垫, 可按需读取) 一. 再谈HTTP再理解 二. HTTP对比学习HTTPS HTTP和HTTPS的区别如下: 三.TCP协议 (三次握手四次挥手细节过 ...
- 网络基础 ------- UDP、TCP及IP协议详解
目录 UDP协议 1.UDP报文结构 报文长度 校验和 TCP协议 1.TCP报文结构 2.TCP的可靠传输机制 1.确认应答 2.超时重传 3.连接管理 4.滑动窗口 5.流量控制 6.拥塞控制 7 ...
最新文章
- BiLSTM-CRF学习笔记(原理和理解) 维特比
- vue实现上下滑动翻页_基于vue实现上下滑动翻页效果
- webstorm jquery语法提示_WebStorm快速入门指南,开发者必备!
- java 类一定要声明成public_java测试题(四)--答案
- oracle 值安全性,Oracle Solaris 11 安全性預設值
- 利用skipList(跳表)来实现排序(待补充)
- MX记录有什么用?为什么今天的电子邮件系统是这样的?
- Java线程的6种状态、NEW、RUNNABLE、BLOCK、TIMED_WAITING、TERMINATED
- 简单打开.swf文件
- 利用canvas的getImageData()方法制作《在线取色器》
- 特稿:成都,一座“吃饱了撑的”城市
- 软件架构师考试内容及题型
- 新托业模拟考试感言—了解一下参加过托业考试前辈们的经验03
- python 登录人人网爬取源码
- Python制作古诗生成器
- 什么是数字示波器的垂直分辨率
- 【2022 CCPC 华为云计算挑战赛】1005 带权子集和 (NTT 优化dp)
- linux(centos) 保存退出vi编辑
- 项目经历怎么写_工程监理简历范文,【工作经历+项目经验+自我评价】怎么写...
- c语言烟花发射原理,烟花发射原理