C#如何字符串加密解密算法提交给第三方客户端

c#中如何向串口写入和接收字符串_百度知道
c#中如何向串口写入和接收字符串
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
用对象吧!
private void button2_Click(object sender, EventArgs e)
str = richTextBox1.T
LCDserialPort.Write(str);}
private void LCDserialPort_DataRecieved(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{ richTextBox2.Text = &I get & + LCDserialPort.ReadExisting();}这个代码对吗?
对不对你输进去就知道了啊
为您推荐:
其他类似问题
字符串的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。C# Socket 如何完全发送/接收数据_百度知道
C# Socket 如何完全发送/接收数据
有两个按钮B1和B2。
B1:一个100次的循环,连续发送1~100的数字。即每次循环Send一次。
B2:发送一个0
按下B1后,接收端大概只接收前10个左右的数字(接收端创建新线程,死循环接收数据)。这时按下B2发送一个0,接到的大约是10~20之间的...
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
服务器端:namespace&SocketTest{&&&&&&class&Program&&&&{&&&&&&&&public&static&void&SendMessage()&&&&&&&&{&&&&&&&&&&&&Socket&socket&=&serverSocket.Accept();&&&&&&&&&&&&Console.WriteLine(&Connected&a&client:{0}&,socket.RemoteEndPoint);&&&&&&&&&&&&socket.Send(Encoding.ASCII.GetBytes(&welcome&to&server&));&&&&&&&&&&&&//Thread&thread&=&new&Thread(ReceiveMessage);&&&&&&&&&&&//&thread.Start();&&&&&&&&}&&&&&&&&public&static&void&ReceiveMessage(object&obj)&&&&&&&&{&&&&&&&&&&&&Socket&socket&=&(Socket)&&&&&&&&&&&&byte[]&data&=&new&byte[1024];&&&&&&&&&&&&int&len&=&socket.Receive(data);&&&&&&&&&&&&string&dataString&=&Encoding.ASCII.GetString(data,&0,&len);&&&&&&&&&&&&Console.WriteLine(&Receive&Data:{0}&from&{1}&,&dataString,socket.RemoteEndPoint);&&&&&&&&&&&&//Thread&thread&=&new&Thread(SendMessage);&&&&&&&&&&&&//thread.Start(socket);&&&&&&&&}&&&&&&&&static&Socket&serverS&&&&&&&&static&void&Main(string[]&args)&&&&&&&&{&&&&&&&&&&&&//定义接收数据长度变量&&&&&&&&&&&&int&&&&&&&&&&&&&//定义接收数据的缓存&&&&&&&&&&&&byte[]&data&=&new&byte[1024];&&&&&&&&&&&&//定义侦听端口&&&&&&&&&&&&IPEndPoint&ipEnd&=&new&IPEndPoint(IPAddress.Any,&5566);&&&&&&&&&&&&//定义套接字类型&&&&&&&&&&&&serverSocket&=&new&Socket(AddressFamily.InterNetwork,&SocketType.Stream,&ProtocolType.Tcp);&&&&&&&&&&&&//连接&&&&&&&&&&&&serverSocket.Bind(ipEnd);&&&&&&&&&&&&//开始侦听&&&&&&&&&&&&serverSocket.Listen(10);&&&&&&&&&&&&//控制台输出侦听状态&&&&&&&&&&&&Console.Write(&Waiting&for&a&client&);&&&&&&&&&&&&//Socket&&&&&&&&&&&&&while&(true)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&//一旦接受连接,创建一个客户端&&&&&&&&&&&&&&&&&&&&Socket&client&=&serverSocket.Accept();&&&&&&&&&&&&&&&&&&&&//获取客户端的IP和端口&&&&&&&&&&&&&&&&&&&&IPEndPoint&ipEndClient&=&(IPEndPoint)client.RemoteEndP&&&&&&&&&&&&&&&&&&&&//输出客户端的IP和端口&&&&&&&&&&&&&&&&&&&&Console.WriteLine(&Connect&with&{0}&at&port&{1}&,&ipEndClient.Address,&ipEndClient.Port);&&&&&&&&&&&&&&&&&&&&//定义待发送字符&&&&&&&&&&&&&&&&&&&&string&welcome&=&&Welcome&to&my&server&;&&&&&&&&&&&&&&&&&&&&//数据类型转换&&&&&&&&&&&&&&&&&&&&data&=&Encoding.ASCII.GetBytes(welcome);&&&&&&&&&&&&&&&&&&&&while&(true)&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&try&&&&&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&//发送&&&&&&&&&&&&&&&&&&&&&&&&&&&&client.Send(data,&data.Length,&SocketFlags.None);&&&&&&&&&&&&&&&&&&&&&&&&&&&&//接收数据可以用线程也可以不用&&&&&&&&&&&&&&&&&&&&&&&&&&&&//ReceiveMessage(client);&&&&&&&&&&&&&&&&&&&&&&&&&&&&Thread&thread&=&new&Thread(ReceiveMessage);&&&&&&&&&&&&&&&&&&&&&&&&&&&&thread.Start(client);&&&&&&&&&&&&&&&&&&&&&&&&&&&&////对data清零&&&&&&&&&&&&&&&&&&&&&&&&&&&&//data&=&new&byte[1024];&&&&&&&&&&&&&&&&&&&&&&&&&&&&////获取收到的数据的长度&&&&&&&&&&&&&&&&&&&&&&&&&&&&//recv&=&client.Receive(data);&&&&&&&&&&&&&&&&&&&&&&&&&&&&////如果收到的数据长度为0,则退出&&&&&&&&&&&&&&&&&&&&&&&&&&&&//if&(recv&==&0)&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&////输出接收到的数据&&&&&&&&&&&&&&&&&&&&&&&&&&&&//Console.WriteLine(Encoding.ASCII.GetString(data,&0,&recv));&&&&&&&&&&&&&&&&&&&&&&&&&&&&//将接收到的数据再发送出去&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&client.Send(data,&recv,&SocketFlags.None);&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&catch&(Exception)&&&&&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&client.Close();&&&&&&&&&&&&&&&&&&&&&&&&&&&&serverSocket.Close();&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&client.Close();&&&&&&&&&&&&}&&&&&&&&&&&&//Console.WriteLine(&Disconnect&form{0}&,&ipEndClient.Address);&&&&&&&&&&&&&&&&&&&&&&&serverSocket.Close();&&&&&&&&&&&&&&&&}&&&&}}客户端:namespace&Client{&&&&class&Program&&&&{&&&&&&&&public&static&void&sendMessage(object&obj)&&&&&&&&{&&&&&&&&&&&&Socket&socket&=&(Socket)&&&&&&&&&&&&string&input&=&Console.ReadLine();&&&&&&&&&&&&byte[]&data&=&Encoding.ASCII.GetBytes(input);&&&&&&&&&&&&socket.Send(data,&data.Length,&SocketFlags.None);&&&&&&&&&&&&//Thread&thread&=&new&Thread(new&ParameterizedThreadStart(ReceiveMessage));&&&&&&&&&&&&//thread.Start(socket);&&&&&&&&}&&&&&&&&public&static&void&ReceiveMessage(object&obj)&&&&&&&&{&&&&&&&&&&&&Socket&socket&=&(Socket)&&&&&&&&&&&&byte[]&data&=&new&byte[1024];&&&&&&&&&&&&int&len&=&socket.Receive(data);&&&&&&&&&&&&string&dataString&=&Encoding.ASCII.GetString(data,&0,&len);&&&&&&&&&&&&Console.WriteLine(&Receive&Data:{0}&from&{1}&,&dataString,&socket.RemoteEndPoint);&&&&&&&&&&&&//Thread&thread&=&new&Thread(new&ParameterizedThreadStart(SendMessage));&&&&&&&&&&&&//thread.Start(socket);&&&&&&&&}&&&&&&&&static&void&Main(string[]&args)&&&&&&&&{&&&&&&&&&&&&//定义发送数据缓存&&&&&&&&&&&&byte[]&data&=&new&byte[1024];&&&&&&&&&&&&//定义字符串,用于控制台输出或输入&&&&&&&&&&&&string&input,&stringD&&&&&&&&&&&&//定义主机的IP及端口&&&&&&&&&&&&IPAddress&ip&=&IPAddress.Parse(&127.0.0.1&);&&&&&&&&&&&&IPEndPoint&ipEnd&=&new&IPEndPoint(ip,&5566);&&&&&&&&&&&&//定义套接字类型&&&&&&&&&&&&Socket&socket&=&new&Socket(AddressFamily.InterNetwork,&SocketType.Stream,&ProtocolType.Tcp);&&&&&&&&&&&&//尝试连接&&&&&&&&&&&&try&&&&&&&&&&&&{&&&&&&&&&&&&&&&&socket.Connect(ipEnd);&&&&&&&&&&&&}&&&&&&&&&&&&//异常处理&&&&&&&&&&&&catch&(SocketException&e)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&Console.WriteLine(&Fail&to&connect&server&);&&&&&&&&&&&&&&&&Console.WriteLine(e.ToString());&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&//定义接收数据的长度&&&&&&&&&&&&int&recv&=&socket.Receive(data);&&&&&&&&&&&&//将接收的数据转换成字符串&&&&&&&&&&&&stringData&=&Encoding.ASCII.GetString(data,&0,&recv);&&&&&&&&&&&&//控制台输出接收到的数据&&&&&&&&&&&&Console.WriteLine(stringData);&&&&&&&&&&&&while(true)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&//Thread&thread&=&new&Thread(sendMessage);&&&&&&&&&&&&&&&&//thread.Start(socket);&&&&&&&&&&&&&&&&//定义从键盘接收到的字符串&&&&&&&&&&&&&&&&input&=&Console.ReadLine();&&&&&&&&&&&&&&&&if&(input&==&&exit&)&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&//将从键盘获取的字符串转换成整型数据并存储在数组中&&&&&&&&&&&&&&&&&&&&data&=&Encoding.ASCII.GetBytes(input);&&&&&&&&&&&&&&&&//发送该数组&&&&&&&&&&&&&&&&socket.Send(data,&data.Length,&SocketFlags.None);&&&&&&&&&&&&&&&&////如果字符串是&exit&,退出while循环&&&&&&&&&&&&&&&&//if&(input&==&&exit&)&&&&&&&&&&&&&&&&//{&&&&&&&&&&&&&&&&//&&&&&&&&&&&&&&&&&&&&//}&&&&&&&&&&&&&&&&////对data清零&&&&&&&&&&&&&&&&//data&=&new&byte[1024];&&&&&&&&&&&&&&&&////定义接收到的数据的长度&&&&&&&&&&&&&&&&//recv&=&socket.Receive(data);&&&&&&&&&&&&&&&&////将接收到的数据转换为字符串&&&&&&&&&&&&&&&&//stringData&=&Encoding.ASCII.GetString(data,&0,&recv);&&&&&&&&&&&&&&&&////控制台输出字符串&&&&&&&&&&&&&&&&//Console.Write(stringData);&&&&&&&&&&&&&&&&////发送收到的数据&&&&&&&&&&&&&&&&//socket.Send(data,&recv,&0);&&&&&&&&&&&&}&&&&&&&&&&&&Console.WriteLine(&disconnect&from&server&);&&&&&&&&&&&&socket.Shutdown(SocketShutdown.Both);&&&&&&&&&&&&socket.Close();&&&&&&&&}&&&&}}
采纳率:94%
来自团队:
存在情况: 1、 接收端循环没写好2、没有读完网络流(缓存可以设大些,或判断是否读到完所有的字节)建议要一次发完所有数据 可以先将100个数字拼接成字符串,然后发送一次 。字符串头可加入[length=XXX]其中xxx是实际发送的字符串长度(注意不是字节数组buffer的长度),那么对于上面的请求,则我们发送的数据为:“[length=9]1,2,23,54”。而服务端接收字符串之后,首先读取这个“元数据”的内容,然后再根据“元数据”内容来读取实际的数据。取得内空后就可以拆分成数字
这个是我接收数据的代码,在接不到数据的时候,代码会停在int iRead = SOCKET.ReceiveFrom(byRead, ref ENDPOINT);这段代码上。
方法贴出来
这就是整个接数据的线程了,在连接创建成功后,让这个线程开始。
byte[] Read=new Byte[80]缓存过小,当发送端是for语句连续发送时,可能会产生拼接情况。这个接收也会不完全当iRead &80时才读完网络流的数据
拼接都无所谓了,我加了(char)0这个结束符,只有数据段里有结束符才会抽出数据。而且,就是80不够的话,他是循环的,只要下次循环就可以完成拼接了不是么?但是现在并没有接到数据,而是卡在int iRead = SOCKET.ReceiveFrom(byRead, ref ENDPOINT);这句上就停住了。这是发送数据的方法。
参考用 && & & & TcpListener listener = new TcpListener(IPAddress.Parse(&127.0.0.1&), 5555);& & & & & & listener.Start();& & & & & & while (true)& & & & & & {& & & & & & & & TcpClient client = listener.AcceptTcpClient();& & & & & & & & new ServerL.Socket.RemoteServer(client).BeginRead();& & & & & & }这个接收方法是没问题的
我刚刚又测试了一下,我估计是缓冲区的问题,比如第一次发送解释到的是1~65,然后随意发一次(是一次,不是一字节)。这时会接到66比如再连续执行两次Send,就会收到67和68,到100以后才会接到之前任意发的内容。有没有办法在空闲的时候把缓冲区的内容也发出去呢?
如有问题这个也可以参考下 (刚写好,测试OK)发送端& & & & &IPEndPoint iep = new IPEndPoint(IPAddress.Parse(&127.0.0.1&), 8888);&& & & & & & Socket client=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);& & & & & & client.Connect(iep);& & & & & & for (int i = 100; i & 0; i--)& & & & & & {& & & & & & & & byte[] buffer = System.Text.Encoding.Default.GetBytes(i.ToString());& & & & & & & & client.Send(buffer);& & & & & & }
本回答被提问者采纳
比如B1:1-100是一个“数据包”,B2:0是一个“数据包”,每次发送以“数据包”为单位发送,“数据包”中包含“开始”和“结束”的标记,那么 发送端 B1,B2的执行可以想象成 数据包B1:B1开始+1~100+B1结束,数据包B2:B2开始+0+B2结束,接受端 接受到数据包B1的&B1开始&标记时,创建B1线程,B1线程接受到1~10时,接受端 接受到数据包B2的&B2开始&标记,创建B2线程,B2线程接受0,B2线程接受&B2结束&标记,释放B2线程,同时B1线程接受到11~100和&B1结束&标记释放B1线程。文字描述的不是很给力,图片例子看看,希望能让你明白。& & & & & & & & & & & & & & & & & & & & & & & &&
不,结果不是这样的,虽然,一开始只接到了1~10左右,但是按下B2按钮,并不是会接到0,而是继续接11~20,再按B2,接到21~30,再按B2,接到31~40,以此类推,到最后的时候才会一下子接到很多个0。
你在发送端 设置一个标志,说明我发送的东西已经发送完毕,你接受的时候,判断接受的网络流中是否有这个标志,如果有,代表已经接收完整了。否则没有。打字不易,如满意,望采纳。
没有接收完毕,但也没有继续发送,只有在下一次调用Send时候,接收端才会收到之后的一部分。
其他1条回答
为您推荐:
其他类似问题
socket的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。C# Socket TCP 编程,客户端与服务端连接,发送字符串,文件
做了个winform的Socket服务端和客户端,能实现发送消息&文字
以下是图片和一些关键点,最后是代码,注释不多
服务端创建一个socket对象
参数 :寻址方案,ip版本4 ;套接字类型,字节流 ;协议,TCP
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
这时候可以在外边创建new一个空的socket对象比如serverSocket.来保存上面创建的对象,这样其他地方就能使用这个socket
例外,在外部创建一个List&Socket& list 来保存连客户端socket对象.后面要用
socket需要ip地址和port,注意参数转换类型
socket.Bind(new IPEndPoint(IPAddress.Parse(txtIP.Text.ToString()), int.Parse(txtPort.Text)));
设置连接等待队列的数量
socket.Listen(10);
开始服务,等待客户端连接,这时候需要开另外一个线程 来做这些事情,AcceptClientConnect是自己写的一个方法,将socket传给它
ThreadPool.QueueUserWorkItem(new WaitCallback(this.AcceptClientConnect), socket);
下面是AcceptClientConnect的代码, 当有客户端连接时,创建一个Socket对象.变量名为proxSocket,并且保存到list中,方便以后使用,另外,需要在创建一个线程来处理该客户端socket发送过来的数据.
public void AcceptClientConnect(object socket)
var serverSocket = socket as S
this.AppendTextToTxtLog("服务器端开始接受客户端的链接");
while (true)
var proxSocket = serverSocket.Accept();
this.AppendTextToTxtLog(string.Format("客户端{0}连接上了", proxSocket.RemoteEndPoint.ToString()));
ClientProxClentList.Add(proxSocket);
//接受消息
ThreadPool.QueueUserWorkItem(new WaitCallback(this.ReceiveData), proxSocket);
catch (Exception)
其中AppendTextToTxtLog方法是给主窗口中传递文本信息,因为txtLog这个控件不是监听服务端连接的线程创建的.所以要用异步来让它把新消息复制到txtLog中,代码中if来判断是否是txtLog当前线程的控件
public void AppendTextToTxtLog(string txt)
if (txtLog.InvokeRequired)
txtLog.BeginInvoke(new Action&string&(s =&
this.txtLog.Text = string.Format("{0}\r\n{1}", s, txtLog.Text);
this.txtLog.Text = string.Format("{0}\r\n{1}", txt, txtLog.Text);
}下面是处理客户端发送过来的数据的代码,new一个byte[]数组,变量名为data,代销为,用来保存客户端发来的数据. int
readlen是实际接收到的数据的长度(data中没用的到部分会自动为null),服务端和客户端通信的时候,数据长度是大于0的.当数据长度等于0 的时候,说明客户端要断开连接,代码中有这个判断,还有try,catch捕获异常(这里处理的不怎么好),最后.当复合条件.发送过来的数据转换成字符串,这里用到了有效长度,截取,转换为字符串,添加到消息文本框中.
public void ReceiveData(object obj)
Socket proxSocket = obj as S
byte[] data = new byte[1024 * 1024];
while (true)
int readLen = 0;
readLen = proxSocket.Receive(data, 0, data.Length, SocketFlags.None);
catch (Exception ex)
//异常退出时
AppendTextToTxtLog(string.Format("客户端{0}非正常退出", proxSocket.RemoteEndPoint.ToString()));
ClientProxClentList.Remove(proxSocket);
StopConnetct(proxSocket);
if (readLen&=0)
//客户端正常退出
AppendTextToTxtLog(string.Format("客户端:{0}正常退出", proxSocket.RemoteEndPoint.ToString()));
ClientProxClentList.Remove(proxSocket);
StopConnetct(proxSocket);
//方法结束-&终结当前接受客户端数据的异步线程
string txt = Encoding.Default.GetString(data, 0, readLen);
AppendTextToTxtLog(string.Format("接收到客户端{0}的消息{1}",proxSocket.RemoteEndPoint.ToString(),txt));
}一下是发送消息的代码 ,这个客户端能发送字符串,文件和窗口晃动,在原本发送的byte[] data前面在增加一位,为1 的时候是发送字符串,2发送晃动.3发送文件,data数组前面加一位,new用一个新数组result,长度是data.length+1,之后用到了Buffer.BlockCopy()方法,参数分别是(原数组,原数组的开始位置,目标数组,目标数组的开始位置,原数组中取多长数据)
发送数据,客户端对象.Send(要发送的byte数组,开始位置,长度,发送接收行为),一般发送接收行为用SocketFlags.None就可以了.发送的时候遍历一下list中的客户端对象.判断一下是否连接.
private void btnSend_Click(object sender, EventArgs e)
foreach (var proxSocket in ClientProxClentList)
if (proxSocket.Connected)
//原始的字符串转换成的字节数组
byte[] data = Encoding.Default.GetBytes(txtSendMsg.Text);
//在头部加上标记字节
byte[] result = new byte[data.Length + 1];
//头部协议字节 1:代表字符串
result[0] = 1;
Buffer.BlockCopy(data, 0, result, 1, data.Length);
proxSocket.Send(result, 0, result.Length,SocketFlags.None);
}发送文件的方法,new一个新的byte数组,第一位设置为3,然后读取文件,转换为byte[]data,还是用Buffer.BlockCopy(),整合到变量名为result的byte数组中,遍历list中的客户端对象,如果是连接的,那么发送
private void button2_Click(object sender, EventArgs e)
using (OpenFileDialog ofd =new OpenFileDialog())
if (ofd.ShowDialog()!=DialogResult.OK)
byte[] data = File.ReadAllBytes(ofd.FileName);
byte[] result = new byte[data.Length + 1];
result[0] = 3;
Buffer.BlockCopy(data, 0, result, 1,data.Length);
foreach (var proxSocket in ClientProxClentList)
if (!proxSocket.Connected)
proxSocket.Send(result, SocketFlags.None);
}最后一个是晃动的,只要发一个第一位是2的byte数组过去就好
private void button1_Click(object sender, EventArgs e)
foreach (var proxSocket in ClientProxClentList)
if (proxSocket.Connected)
proxSocket.Send(new byte[] { 2 }, SocketFlags.None);
下面是服务端的整体代码
using System.Collections.G
using System.ComponentM
using System.D
using System.D
using System.IO;
using System.L
using System.N
using System.Net.S
using System.T
using System.T
using System.Threading.T
using System.Windows.F
namespace ChatDemo
public partial class Mainfrm : Form
public Mainfrm()
InitializeComponent();
private Socket serverS
List&Socket& ClientProxClentList = new List&Socket&();
private bool state =
private void btnStart_Click(object sender, EventArgs e)
if (!state)
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
serverSocket =
socket.Bind(new IPEndPoint(IPAddress.Parse(txtIP.Text.ToString()), int.Parse(txtPort.Text)));
socket.Listen(10);//连接等待队列
ThreadPool.QueueUserWorkItem(new WaitCallback(this.AcceptClientConnect), socket);
btnStart.Text = "停止服务";
serverSocket.Close();
serverSocket.Shutdown(SocketShutdown.Both);
catch (Exception)
btnStart.Text = "开始服务";
//日志文本框追加数据
public void AppendTextToTxtLog(string txt)
if (txtLog.InvokeRequired)
txtLog.BeginInvoke(new Action&string&(s =&
this.txtLog.Text = string.Format("{0}\r\n{1}", s, txtLog.Text);
this.txtLog.Text = string.Format("{0}\r\n{1}", txt, txtLog.Text);
public void AcceptClientConnect(object socket)
var serverSocket = socket as S
this.AppendTextToTxtLog("服务器端开始接受客户端的链接");
while (true)
var proxSocket = serverSocket.Accept();
this.AppendTextToTxtLog(string.Format("客户端{0}连接上了", proxSocket.RemoteEndPoint.ToString()));
ClientProxClentList.Add(proxSocket);
//接受消息
ThreadPool.QueueUserWorkItem(new WaitCallback(this.ReceiveData), proxSocket);
catch (Exception)
public void ReceiveData(object obj)
Socket proxSocket = obj as S
byte[] data = new byte[1024 * 1024];
while (true)
int readLen = 0;
readLen = proxSocket.Receive(data, 0, data.Length, SocketFlags.None);
catch (Exception ex)
//异常退出时
AppendTextToTxtLog(string.Format("客户端{0}非正常退出", proxSocket.RemoteEndPoint.ToString()));
ClientProxClentList.Remove(proxSocket);
StopConnetct(proxSocket);
if (readLen&=0)
//客户端正常退出
AppendTextToTxtLog(string.Format("客户端:{0}正常退出", proxSocket.RemoteEndPoint.ToString()));
ClientProxClentList.Remove(proxSocket);
StopConnetct(proxSocket);
//方法结束-&终结当前接受客户端数据的异步线程
string txt = Encoding.Default.GetString(data, 0, readLen);
AppendTextToTxtLog(string.Format("接收到客户端{0}的消息{1}",proxSocket.RemoteEndPoint.ToString(),txt));
private void btnSend_Click(object sender, EventArgs e)
foreach (var proxSocket in ClientProxClentList)
if (proxSocket.Connected)
//原始的字符串转换成的字节数组
byte[] data = Encoding.Default.GetBytes(txtSendMsg.Text);
//在头部加上标记字节
byte[] result = new byte[data.Length + 1];
//头部协议字节 1:代表字符串
result[0] = 1;
Buffer.BlockCopy(data, 0, result, 1, data.Length);
proxSocket.Send(result, 0, result.Length,SocketFlags.None);
private void StopConnetct(Socket proxSocket)
if (proxSocket.Connected)
proxSocket.Shutdown(SocketShutdown.Both);
proxSocket.Close(100);
catch (Exception ex)
private void button2_Click(object sender, EventArgs e)
using (OpenFileDialog ofd =new OpenFileDialog())
if (ofd.ShowDialog()!=DialogResult.OK)
byte[] data = File.ReadAllBytes(ofd.FileName);
byte[] result = new byte[data.Length + 1];
result[0] = 3;
Buffer.BlockCopy(data, 0, result, 1,data.Length);
foreach (var proxSocket in ClientProxClentList)
if (!proxSocket.Connected)
proxSocket.Send(result, SocketFlags.None);
private void button1_Click(object sender, EventArgs e)
foreach (var proxSocket in ClientProxClentList)
if (proxSocket.Connected)
proxSocket.Send(new byte[] { 2 }, SocketFlags.None);
点击按钮连接Server,在外面创建一个socket对象名称为ClientSocket.方便其他地方调用,连接成功后new一个线程名称thread来处理接受到的消息,注意.thread设置为后台线程thread.IsBackground = true,线程开始的时候把当前的socket对象作为参数给它,thread.Start(ClientSocket);
private void btnConnect_Click(object sender, EventArgs e)
Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
ClientSocket =
socket.Connect(IPAddress.Parse(txtIP.Text), int.Parse(txtPort.Text));
catch (Exception ex)
MessageBox.Show("Bad");
AppendTextToTxtLog(string.Format("服务端{0}已连接",ClientSocket.RemoteEndPoint.ToString()));
Thread thread = new Thread(new ParameterizedThreadStart(ReceiveData));
thread.IsBackground =
thread.Start(ClientSocket);
消息接受方法ReceiveData(), socket对象.Receive(data, 0, data.Length, SocketFlags.None);返回值是实际接受的字节流长度,变量名readLen,后面要用.
public void ReceiveData(object obj)
Socket proxSocket = obj as S
byte[] data = new byte[1024 * 1024];
while (true)
int readLen = 0;
readLen = proxSocket.Receive(data, 0, data.Length, SocketFlags.None);
catch (Exception)
//异常退出时
AppendTextToTxtLog(string.Format("服务端{0}非正常退出", proxSocket.RemoteEndPoint.ToString()));
StopConnetct();
if (readLen &= 0)
//客户端正常退出
AppendTextToTxtLog(string.Format("服务端:{0}正常退出", proxSocket.RemoteEndPoint.ToString()));
StopConnetct();
//方法结束-&终结当前接受客户端数据的异步线程
//接受的数据中第一个字节如果是1,那么是字符串.2是闪屏.3是文件
if (data[0]==1)
string strMsg = ProcessRecieveString(data, readLen);
AppendTextToTxtLog(string.Format("接收到服务端{0}的消息{1}", proxSocket.RemoteEndPoint.ToString(), strMsg));
else if (data[0] == 2)
ProcessRecieveShake();
else if (data[0]==3)
ProcessRecieveFile(data, readLen);
}下面是对字节流首位分别是1,2,3的处理方法
public string ProcessRecieveString(byte[] data,int readLen)
string str = Encoding.Default.GetString(data, 1, readLen);
public void ProcessRecieveShake()
Point oldLocation = this.L
Random r = new Random();
if (this.InvokeRequired)
txtLog.BeginInvoke(new Action&Point,Random&(Shake),oldLocation,r);
Shake(oldLocation, r);
private void Shake(Point oldLocation, Random r)
for (int i = 0; i & 50; i++)
this.Location = new Point(r.Next(oldLocation.X - 5, oldLocation.X + 5), r.Next(oldLocation.Y - 5, oldLocation.Y + 5));
Thread.Sleep(50);
this.Location = oldL
public void ProcessRecieveFile(byte[] data,int readLen)
using (SaveFileDialog sfd = new SaveFileDialog())
sfd.DefaultExt = "txt";
sfd.Filter = "文本文件(*.txt)|*.txt|所有文件(*.*)|*.*";
if (sfd.ShowDialog(this) != DialogResult.OK)
byte[] fileData = new byte[readLen - 1];
Buffer.BlockCopy(data, 1, fileData, 0, readLen - 1);
File.WriteAllBytes(sfd.FileName, fileData);
AppendTextToTxtLog(string.Format("接收到文件,已保存到{0}", sfd.FileName));
}下面是发送消息的代码(和服务端的基本差不多) private void btnSend_Click(object sender, EventArgs e)
// AppendTextToTxtLog("123");
if (ClientSocket==null)
if (ClientSocket.Connected)
byte[] data = Encoding.Default.GetBytes(txtSendMsg.Text);
ClientSocket.Send(data, 0, data.Length, SocketFlags.None);
下面是客户端的整体代码
using System.Collections.G
using System.ComponentM
using System.D
using System.D
using System.IO;
using System.L
using System.N
using System.Net.S
using System.T
using System.T
using System.Threading.T
using System.Windows.F
namespace SocketClient
public partial class Mianfrm : Form
public Mianfrm()
InitializeComponent();
//Control.CheckForIllegalCrossThreadCalls =
public Socket ClientSocket {
private void btnConnect_Click(object sender, EventArgs e)
Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
ClientSocket =
socket.Connect(IPAddress.Parse(txtIP.Text), int.Parse(txtPort.Text));
catch (Exception ex)
MessageBox.Show("Bad");
AppendTextToTxtLog(string.Format("服务端{0}已连接",ClientSocket.RemoteEndPoint.ToString()));
Thread thread = new Thread(new ParameterizedThreadStart(ReceiveData));
thread.IsBackground =
thread.Start(ClientSocket);
public void ReceiveData(object obj)
Socket proxSocket = obj as S
byte[] data = new byte[1024 * 1024];
while (true)
int readLen = 0;
readLen = proxSocket.Receive(data, 0, data.Length, SocketFlags.None);
catch (Exception)
//异常退出时
AppendTextToTxtLog(string.Format("服务端{0}非正常退出", proxSocket.RemoteEndPoint.ToString()));
StopConnetct();
if (readLen &= 0)
//客户端正常退出
AppendTextToTxtLog(string.Format("服务端:{0}正常退出", proxSocket.RemoteEndPoint.ToString()));
StopConnetct();
//方法结束-&终结当前接受客户端数据的异步线程
//接受的数据中第一个字节如果是1,那么是字符串.2是闪屏.3是文件
if (data[0]==1)
string strMsg = ProcessRecieveString(data, readLen);
AppendTextToTxtLog(string.Format("接收到服务端{0}的消息{1}", proxSocket.RemoteEndPoint.ToString(), strMsg));
else if (data[0] == 2)
ProcessRecieveShake();
else if (data[0]==3)
ProcessRecieveFile(data, readLen);
public string ProcessRecieveString(byte[] data,int readLen)
string str = Encoding.Default.GetString(data, 1, readLen);
public void ProcessRecieveShake()
Point oldLocation = this.L
Random r = new Random();
if (this.InvokeRequired)
txtLog.BeginInvoke(new Action&Point,Random&(Shake),oldLocation,r);
Shake(oldLocation, r);
private void Shake(Point oldLocation, Random r)
for (int i = 0; i & 50; i++)
this.Location = new Point(r.Next(oldLocation.X - 5, oldLocation.X + 5), r.Next(oldLocation.Y - 5, oldLocation.Y + 5));
Thread.Sleep(50);
this.Location = oldL
public void ProcessRecieveFile(byte[] data,int readLen)
using (SaveFileDialog sfd = new SaveFileDialog())
sfd.DefaultExt = "txt";
sfd.Filter = "文本文件(*.txt)|*.txt|所有文件(*.*)|*.*";
if (sfd.ShowDialog(this) != DialogResult.OK)
byte[] fileData = new byte[readLen - 1];
Buffer.BlockCopy(data, 1, fileData, 0, readLen - 1);
File.WriteAllBytes(sfd.FileName, fileData);
AppendTextToTxtLog(string.Format("接收到文件,已保存到{0}", sfd.FileName));
public void AppendTextToTxtLog(string txt)
if (txtLog.InvokeRequired)
txtLog.BeginInvoke(new Action&string&(s =&{this.txtLog.Text = String.Format("{0}\r\n{1}", s, txtLog.Text);}), txt);
this.txtLog.Text = string.Format("{0}\r\n{1}", txt, txtLog.Text);
private void btnSend_Click(object sender, EventArgs e)
// AppendTextToTxtLog("123");
if (ClientSocket==null)
if (ClientSocket.Connected)
byte[] data = Encoding.Default.GetBytes(txtSendMsg.Text);
ClientSocket.Send(data, 0, data.Length, SocketFlags.None);
private void StopConnetct()
if (ClientSocket.Connected)
ClientSocket.Shutdown(SocketShutdown.Both);
ClientSocket.Close(100);
catch (Exception ex)
private void Mianfrm_FormClosing(object sender, FormClosingEventArgs e)
StopConnetct();
private void Mianfrm_Load(object sender, EventArgs e)
AppendTextToTxtLog("请单击连接到服务器");
最后是软件的界面,
C# Socket简单例子(服务器与客户端通信)
C#使用Socket发送和接收TCP数据示例
Java Socket接收和发送(字符串)
1.Socket网络编程之传递字符类型(图解与编码)
【iOS】Socket/TCP 通信 发送 NSString 字符串格式数据
SOCKET数据传输用字符串加结束符
socket简单通信编程 发送字符串
【Android】socket client发送一个字符串
使用Socket类接收和发送数据
没有更多推荐了,

我要回帖

更多关于 邮箱可以不通过第三方客户端登陆吗 的文章

 

随机推荐