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下编程了, ...
随机推荐
- Linux系统运维故障排查
一.思路 1.处理问题要求 2.一般思路 二.具体问题 1.网络问题 (1)网络不通 (2)网络很慢 2.硬件问题 3.操作系统问题 (1)系统无法正常启动 (2)系统运行慢或死机 4.服务或程序问题 ...
- 01 Linux简介
1.Linux简介 UNIX与Linux发展史 Unix在1969年,美国贝尔实验室的肯汤普森在DEC PDP-7机器上开发出了UNIX系统. Linux出现于1991年,是由芬兰赫尔辛基大学学生李纳 ...
- AspNetCore+Swagger 生成Model描述
AspNetCore+Swagger 生成Model 描述 前言: 本篇文章实现是基于上一篇文章,进下补充:多余的就不多说了,只是为了实现Model的描述生成:有兴趣的可以结合上一篇的进行实现:如有更 ...
- linux下常见软件安装
读者还可以参考文档:https://download.csdn.net/download/qq_27799563/10482900 Mysql的安装过程: 解压MySQL安装包: tar -xvf M ...
- ML(7)——支持向量机1(构建支持向量机)
支持向量机缩写是SVM(support vaector machine),这里的“机(machine)”是一个算法.在机器学习领域,常把一些算法看做是一个机器,如感知机(也叫感知器).支持向量机本身是 ...
- PHP 对象转数组 Object转array
//调用这个函数,将其幻化为数组,然后取出对应值 public static function object_array($array) { if(is_object($array)) { $arra ...
- 静态Map类型变量赋初始值
private static Map<String,String> sysTypeList = new HashMap<String, String>(); static { ...
- EXCEL 将网络图片地址插入为锁定的图片单元格宏
Sub InsertPic2(ByVal 图片链接 As String, ByVal 插入图片表名 As String, ByVal 插入图片单元格地址 As String) On Error Res ...
- 基于mysql对mybatis中的foreach进行深入研究
鉴于上一篇博文一次修改mysql字段类型引发的技术探究提到的,要对foreach里面的collection相关的内容做一些介绍,今天就围绕foreach,做一些数据插入和查询相关的研究. 首先介绍一下 ...
- 手机与PC的影音相互播放(DLNA/UPNP)
DLNA:全称是DIGITAL LIVING NETWORK ALLIANCE(数字生活网络联盟), 旨在解决个人PC,消费电器,移动设备在内的无线网络和有线网络的互联互通,使得数字媒体和内容服务的无 ...