C# socket beginAccept
服务端:
需要增加的命名空间:
using System.Threading;
using System.Net;
using System.Net.Sockets;
以下是具体实现。
C# code复制代码
namespace TCPServer
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public bool btnstatu = true; //开始停止服务按钮状态
public Thread myThread; //声明一个线程实例
public Socket newsock; //声明一个Socket实例
public Socket Client;
public IPEndPoint localEP;
public int localPort;
public bool m_Listening;
//用来设置服务端监听的端口号
public int setPort
{
get { return localPort; }
set { localPort = value; }
}
//用来往richtextbox框中显示消息
public void showClientMsg(string msg)
{
showClientMsg(msg+"\r\n");
}
//监听函数
public void Listen()
{ //设置端口
setPort=int.Parse(serverport.Text.Trim());
//初始化SOCKET实例
newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//初始化终结点实例
localEP=new IPEndPoint(IPAddress.Any,setPort);
try
{
//绑定
newsock.Bind(localEP);
//监听
newsock.Listen(10);
//用于设置按钮状态
m_Listening = true;
//开始接受连接,异步。
newsock.BeginAccept(new AsyncCallback(OnConnectRequest), newsock);
}
catch (Exception ex)
{
showClientMsg(ex.Message);
}
}
//当有客户端连接时的处理
public void OnConnectRequest(IAsyncResult ar)
{
//初始化一个SOCKET,用于其它客户端的连接
Socket server1 = (Socket)ar.AsyncState;
Client = server1.EndAccept(ar);
//将要发送给连接上来的客户端的提示字符串
string strDateLine = "Welcome here";
Byte[] byteDateLine = System.Text.Encoding.ASCII.GetBytes(strDateLine);
//将提示信息发送给客户端
Client.Send(byteDateLine, byteDateLine.Length, 0);
//等待新的客户端连接
server1.BeginAccept(new AsyncCallback(OnConnectRequest), server1);
while (true)
{
int recv = Client.Receive(byteDateLine);
string stringdata = Encoding.ASCII.GetString(byteDateLine, 0, recv);
DateTimeOffset now = DateTimeOffset.Now;
//获取客户端的IP和端口
string ip = Client.RemoteEndPoint.ToString();
if (stringdata == "STOP")
{
//当客户端终止连接时
showinfo.AppendText(ip+"已从服务器断开");
break;
}
//显示客户端发送过来的信息
showinfo.AppendText(ip + " " + now.ToString("G") + " " + stringdata + "\r\n");
}
}
//开始停止服务按钮
private void startService_Click(object sender, EventArgs e)
{
//新建一个委托线程
ThreadStart myThreadDelegate = new ThreadStart(Listen);
//实例化新线程
myThread = new Thread(myThreadDelegate);
if (btnstatu)
{
myThread.Start();
statuBar.Text = "服务已启动,等待客户端连接";
btnstatu = false;
startService.Text = "停止服务";
}
else
{
//停止服务(功能还有问题,无法停止)
m_Listening = false;
newsock.Close();
myThread.Abort();
showClientMsg("服务器停止服务");
btnstatu = true;
startService.Text = "开始服务";
statuBar.Text = "服务已停止";
m_Listening = false;
}
}
//窗口关闭时中止线程。
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (myThread != null)
{
myThread.Abort();
}
}
}
}
客户端:
C# code复制代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace TCPClient
{
public partial class Form1 : Form
{
public Socket newclient;
public bool Connected;
public Thread myThread;
public delegate void MyInvoke(string str);
public Form1()
{
InitializeComponent();
}
public void Connect()
{
byte[] data = new byte[1024];
newclient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
string ipadd = serverIP.Text.Trim();
int port = Convert.ToInt32(serverPort.Text.Trim());
IPEndPoint ie = new IPEndPoint(IPAddress.Parse(ipadd), port);
try
{
newclient.Connect(ie);
connect.Enabled = false;
Connected = true;
}
catch(SocketException e)
{
MessageBox.Show("连接服务器失败 "+e.Message);
return;
}
ThreadStart myThreaddelegate = new ThreadStart(ReceiveMsg);
myThread = new Thread(myThreaddelegate);
myThread.Start();
}
public void ReceiveMsg()
{
while (true)
{
byte[] data = new byte[1024];
int recv = newclient.Receive(data);
string stringdata = Encoding.UTF8.GetString(data, 0, recv);
showMsg(stringdata + "\r\n");
//receiveMsg.AppendText(stringdata + "\r\n");
}
}
public void showMsg(string msg)
{
{
//在线程里以安全方式调用控件
if (receiveMsg.InvokeRequired)
{
MyInvoke _myinvoke = new MyInvoke(showMsg);
receiveMsg.Invoke(_myinvoke, new object[] { msg });
}
else
{
receiveMsg.AppendText(msg);
}
}
}
private void SendMsg_Click(object sender, EventArgs e)
{
int m_length = mymessage.Text.Length;
byte[] data=new byte[m_length];
data = Encoding.UTF8.GetBytes(mymessage.Text);
int i = newclient.Send(data);
showMsg("我说:" + mymessage.Text + "\r\n");
//receiveMsg.AppendText("我说:"+mymessage.Text + "\r\n");
mymessage.Text = "";
//newclient.Shutdown(SocketShutdown.Both);
}
private void connect_Click(object sender, EventArgs e)
{
Connect();
}
}来自于:http://hi.baidu.com/wuyunju/item/006610520eb58e968c12eda0
C# socket beginAccept的更多相关文章
- C#中使用Socket实现简单Web服务器
上一篇博客中介绍了怎样使用socket访问web服务器.关键有两个: 熟悉Socket编程: 熟悉HTTP协议. 上一篇主要是通过socket来模拟浏览器向(任何)Web服务器发送(HTTP)请求,重 ...
- C#中使用Socket请求Web服务器过程
最开始我们需要明白一件事情,因为这是这篇文章的前提: HTTP协议只是一个应用层协议,它底层是通过TCP进行传输数据的.因此,浏览器访问Web服务器的过程必须先有“连接建立”的发生. 而有人或许会问: ...
- Socket实现异步通信
private static void RecVing(IAsyncResult Result) { //通过 result 获取socket.在这个socket上你启动了BeginAccep ...
- 详谈socket请求Web服务器过程
最开始我们需要明白一件事情,因为这是这篇文章的前提: HTTP协议只是一个应用层协议,它底层是通过TCP进行传输数据的.因此,浏览器访问Web服务器的过程必须先有“连接建立”的发生. 而有人或许会问: ...
- 以C#编写的Socket服务器的Android手机聊天室Demo
内容摘要 1.程序架构 2.通信协议 3.服务器源代码 4.客户端源代码 5.运行效果 一.程序架构 在开发一个聊天室程序时,我们可以使用Socket.Remoting.WCF这些具有双向通信的协议或 ...
- Socket异步通信学习二
接下来是服务器部分,采用异步模式,新建了一个AsynServer类,用于存放socket服务器代码,主要有4个方法: 有一个全局socket,下面四个方法中都用到. Socket socket = n ...
- .net平台下socket异步通讯
1,首先添加两个windows窗体项目,一个作为服务端server,一个作为客户端Client 2,然后添加服务端代码,添加命名空间,界面上添加TextBox控件 using System.Net; ...
- 一个Socket数据处理模型
Socket编程中,如何高效地接收和处理数据,这里介绍一个简单的编程模型. Socket索引 - SocketId 在给出编程模型之前,先提这样一个问题,程序中如何描述Socket连接? 为什么这么问 ...
- 利用Socket实现的两个程序的通信
写的也很简单,自己觉得挺有意思了 程序如图 主要代码 public class Message { Form1 mainfrom = null; public Message() { } public ...
随机推荐
- Zabbix钉钉小机器人报警
1.下载钉钉所需要的脚本golang-zabbix-robot-64,浏览器访问https://www.appgao.com/files/192.html: 图一 脚本下载 2.将脚本路径添加到 ...
- 学习参考《零基础入门学习Python》电子书PDF+笔记+课后题及答案
国内编写的关于python入门的书,初学者可以看看. 参考: <零基础入门学习Python>电子书PDF+笔记+课后题及答案 Python3入门必备; 小甲鱼手把手教授Python; 包含 ...
- Android中Service的一个Demo例子
Android中Service的一个Demo例子 Service组件是Android系统重要的一部分,网上看了代码,很简单,但要想熟练使用还是需要Coding. 本文,主要贴代码,不对Servic ...
- linux 查看tomcat 实时日志
进入tomcat下logs文件夹下,若没有Catalina.out文件先去启动服务在回到logs文件夹输入 tail -f catalina.out ,可看到实时日志
- IDEA 热启动,每次更改代码后不用重启服务
1.ctrl+Shift+Alt+/,选择Registry 2.勾选 compiler.automake.allow.when.app.running(可能不按首字母排序,可以多找找) 3.Setti ...
- ctags 寻找方法定义处
ctags这个是vim的一个插件,它可以用来生成一个检索文件,里面保存有一些索引信息.例如,一些类跟方法.变量等的定义位置当我们对一个路径执行ctags -R的时候,就会自动生成一个ctags,然后我 ...
- html --- rem 媒体查询
rem是一种相对长度单位,参考的基准是<html>标签定义的font-size. viewport 做移动端的h5,通常会在HTML文件中指定一个<meta>标签: <m ...
- #学习笔记#——JavaScript 数组部分编程(六)
14. 题目描述 实现一个打点计时器,要求 1.从 start 到 end(包含 start 和 end),每隔 100 毫秒 console.log 一个数字,每次数字增幅为 1 2.返回的对象中需 ...
- GridView1.DataKeys[e.RowIndex].Value 是什么含义?
https://zhidao.baidu.com/question/88518619.html举个例子来说吧 你将一个student表绑定到grid上 这个表里有一些字段 包括id 姓名 学号 等等等 ...
- 玲珑学院 1014 Absolute Defeat
SAMPLE INPUT 3 2 2 2 1 1 5 1 4 1 2 3 4 5 4 10 3 1 2 3 4 SAMPLE OUTPUT 1 0 15 前缀和,每个元素都判断一下. #include ...