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 ...
随机推荐
- UTC时间 GMT时间 本地时间 北京时间 时区 夏令时简要说明
1.UTC时间 与 GMT时间 整个地球分为二十四时区,每个时区都有自己的本地时间.为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal Time Coordinated). ...
- java.sql.SQLException:错误 The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone.
错误 方法 添加后面的内容即可
- 第四次python作业——叶耀宗
设计题2: 1.参考“三国演义”词频统计程序,实现对红楼梦出场人物的频次统计.2.(可选)将红楼梦出场人物的频次统计结果用词云显示. import jieba excludes = {"什么 ...
- 紫书 习题 10-21 UVa 1649 (组合数)
C(n, k) = m, 固定k,枚举k 这里用到了组合数的一个性质 当k固定的时候,C(2 * k, k) 最小 C(m, k)最大(对于这道题而言是这样,因为大于m 就最终答案不可能为m了) 所以 ...
- QQ,新浪,SNS等公众平台的登录及api操作
QQ的写法地址:http://www.oschina.net/code/snippet_930167_19888 Sina的写法地址:http://www.oschina.net/code/snipp ...
- 记VS2008初始化Microsoft Visual Sourcesafe源码管理提供程序时失败
之前vs2008开发一直都好好,不知道为什么如今的vs2008打开和关闭都老是弹出这这个初始化Microsoft Visual Sourcesafe源码管理提供程序时失败的错误 解决方法非常easy: ...
- java中TCP传输协议
class TcpClient { public static void main(String[] args) throws Exception { //创建client的socket服务,指定目的 ...
- C#加减乘除
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- #学习记录#——CSS content 属性
CSS content 属性常结合:before 和:after 这两个伪类一起使用,给指定的元素添加内容来丰富页面. 1. 添加文本内容 html: <h1>给末尾添加内容. </ ...
- VS中创建自定义一个VC工程为基础的开发向导的总结
作者:朱金灿 来源:http://blog.csdn.net/clever101 VS允许用户进行自定义开发向导.自定义开发向导的好处在于将常用的设置都通过向导生成,从而大大提供开发效率.特别是在开发 ...