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下编程了, ...
随机推荐
- YAML Class ID Reference
Classes Ordered by ID Number ID Class 1 GameObject 2 Component 3 LevelGameManager 4 Transform 5 Time ...
- Java Bitset
Bitset创建一种特殊的数组来保存非负整数的值 取值为true和false,初始都是false.Bitset初始化是一个long,65位,增加位数的话只能是64的整数倍. 如果用一个Bitset存储 ...
- JavaScript跨浏览器绑定事件函数的优化
JavaScript作为一门基于事件驱动的语言(特别是用在DOM操作的时候),我们常常需要为DOM绑定各种各样的事件.然而,由于低版本的IE的不给力,在绑定事件和移除事件监听上都与众不同,我们常常需要 ...
- Openfire源码阅读(一)
本篇先分析openfire源码的主要流程,模块细节后续再继续分析: 一.简介: Openfire是开源的实时协作服务器(RTC),它是基于公开协议XMPP(RFC-3920),并在此基础上实现了XMP ...
- 在浏览器中输入url回车之后会发生什么
在浏览器中输入URL之后,浏览器会经历以下5个步骤: 1.解析URL 2.DNS域名解析 3.浏览器与网站建立TCP链接(三次握手) 4.请求和传输数据 5.浏览器渲染页面 一.解析URL 什么是ur ...
- 利用js获取客户端ip的方法
1. 通过script标签引入url 比如如下代码: <script type="text/javascript" src="http://pv.sohu.com/ ...
- 维护贴--linux下 mysql数据库的备份和还原 (转)
1.备份 1 [root@CentOS ~]# mysqldump -u root -p mysql > ~/mysql.sql #把数据库mysql备份到家目录下命名为mysql.sql 2 ...
- org.apache.ibatis.binding.BindingException: Invalid bound statement
idea中出现了这个问题 我的解决方案是: 把mapper映射文件放到资源目录下 然后就行了. 当然,这个具体原因就是:mapper.xml和接口对不上引起的,具体问题还要具体解决 协助博客:http ...
- OpenEXR-2.2.0在Win7 x64系统下的安装方法
最近在研究openexr这种文件格式,免不得安装一下OpenEXR软件,这个软件是开源的,需要编译安装,我的安装方法是这样的,分享一下. 一:去官网http://www.openexr.com/dow ...
- C# .net WebRequest HttpWebRequest 禁用系统默认代理。
直接将Proxy属性设置为null即可. 等同于配置文件里的 <proxy usesystemdefault="False" />