最近朋友建议我写一些关于微软云技术的博客留给学校下一届的学生们看,怕下一届的MSTC断档。于是我也觉的有这个必要。写了几篇博客之后,我觉得也有必要把这一年的学习内容放在博客做个纪念,就这样写了本篇博客。
该程序可以在公共网络上运行,只要输入服务器的IP地址即可。
程序不是很难,由于时间过了一年多了,现在也不好详细讲解了。就贴一下代码,程序还是很容易理解的,看英文单词就知道代码的意思了。
服务器代码在:http://blog.csdn.net/arsenal1109389480/article/details/12399803
第一步:建一个Winform程序
第二步:添加一个类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
namespace Client
{
class ReadObject
{
public NetworkStream netStream;
public byte[] bytes;
public ReadObject(NetworkStream netStream, int bufferSize)
{
this.netStream = netStream;
bytes = new byte[bufferSize];
}
}
}
第三步:客户端代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace Client
{
public partial class Client : Form
{
private bool isExit = false;
private TcpClient client;
private NetworkStream networkStream;
private EventWaitHandle allDone =
new EventWaitHandle(false, EventResetMode.ManualReset);
private delegate void SetRichtextBoxRecieve(string str);
SetRichtextBoxRecieve setrichtextboxrecieve;
private delegate void SetRichtextBoxSend(string str);
SetRichtextBoxSend setrichtextboxsend;
private delegate void SetRichtextBoxStatus(string str);
SetRichtextBoxStatus setrichtextboxstatu;
public Client()
{
InitializeComponent();
buttonStart.Enabled = true;
buttonSend.Enabled = false;
buttonStop.Enabled = true;
setrichtextboxrecieve = new SetRichtextBoxRecieve(RecieceRichtextBox);
setrichtextboxsend = new SetRichtextBoxSend(SendRichtextBox);
setrichtextboxstatu = new SetRichtextBoxStatus(StatuRichtextBox);
}
private void buttonStart_Click(object sender, EventArgs e)
{
client = new TcpClient(AddressFamily.InterNetwork);
AsyncCallback requestCallback = new AsyncCallback(RequestCallback);
allDone.Reset();
client.BeginConnect(textBoxIP.Text, Convert.ToInt32(textBoxPort.Text), requestCallback, client);
richTextBoxStatu.Invoke(setrichtextboxstatu, string.Format("本机EndPoint:{0}",
client.Client.LocalEndPoint));
richTextBoxStatu.Invoke(setrichtextboxstatu, "开始与服务器建立连接");
allDone.WaitOne();
buttonSend.Enabled = true;
buttonStart.Enabled = false;
buttonStop.Enabled = true;
}
private void RequestCallback(IAsyncResult ar)
{
allDone.Set();
try
{
client = (TcpClient)ar.AsyncState;
client.EndConnect(ar);
richTextBoxStatu.Invoke(setrichtextboxstatu,
string.Format("与服务器{0}连接成功", client.Client.RemoteEndPoint));
networkStream = client.GetStream();
ReadObject readobject =
new ReadObject(networkStream, client.ReceiveBufferSize);
networkStream.BeginRead(readobject.bytes,
0, readobject.bytes.Length, ReadCallback, readobject);
}
catch (Exception err)
{
MessageBox.Show(err.Message);
}
}
private void ReadCallback(IAsyncResult ar)
{
try
{
ReadObject readobject = (ReadObject)ar.AsyncState;
int count = readobject.netStream.EndRead(ar);
richTextBoxRecieve.Invoke(setrichtextboxrecieve,
System.Text.Encoding.UTF8.GetString(readobject.bytes, 0, count));
if (isExit == false)
{
//重新调用BeginRead进行异步读取
readobject = new ReadObject(networkStream, client.ReceiveBufferSize);
networkStream.BeginRead(readobject.bytes,
0, readobject.bytes.Length, ReadCallback, readobject);
}
}
catch
{
MessageBox.Show("与服务器断开连接!");
}
}
private void SendString(string str)
{
try
{
byte[] bytesData = System.Text.Encoding.UTF8.GetBytes(str);
networkStream.BeginWrite(bytesData,
0, bytesData.Length, new AsyncCallback(SendCallback), networkStream);
networkStream.Flush();
}
catch(Exception err)
{
MessageBox.Show(err.Message);
}
}
private void SendCallback(IAsyncResult ar)
{
try
{
networkStream.EndWrite(ar);
}
catch
{
MessageBox.Show("已断开连接!");
}
}
private void StatuRichtextBox(string str)
{
richTextBoxStatu.AppendText(str+"\r\n");
}
private void SendRichtextBox(string str)
{
richTextBoxSend.AppendText(str + "\r\n");
}
private void RecieceRichtextBox(string str)
{
richTextBoxRecieve.AppendText(str + "\r\n");
}
private void buttonSend_Click(object sender, EventArgs e)
{
SendString(richTextBoxSend.Text);
richTextBoxSend.Clear();
}
private void buttonStop_Click(object sender, EventArgs e)
{
try
{
SendString(textBoxUser.Text + "离开了房间!!");
networkStream.Close();
}
catch (Exception err)
{
MessageBox.Show(err.Message);
}
buttonSend.Enabled = false;
buttonStart.Enabled = true;
buttonStop.Enabled = false;
}
private void Client_FormClosing(object sender, FormClosingEventArgs e)
{
isExit = true;
allDone.Set();
}
private void buttonSend_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyValue == 13)
{
e.Handled = true;
buttonSend_Click(this, null);
}
}
}
}
分享到:
相关推荐
基于TCP的Socket编程服务器和客户端代码
详见:https://blog.csdn.net/weixin_38566632/article/details/124289573 Qt网络编程——TCP 1. 概念 2. 服务器 3. 客户端 4. TCP服务器和客户端互传文件
TCP异步聊天客户端,要求实现私聊和群聊,请求完善并注释。
https://blog.csdn.net/qq_29542611/article/details/86371353 MFC:Socket编程—TCP服务端和多个客户端通信 示例代码
基于TCP网络编程实现代码:客户端与服务器数据通信
网络编程工具支持TCP,UDP,客户端服务端,自动回复,手动回复,定时发送
基于TCP的异步聊天程序看(客户端),里面有全部的程序
自写TCP异步客户端服务端源码有中文注释,已封装成类,可直接调用,数据读取有事件
MFC的TCP套接字客户端程序代码
基于TCP异步编程的聊天程序,包括服务器和客户端两个项目,在VS2008上编译通过。服务器端在监听、接收和发送时都采用异步方式;同样,客户端在连接、接收和发送时也采用异步方式。
网络编程合集 TCP-IP详解 windows Linux UNIX Ace 网络编程 搜索关键字:网络编程 TCP-IP详解 windows Linux UNIX 网络编程1_TCP-IP详解卷1.rar 网络编程2_TCP-IP详解卷2-1.rar 网络编程3_windows网络编程电子书及...
完整版本网络编程 TCP Socket 同步、异步操作,已经在项目中测试,日访问量超16万次,主要为封装的类,可以直接调用,支持星跳包【适合学习和对性能要求较高的开发者】
基于TCP或UDP的客户端与服务器编程网络聊天-课程设计(含课程报告和代码)
tcp 协议下的聊天的工具,支持异步,分为客户端和服务端
C# 写的tcp异步客户端程序 非常实用 C# 写的tcp异步客户端程序 非常实用
异步Socket的Tcp通信客户端主要是与服务器通信,发送信息给服务器机器接收服务器发送的消息
基于linux操作系统下的TCP连接,建立服务端与客户端的,使其通讯。
该资源是基于tcp的异步通讯,不是多线程,实现了一服务器多客户端
TCP服务端和TCP客户端工具软件 .exe直接执行
使用socket类做的一个客户端 一个服务器 可以开启多个客户端来连接服务器,对于刚学习网络编程的人来说是个好的例子 O(∩_∩)O~,在客户端里面还有个按钮叫做一直发送里面是tcp客户端用多线程同步发送1000条数据到...