我在一个类里写了两个方法:
public int Connect(string serverIp, int port)
{
this.serverIp = serverIp;
this.port = port;
//解析服务器地址
System.Net.IPHostEntry ip_HE = System.Net.Dns.GetHostEntry(serverIp);
//指定端口
System.Net.IPEndPoint lep = new System.Net.IPEndPoint(ip_HE.AddressList[0], Convert.ToInt32(port));
///新建socket对象
Socket s;
try
{
s= new Socket(lep.Address.AddressFamily, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
}
catch (Exception e)
{
Console.WriteLine(e.Message.ToString());
return Constant.RetErr;
}
catch
{
return Constant.RetErr;
}
new Thread(new ThreadStart(ReadThread)).Start(); return Constant.RetOK;
}private void ReadThread()
{ while (true)
{
try
{
//byte[] data = udp.Receive(ref remote);
byte[] data = new byte[1024];
line = null;
int count = 0; count = udp.ReceiveFrom(data, ref remote);
//count = udp.Receive(data);
if (count <= 0)
{
break;
}
line = Encoding.GetEncoding("GB2312").GetString(data, 0, count);
Console.WriteLine(line);
if (OnReceived != null)
{
OnReceived(line);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message.ToString());
break;
}
catch
{
Console.WriteLine("chucuo");
break;
}
}
}我在WinFrom里一个Button里如何调用这个线程ReadThread。如何取出这个线程里line 它所获得的字符串。这个系统就像QQ聊天那样,发给服务器一个消息,服务器返还一个消息回来!如果我发完一条消息后,如何收到服务器返回的消息!我十秒钟后在发一条消息如何接收啊!谢谢各位师哥啦!小妹这厢有礼啦~~
public int Connect(string serverIp, int port)
{
this.serverIp = serverIp;
this.port = port;
//解析服务器地址
System.Net.IPHostEntry ip_HE = System.Net.Dns.GetHostEntry(serverIp);
//指定端口
System.Net.IPEndPoint lep = new System.Net.IPEndPoint(ip_HE.AddressList[0], Convert.ToInt32(port));
///新建socket对象
Socket s;
try
{
s= new Socket(lep.Address.AddressFamily, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
}
catch (Exception e)
{
Console.WriteLine(e.Message.ToString());
return Constant.RetErr;
}
catch
{
return Constant.RetErr;
}
new Thread(new ThreadStart(ReadThread)).Start(); return Constant.RetOK;
}private void ReadThread()
{ while (true)
{
try
{
//byte[] data = udp.Receive(ref remote);
byte[] data = new byte[1024];
line = null;
int count = 0; count = udp.ReceiveFrom(data, ref remote);
//count = udp.Receive(data);
if (count <= 0)
{
break;
}
line = Encoding.GetEncoding("GB2312").GetString(data, 0, count);
Console.WriteLine(line);
if (OnReceived != null)
{
OnReceived(line);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message.ToString());
break;
}
catch
{
Console.WriteLine("chucuo");
break;
}
}
}我在WinFrom里一个Button里如何调用这个线程ReadThread。如何取出这个线程里line 它所获得的字符串。这个系统就像QQ聊天那样,发给服务器一个消息,服务器返还一个消息回来!如果我发完一条消息后,如何收到服务器返回的消息!我十秒钟后在发一条消息如何接收啊!谢谢各位师哥啦!小妹这厢有礼啦~~
而且根本没有accpet,怎么建立起连接?
thread.Start();把line定义成公共变量,你爱怎么取都可以,小妹妹知道了不
using System;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;
namespace 客户端
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
try
{
int port = 10000;
string host = "192.168.2.61";
IPAddress ip = IPAddress.Parse(host);
IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和端口转化为IPEndPoint实例
Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket
Console.WriteLine("今天是:"+DateTime.Now.ToLongDateString()+" "+DateTime.Now.ToLongTimeString());
Console.WriteLine("连接服务器,请等待...");
c.Connect(ipe);//连接到服务器
Console.WriteLine("请输入您要发送的指令:");
string sendStr = Console.ReadLine()+"\n";
byte[] bs = Encoding.GetEncoding("GB2312").GetBytes(sendStr);
Console.WriteLine("已经发送您的指令到服务器!");
c.Send(bs, bs.Length, 0);//发送测试信息
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = c.Receive(recvBytes,0);//从服务器端接受返回信息
recvStr += Encoding.GetEncoding("GB2312").GetString(recvBytes, 0, bytes);
Console.WriteLine("客户端端得到的来自服务器的信息:");//显示服务器返回信息
}
catch (ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException: {0}", e);
}
catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
}using System;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;namespace 服务器端
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
try
{
int port = 1000;
string strHostIP="";
IPHostEntry oIPHost=Dns.Resolve(Environment.MachineName);
if(oIPHost.AddressList.Length>0)
{
strHostIP=oIPHost.AddressList[0].ToString();
}
IPAddress ip = IPAddress.Parse(strHostIP);
IPEndPoint ipe = new IPEndPoint(ip, port);
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket类
s.Bind(ipe);//绑定2000端口
s.Listen(0);//开始监听
Console.WriteLine("今天是:"+DateTime.Now.ToLongDateString()+" "+DateTime.Now.ToLongTimeString());
Console.WriteLine("正在等待客户端的连接...");
Socket temp = s.Accept();//为新建连接创建新的Socket。
Console.WriteLine("连接成功");
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = temp.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
recvStr += Encoding.GetEncoding("GB2312").GetString(recvBytes, 0, bytes);
Console.WriteLine("服务器端得到的来自客户端的信息:{0}",recvStr);//把客户端传来的信息显示出来
string sendStr = "你好,客户端!";
byte[] bs = Encoding.GetEncoding("GB2312").GetBytes(sendStr);
temp.Send(bs, bs.Length, 0);//返回客户端成功信息
temp.Close();
s.Close();
}
catch (ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException: {0}", e);
}
catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
}
Console.WriteLine("按任意退出!");
Console.ReadLine();
}
}
}
第三步:创建一个接收字符串缓冲区,当收到数据时就保存到这个缓冲区中,创建线程,仅检查是否接收缓冲区是否有数据,如果有就发一个消息到主窗体,主窗体收到后根据收到的索引号取出数据进行处理,处理结束后将对应接收缓冲区中的数据删除。完成上面三步后在根据不同的业务,实现不现的数据处理方法就可以了。
private void button1_Click(object sender, EventArgs e)
{
this.SendMessage(this.textBox1.Text.Trim());
} public void SendMessage(string msg)
{
try
{
int port = 7908;
string host = "192.168.1.10";
IPAddress ip = IPAddress.Parse(host);
IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和端口转化为IPEndPoint实例
Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket
this.label1.Text="今天是:" + DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToLongTimeString();
this.label2.Text="连接服务器,请等待...";
c.Connect(ipe);//连接到服务器
this.label3.Text="请输入您要发送的指令:";
string sendStr = msg;
byte[] bs = Encoding.GetEncoding("GB2312").GetBytes(sendStr);
this.label4.Text="已经发送您的指令到服务器!";
c.Send(bs, bs.Length, 0);//发送测试信息
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = c.Receive(recvBytes, 0);//从服务器端接受返回信息
recvStr += Encoding.GetEncoding("GB2312").GetString(recvBytes, 0, bytes);
this.label5.Text="客户端端得到的来自服务器的信息:"+recvStr;//显示服务器返回信息
}
catch (ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException: {0}", e);
}
catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
}
}
我给你说了用timer控件了的,你用了吗?
客户端发送消息 服务器端返回消息
例如:第一条 aa 服务器已收到
第二条 bb 您输入的有错误
第三条 cc 您输入的正确现在是我发送第一条aa 的时候能收到 服务器已收到的 消息
第二条我发送bb 的时候,我通过程序收到的消息还是 服务器已收到的 消息
第三条也一样。但是我测试过服务器没问题!
你仔细想想,你在第二次点击客户端的button1发送按钮的时候,服务器端是否再次接收到,如果接收到了,你就要强制调用服务器端的发送程序了。如果服务器端没有收到,那就是另外一回事了
帮我介绍女朋友我就帮你搞定
http://www.xiaopixie.com/web/news.aspx?id=162
客户端
http://www.xiaopixie.com/web/news.aspx?id=163
这个是用来传送文件的,不过差不多
客户端本来是c/s的,被版主硬改成了b/S,晕
客户端连接要用多线程,当接收消息完成后,把消息内容通过事件发送到主线程,
主线程不能直接访问接收线程消息线程的属性和方法
int port = 1000;
string strHostIP="";
IPHostEntry oIPHost=Dns.Resolve(Environment.MachineName);
if(oIPHost.AddressList.Length>0)
{
strHostIP=oIPHost.AddressList[0].ToString();
}
IPAddress ip = IPAddress.Parse(strHostIP);
IPEndPoint ipe = new IPEndPoint(ip, port);
s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket类
s.Bind(ipe);
s.Listen(0);//开始监听
Socket temp = s.Accept();//为新建连接创建新的Socket。
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = temp.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
recvStr += Encoding.GetEncoding("GB2312").GetString(recvBytes, 0, bytes);
string sendStr = "你好!客户"
byte[] bs = Encoding.GetEncoding("GB2312").GetBytes(sendStr);
temp.Send(bs, bs.Length, 0);//返回客户端成功信息
temp.Close();
然后在timer1_Tick事件里写:
Socket temp = s.Accept();//为新建连接创建新的Socket。
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = temp.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
recvStr += Encoding.GetEncoding("GB2312").GetString(recvBytes, 0, bytes);
string sendStr = "你好!客户!"
byte[] bs = Encoding.GetEncoding("GB2312").GetBytes(sendStr);
temp.Send(bs, bs.Length, 0);//返回客户端成功信息
temp.Close();
在客户端加2个全局变量:public Socket c;public string recvStr = "";加一个按钮btnLianjie,Text属性为“连接”,在加一个richTextBox控件,Name属性为“rtbMessage”,在客户端的Load事件了写:
int port = 1000;
string host = "服务器IP";
IPAddress ip = IPAddress.Parse(host);
IPEndPoint ipe = new IPEndPoint(ip, port)
c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket
rtbMessage.Text="连接服务器,请等待..."+"\n";
c.Connect(ipe);//连接到服务器
string sendStr = "你好!服务器";
byte[] bs = Encoding.GetEncoding("GB2312").GetBytes(sendStr);
rtbMessage.Text+="已经发送您的指令到服务器!"+"\n";
c.Send(bs, bs.Length, 0);//发送测试信息
byte[] recvBytes = new byte[1024];
int bytes;
bytes = c.Receive(recvBytes,0);//从服务器端接受返回信息
recvStr += Encoding.GetEncoding("GB2312").GetString(recvBytes, 0, bytes);
rtbMessage.Text+="客户端端得到的来自服务器的信息:"+"\n"+recvStr+"\n";
在客户端的按钮事件btnLianjie_Click里写:
rtbMessage.Text=string.Empty;
byte[] recvBytes = new byte[1024];
int bytes;
bytes = c.Receive(recvBytes,0);//从服务器端接受返回信息
recvStr += Encoding.GetEncoding("GB2312").GetString(recvBytes, 0, bytes);
rtbMessage.Text+="客户端端得到的来自服务器的信息:"+"\n"+recvStr+"\n";
我测试过了的,是正确无误的!
{
rtbMessage.Text = string.Empty;
byte[] recvBytes = new byte[1024];
int bytes;
bytes = c.Receive(recvBytes, 0);//从服务器端接受返回信息
recvStr += Encoding.GetEncoding("GB2312").GetString(recvBytes, 0, bytes);
rtbMessage.Text += "客户端端得到的来自服务器的信息:" + "\n" + recvStr + "\n";
}
private void Form3_Load(object sender, EventArgs e)
{
this.Connection();
}
public void Connection()
{ int port = 7910;
string host = "192.168.1.10";
IPAddress ip = IPAddress.Parse(host);
IPEndPoint ipe = new IPEndPoint(ip, port);
c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket
rtbMessage.Text="连接服务器,请等待..."+"\n";
c.Connect(ipe);//连接到服务器
string sendStr = "你好!服务器";
byte[] bs = Encoding.GetEncoding("GB2312").GetBytes(sendStr);
rtbMessage.Text+="已经发送您的指令到服务器!"+"\n";
c.Send(bs, bs.Length, 0);//发送测试信息
byte[] recvBytes = new byte[1024];
int bytes;
bytes = c.Receive(recvBytes,0);//从服务器端接受返回信息
recvStr += Encoding.GetEncoding("GB2312").GetString(recvBytes, 0, bytes);
rtbMessage.Text+="客户端端得到的来自服务器的信息:"+"\n"+recvStr+"\n"; }照您说的我改了,我们测试服务器那边一般步骤是这样的开始->cmd->telnet 192.168.1.10 7910然后就显示如下格式:
w 0.1.0.0[2005-1-12]
然后我就输入你程序里的消息:你好!服务器
应该返回:x F000003,unkonw command现在我只能接收到w 0.1.0.0[2005-1-12]这条,我想要得到这个结果:x F000003,unkonw command