Socket网络编程(winform)
【服务器】
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.Windows.Forms; namespace SocketDemo
{
public partial class Server : Form
{
private Socket socketSend; public Server()
{
InitializeComponent(); }
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
this.filePath.ReadOnly = true;
} private void button1_Click(object sender, EventArgs e)
{
try
{
//当点击开始监听时,在服务器端创建一个负责监听的ip地址和端口号
Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Any;
//创建一个端口号
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(this.portNum.Text));
//创建监听
socketWatch.Bind(point);
ShowMessage("监听成功!");
socketWatch.Listen();
//等待客户端的链接,并且创建一个负责通信的socket
Thread thread = new Thread(Listen);
thread.IsBackground = true;
thread.Start(socketWatch);
}
catch (Exception)
{
}
} Dictionary<string, Socket> dic = new Dictionary<string, Socket>(); /// <summary>
/// 等待客户端链接,创建与之通信的scoket
/// </summary>
private void Listen(object o)
{
Socket socketWatch = o as Socket;
while (true)
{
try
{
//等待客户端的连接
socketSend = socketWatch.Accept();
//将连接过来的客户端存储至Dictionary和下拉框中,以便区分是哪个客户端
dic.Add(socketSend.RemoteEndPoint.ToString(), socketSend);
//将ip和端口号存入下拉框中
dropList.Items.Add(socketSend.RemoteEndPoint.ToString());
ShowMessage($"{socketSend.RemoteEndPoint.ToString()}:连接成功!");
//另外再开一个线程不停地接收客户端发来的消息
Thread thread = new Thread(Receive);
thread.IsBackground = true;
thread.Start(socketSend);
}
catch (Exception)
{
}
}
} /// <summary>
/// 服务器不停地接收客户端发来的消息
/// </summary>
/// <param name="obj"></param>
private void Receive(object obj)
{
Socket socketSend = obj as Socket;
while (true)
{
try
{
//服务器应该接收客户端发来的消息
byte[] buffer = new byte[ * ];
//实际接收的有效字节数
int num = socketSend.Receive(buffer);
//判断接收的字节是否为0,如果为0,则表明客户端已经下线
if (num == )
{
break;
}
string str = Encoding.UTF8.GetString(buffer, , num);
ShowMessage($"{socketSend.RemoteEndPoint}:{str}");
}
catch (Exception)
{
}
}
}
private void ShowMessage(string str)
{
this.textListen.AppendText($"{str}\r\n");
} /// <summary>
/// 服务器发送消息给客户端
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
if (dropList.Text == "---请选择---")
{
MessageBox.Show("请先选择您要发送的客户端");
return;
}
if (this.serverMsg.Text.Trim() == "" && this.filePath.Text.Trim() == "")
{
MessageBox.Show("请输入信息或选择文件");
return;
}
List<byte> list = new List<byte>(); if (this.serverMsg.Text.Trim() != "" && this.filePath.Text.Trim() == "")
{
byte[] buffer = Encoding.UTF8.GetBytes(this.serverMsg.Text.Trim());
//给发送的内容添加前缀,如果加0,则表示发消息
list.Add();
list.AddRange(buffer);
byte[] newBuffer = list.ToArray();
dic[dropList.SelectedItem.ToString().Trim()].Send(newBuffer);
}
else if (this.filePath.Text.Trim() != "" && this.serverMsg.Text.Trim() == "")
{
using (FileStream fs = new FileStream(filePath.Text.Trim(), FileMode.Open, FileAccess.Read))
{
byte[] by = new byte[ * * ];
int length = fs.Read(by, , by.Length);
//给发送的内容添加前缀,如果加1,则表示发文件
list.Add();
list.AddRange(by);
byte[] newBy = list.ToArray();
dic[dropList.SelectedItem.ToString().Trim()].Send(newBy, , length + , SocketFlags.None);
}
}
else
{
MessageBox.Show("只能是发送消息或传输文件中的一项");
}
} /// <summary>
/// 打开所需的文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void openFile_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.InitialDirectory = @"C:\Users\Administrator\Desktop";
ofd.Title = "打开文件";
ofd.Filter = "所有文件|*.*";
ofd.ShowDialog();
this.filePath.Text = ofd.FileName;
}
}
}
【客户端】
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.Windows.Forms; namespace 客户端
{
public partial class Client : Form
{
public Client()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
} Socket socketSend;
private void button1_Click(object sender, EventArgs e)
{
try
{
//创建一个负责通信的socket
socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse(this.IpMess.Text.Trim());
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(this.clientPort.Text.Trim()));
socketSend.Connect(point);
ShowMess("连接成功!");
//创建线程接收消息
Thread th = new Thread(Receive);
th.IsBackground = true;
th.Start();
}
catch (Exception)
{
MessageBox.Show("可能是因为没有启动服务器监听!");
}
}
private void Receive()
{
while (true)
{
try
{
byte[] buffer = new byte[ * * ]; //最长10M
//通过字节二进制来接收消息,获取字节长度
int length = socketSend.Receive(buffer);
if (length == )
{
break;
}
//如果为0接收消息
if (buffer[]==)
{
//去掉前缀
string str = Encoding.UTF8.GetString(buffer, , length-);
ShowMess(socketSend.RemoteEndPoint + ":" + str);
}
//如果为1接收文件
else if (buffer[]==)
{
//保存文件
SaveFileDialog sfd = new SaveFileDialog();
sfd.InitialDirectory = @"C:\Users\Administrator\Desktop";
sfd.Title = "选择文件";
sfd.Filter = "所有文件|*.*";
//弹出对话窗
sfd.ShowDialog(this);
using (var fs=new FileStream(sfd.FileName,FileMode.OpenOrCreate,FileAccess.Write))
{
fs.Write(buffer, , length - );
}
MessageBox.Show("保存成功");
}
}
catch (Exception)
{
}
}
}
private void ShowMess(string str)
{
this.clientMess.AppendText($"{str}\r\n");
} private void clientMess_TextChanged(object sender, EventArgs e)
{ } /// <summary>
/// 客户端给服务器发送消息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void sendBtn_Click(object sender, EventArgs e)
{
byte[] buffer = Encoding.UTF8.GetBytes(this.sendMsg.Text.Trim());
socketSend.Send(buffer);
}
}
}
Socket网络编程(winform)的更多相关文章
- Socket网络编程(2)--服务端实现
中秋了,首先祝大家中秋快乐,闲着无事在家整一个socket的聊天程序,有点仿QQ界面,就是瞎折腾,不知道最后是不是能将所有功能实现. 如果你对socket不了解,请看这篇文章:http://www.c ...
- Linux Socket 网络编程
Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...
- Python Socket 网络编程
Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...
- Python全栈【Socket网络编程】
Python全栈[socket网络编程] 本章内容: Socket 基于TCP的套接字 基于UDP的套接字 TCP粘包 SocketServer 模块(ThreadingTCPServer源码剖析) ...
- python之Socket网络编程
什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系.在数学上,网络是一种图,一般认为专指加权图.网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类型的实际问题中抽象出来的模型.在 ...
- Python之路【第七篇】python基础 之socket网络编程
本篇文章大部分借鉴 http://www.cnblogs.com/nulige/p/6235531.html python socket 网络编程 一.服务端和客户端 BS架构 (腾讯通软件:ser ...
- Socket网络编程-基础篇
Socket网络编程 网络通讯三要素: IP地址[主机名] 网络中设备的标识 本地回环地址:127.0.0.1 主机名:localhost 端口号 用于标识进程的逻辑地址 有效端口:0~65535 其 ...
- Socket网络编程--FTP客户端
Socket网络编程--FTP客户端(1)(Windows) 已经好久没有写过博客进行分享了.具体原因,在以后说. 这几天在了解FTP协议,准备任务是写一个FTP客户端程序.直接上干货了. 0.了解F ...
- windows下的socket网络编程
windows下的socket网络编程 windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了, ...
随机推荐
- MySQL聚合函数与数据分组
我们最常需要的是汇总数据而不是把他们实际检索出来 确定表中行数(或满足某个条件或包含某个特定值的行数) 确定表中行组的和 找出表列(或所有行或特定列)的最大值,最小值和平均值 聚集函数是运行在行组上, ...
- MySQL 安全整理
MySQL 安全整理 关闭外网的端口访问. 使用高位的端口号. 如果需要外网访问不给最高的权限. 如果需要外网访问也是绑定客户端. To be continued
- Quartz学习总结
一.基本介绍: Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现.该项目于 2009 年被 Terracotta 收购,目前是 Terraco ...
- mongodb之 oplog 日志详解
1:oplog简介 oplog是local库下的一个固定集合,Secondary就是通过查看Primary 的oplog这个集合来进行复制的.每个节点都有oplog,记录这从主节点复制过来的信息,这样 ...
- requestAnimationFrame 知识点
与setTimeout相比,requestAnimationFrame最大的优势是由系统来决定回调函数的执行时机.具体一点讲,如果屏幕刷新率是60Hz,那么回调函数就每16.7ms被执行一次,如果刷新 ...
- linux lftp
1.登录 lftp 用户名@站点 口令: 例如: lftp jiangzhaowei@192.168.199.73 口令:****** lftp jiangzhaowei@192.168.199.73 ...
- 黄聪: $(document).click() 在iphone上不触发事件解决办法
解决方案:加上 touchstart 事件 $(document).on(“click touchstart”, “.name”, function() { alert(“name”); });
- bzoj4948: World Final2017 A
求简单多边形内的最长线段长度 显然存在一组最优解,使其所在直线经过多边形的两个端点,枚举这两个端点,求出直线和多边形的有效交点,从而得出直线有哪些部分在多边形内(含边界). 由于多边形的一些边可能与直 ...
- 使用 Spring Cloud 和 Docker 构建微服务架构
如何使用Spring Boot.Spring Cloud.Docker和Netflix的一些开源工具来构建一个微服务架构. 本文通过使用Spring Boot.Spring Cloud和Docker构 ...
- flume-拦截器、channel选择器、sink组合sink处理器
1. Flume Interceptors Flume有能力修改/删除流程中的events.这是在拦截器(interceptor)的帮助下完成的.拦截器(Interceptors)是实现org.apa ...