C#TcpClient客户端怎么在socket同时发送接收时接收

C#&socket中的服务端和客户端发送接受消息
发送和接受消息的端口是需要保持一致的。因为接触的不多,所以只是简单的一个小例子。
这是一个侦听的类
class Listener
& private T
& private TcpL
& public bool listenerRun =
//如果是true表示可以接受连接请求,否则结束程序
& public Listener()
& & & th = new
Thread(new ThreadStart(Listen));//新建一个用于监听的线程
th.Start();//打开新线程
& public void Stop()
th.Abort();//终止进程
& public void Listen()
& & //本地IP地址
& & IPAddress localAddr =
IPAddress.Parse("10.10.10.223");
& & tcpl = new
TcpListener(localAddr, 2020);//在2020端口新建一个TcpListener对象
& & tcpl.Start();
& & Console.WriteLine("started
listening..");
& & while (listenerRun)
& Socket s = tcpl.AcceptSocket();
& string remote =
s.RemoteEndPoint.ToString();
& byte[] stream = new byte[80];
& int i = s.Receive(stream);//接受连接请求的字节流
& //将byte转成string
& string b2s=
System.Text.Encoding.UTF8.GetString(stream);
& Console.WriteLine(b2s);//控制台写下接受到的字符
& & & catch
(System.Security.SecurityException)
& & //如果报错,需要配置防火墙
& & Console.WriteLine("firewall
says no to application");
& & & catch
(Exception)
& & Console.WriteLine("stoped
listening..");
主要是向服务端发送信息
class Sender
& public Sender()
//这里主要是将一个txt中的内容发送给服务器
& & & string
host = "10.10.10.223";//服务端的IP地址
& & & string[]
stream=File.ReadAllLines("..\\2.txt");
& & & int num =
& & TcpClient tcpc = new
TcpClient(host, 2020);
//在2020端口新建一个TcpClient对象
& & NetworkStream tcpStream =
tcpc.GetStream();
& & StreamWriter reqStreamW = new
StreamWriter(tcpStream);
& & for (int ii = 0; ii &
& reqStreamW.Write(stream[ii]);
& Console.WriteLine(stream[ii]);
& reqStreamW.Flush();//发送信息
& & tcpStream.Close();
& & tcpc.Close();
& & & catch
(Exception)
& & Console.WriteLine("connection
refused by target computer");
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。查看:4414|回复:5
//启动服务
void MySocket::StartServer()
DWORD myMainThreadID=::GetCurrentThreadId(); //获取当前线程也就是主线程的ID号
static ThreadP//此处需设置为静态变量
tp.MainThreadID=myMainThreadID;
& & HANDLE hThread = CreateThread(NULL,0,StartAcceptThread,(LPVOID)&tp,0,NULL);//创建新线程
& & CloseHandle(hThread);
//线程的启动函数
DWORD WINAPI MySocket::StartAcceptThread(LPVOID lpData)
ThreadParameter tp=*((ThreadParameter *)lpData);
int nServAddlen&&= sizeof(servAddr);
//初始化套结字动态库
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
MessageBox(NULL,L&网络连接失败&,L&Title(标题)&,MB_OK);
//创建套接字
sHost = socket(AF_INET, SOCK_STREAM, 0);
if(INVALID_SOCKET == sHost)
MessageBox(NULL,L&网络连接失败&,L&Title(标题)&,MB_OK);
cout && &socket failed!& &&
WSACleanup();//释放套接字资源
//设置服务器地址
servAddr.sin_family =AF_INET;
servAddr.sin_addr.s_addr = inet_addr(CLIENT_HOST);
servAddr.sin_port = htons((short)CLIENT_PORT);
& & int sndbuf=0;& && &&&/* Send buffer size */
//在发送数据的时,不执行由系统缓冲区到socket缓冲区的拷贝,以提高程序的性能
setsockopt( sHost, SOL_SOCKET, SO_SNDBUF, ( char * )&sndbuf, sizeof( sndbuf ) );
BOOL bNodelay = TRUE;
setsockopt( sHost, SOL_SOCKET, TCP_NODELAY, ( char* )&bNodelay, sizeof( BOOL ) );
//unsigned long on = 1;&&
// ioctlsocket(sHost, FIONBIO, &on);//将套接字设为非阻塞,on=1为非阻塞,on=0阻塞&&
//连接服务器
retVal=connect(sHost,(LPSOCKADDR)&servAddr, sizeof(servAddr));
if(SOCKET_ERROR == retVal)
cout && &connect failed!& &&
MessageBox(NULL,L&网络连接失败&,L&Title(标题)&,MB_OK);
closesocket(sHost); //关闭套接字
WSACleanup(); //释放套接字资源
isFirst=//连接成功
receiveServerMessage(tp);//循环接收服务端发来的消息
void MySocket:: MessageWillSend()
static ThreadP//此处需设置为静态变量
DWORD myMainThreadID=::GetCurrentThreadId(); //获取当前线程也就是主线程的ID号
ctp.MainThreadID=myMainThreadID;
& & HANDLE hThread = CreateThread(NULL,0,sendMessageThread,(LPVOID)&ctp,0,NULL);//创建新线程
& & CloseHandle(hThread);
//发送数据线程
DWORD WINAPI MySocket:: sendMessageThread(LPVOID lpData)
//判断是否连接成功
if(!isFirst)
MessageBox(NULL,L&网络连接失败&,L&Title(标题)&,MB_OK);
ThreadParameter tp=*((ThreadParameter *)lpData);
EnterCriticalSection(&cs);//加锁
//向服务器发送数据
ZeroMemory(buf, BUF_SIZE);
string pp=MyTool:: UnicodeToUTF8(data);
strcpy(buf,pp.c_str());
ZeroMemory(data, BUF_SIZE);
LeaveCriticalSection(&cs);//解锁
retVal = send(sHost, buf, strlen(buf)+1, 0);
if (SOCKET_ERROR == retVal)
cout && &send failed!& &&
MessageBox(NULL,L&网络连接失败&,L&Title(标题)&,MB_OK);
closesocket(sHost); //关闭套接字
WSACleanup(); //释放套接字资源
//接受数据线程
void receiveServerMessage(ThreadParameter tp)
while(true)
ZeroMemory(bufRecv, BUF_SIZE);
size_t&&len =strlen(bufRecv)+1;
//iResult = recv(sHost, bufRecv, BUF_SIZE, 0);
if (recv(sHost,bufRecv,BUF_SIZE,0) == SOCKET_ERROR){
int & & & & id = WSAGetLastError();
switch (id)
case WSANOTINITIALISED:
printf(&not initialized\n&);
case WSASYSNOTREADY:
printf(&sub sys not ready\n&);
case WSAHOST_NOT_FOUND:
printf(&name server not found\n&);&&
case WSATRY_AGAIN:
printf(&server fail\n&);
case WSANO_RECOVERY:
printf(&no recovery\n&);&&
case WSAEINPROGRESS:
printf(&socket blocked by other prog\n&);
case WSANO_DATA:&&
printf(&no data record\n&);
case WSAEINTR:
printf(&blocking call canciled\n&);
case WSAEPROCLIM:
printf(&limit exceeded\n&);
case WSAEFAULT:
printf(&lpWSAData in startup not valid\n&);
case WSAECONNRESET:
& & & & MessageBox(NULL,L&服务端关闭连接&,L&Title(消息提示)&,MB_OK);
//退出线程
wchar_t&&*& & & & msg=MyTool::UTF8ToUnicode(bufRecv);
wcout.imbue(locale(&chs&));
copyData(msg);
//线程间通讯
if(PostThreadMessage(tp.MainThreadID,WM_PARTY_MSG,0,(LPARAM)bufRecv)==0)
版规,发帖可获2无忧币
你是做成服务的?
会不会是权限的问题
这个是客户端,我都是用的多线程,跟c#做的服务端链接没有问题,但是跟VB做的服务端链接就有问题,要不,服务端收不到,要不等客户端关闭,服务端才能收到,求助啊!
版规,回帖可获2无忧币
那就不清楚了
还能是VB有问题?
你好 请问你这个问题解决了吗
我现在也遇到了这个问题,send的消息服务器接收不到
需要关闭socket 才会接收到
引用:原帖由 xiaotanguoqiang 于
10:25 发表
你好 请问你这个问题解决了吗
我现在也遇到了这个问题,send的消息服务器接收不到
需要关闭socket 才会接收到 是这样的,有个shutdown的系统调用,如果这个是短连接的话 可以发送后就用shutdown告知对方数据已发送完毕。对方的接收就返回了。 否则对方一直在等待发送方的结束标志,所以关闭socket后就收到了。TcpSend窗口用于发送消息,另外写一个用于接收消息的应用程序,消息接受到以后,必须要关闭接收消息的窗口,才能在接收新的消息,不知道怎么能解决这个问题。
发送消息的窗口代码
using Susing System.Collections.GponentMusing System.Dusing System.Dusing System.Tusing System.Windows.Fusing System.Nusing System.Net.Susing System.IO;
namespace TCPSocket{&&& public partial class FrmTcpSend : Form&&& {&&&&&&& public FrmTcpSend()&&&&&&& {&&&&&&&&&&& InitializeComponent();&&&&&&& }
&&&&&&& private void buttonSendFile_Click(object sender, EventArgs e)&&&&&&& {&&&&&&&&&& // TcpClient tcpClient = new TcpClient(textBoxHostName.Text, Int32.Parse(textBoxPort.Text));&&&&&&&&&&& TcpClient tcpClient = new TcpClient();&&&&&&&&&&& tcpClient.Connect(IPAddress.Parse(textBoxHostName.Text), Int32.Parse(textBoxPort.Text));
&&&&&&&&&&& NetworkStream ns = tcpClient.GetStream();
&&&&&&&&&&& FileStream fs = File.Open("..\\..\\FrmTcpSend.cs", FileMode.Open);
&&&&&&&&&&& int data = fs.ReadByte();
&&&&&&&&&&& while (data != -1)&&&&&&&&&&& {&&&&&&&&&&&&&&& ns.WriteByte((byte)data);&&&&&&&&&&&&&&& data = fs.ReadByte();&&&&&&&&&&& }
&&&&&&&&&&& fs.Close();&&&&&&&&&&& ns.Close();&&&&&&&&&&& tcpClient.Close();
&&&&&&& private void buttonSendMessage_Click(object sender, EventArgs e)&&&&&&& {&&&&&&&&&&& TcpClient tcpClient = new TcpClient();&&&&&&&&&&& tcpClient.Connect(IPAddress.Parse(textBoxHostName.Text), Int32.Parse(textBoxPort.Text));
&&&&&&&&&&& NetworkStream ns = tcpClient.GetStream();
&&&&&&&&&&& if (ns.CanWrite)&&&&&&&&&&& {&&&&&&&&&&&&&&& Byte[] sendBytes = Encoding.UTF8.GetBytes(textBoxMessage.Text);&&&&&&&&&&&&&&& ns.Write(sendBytes, 0, sendBytes.Length);&&&&&&&&&&& }&&&&&&&&&&& else&&&&&&&&&&& {&&&&&&&&&&&&&&& MessageBox.Show("不能写入数据流", "终止", MessageBoxButtons.OK, MessageBoxIcon.Stop);&&&&&&&&&&&&&&& //Console.WriteLine("You cannot write data to this stream.");&&&&&&&&&&&&&&& tcpClient.Close();
&&&&&&&&&&&&&&& // Closing the tcpClient instance does not close the network stream.&&&&&&&&&&&&&&& ns.Close();&&&&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&& ns.Close();&&&&&&&&&&& tcpClient.Close();
&&&&&&& }&&& }}
接收消息的窗口代码
using Susing System.Collections.GponentMusing System.Dusing System.Dusing System.Tusing System.Windows.Fusing System.Nusing System.Net.Susing System.IO;using System.T
namespace TcpReceive{&&& public partial class Form1 : Form&&& {&&&&&&& public Form1()&&&&&&& {&&&&&&&&&&& InitializeComponent();
&&&&&&&&&&& //Thread thread = new Thread(new ThreadStart(Listen));
&&&&&&&&&&& Thread thread = new Thread(new ThreadStart(SocketListen));
&&&&&&&&&&& thread.Start();
&&&&&&&&&&& IPAddress ipAddress = IPAddress.A //IPAddress.Parse("172.16.102.11");
&&&&&&&&&&& this.Text = ipAddress.ToString()+"正在监听...";
&&&&&&& protected delegate void UpdateDisplayDelegate(string text);
&&&&&&& public void Listen()&&&&&&& {&&&&&&&&&&& IPAddress ipAddress = IPAddress.A //IPAddress.Parse("172.16.102.11");
&&&&&&&&&& &&&&&&&&&&& &&&&&&&&&&& TcpListener tcpListener = new TcpListener(ipAddress,9999);&&&&&&&&&&& tcpListener.Start();
&&&&&&&&&&& TcpClient tcpClient = tcpListener.AcceptTcpClient();
&&&&&&&&&& &&&&&&&&&&& NetworkStream ns = tcpClient.GetStream();
&&&&&&&&&&& StreamReader sr = new StreamReader(ns);
&&&&&&&&&&& string result = sr.ReadToEnd();
&&&&&&&&&&& Invoke(new UpdateDisplayDelegate(UpdateDisplay), new object[] { result });
&&&&&&&&&&& tcpClient.Close();&&&&&&&&&&& tcpListener.Stop();&&&&&&& }
&&&&&&& public void SocketListen()&&&&&&& {&&&&&&&&&&& Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
&&&&&&&&&&& listener.Bind(new IPEndPoint(IPAddress.Any, 9999));
&&&&&&&&&&& listener.Listen(0);
&&&&&&&&&&& Socket socket = listener.Accept();&&&&&&&&&&& Stream netStream = new NetworkStream(socket);&&&&&&&&&&& StreamReader reader = new StreamReader(netStream);
&&&&&&&&&&& string result = reader.ReadToEnd();&&&&&&&&&&& Invoke(new UpdateDisplayDelegate(UpdateDisplay), new object[] { result });
&&&&&&&&&&& socket.Close();&&&&&&&&&&& listener.Close();
&&&&&&& public void UpdateDisplay(string text)&&&&&&& {&&&&&&&&&&& richTextBox1.Text =&&&&&&& }
阅读(...) 评论()2015年3月 总版技术专家分月排行榜第二2014年12月 总版技术专家分月排行榜第二2014年9月 总版技术专家分月排行榜第二
2015年3月 .NET技术大版内专家分月排行榜第一2015年2月 .NET技术大版内专家分月排行榜第一2015年1月 .NET技术大版内专家分月排行榜第一2014年12月 .NET技术大版内专家分月排行榜第一2014年11月 .NET技术大版内专家分月排行榜第一
2015年3月 总版技术专家分月排行榜第二2014年12月 总版技术专家分月排行榜第二2014年9月 总版技术专家分月排行榜第二
2015年3月 .NET技术大版内专家分月排行榜第一2015年2月 .NET技术大版内专家分月排行榜第一2015年1月 .NET技术大版内专家分月排行榜第一2014年12月 .NET技术大版内专家分月排行榜第一2014年11月 .NET技术大版内专家分月排行榜第一
2016年1月 总版技术专家分月排行榜第二2015年11月 总版技术专家分月排行榜第二2015年10月 总版技术专家分月排行榜第二
优秀小版主
2015年3月 总版技术专家分月排行榜第二2014年12月 总版技术专家分月排行榜第二2014年9月 总版技术专家分月排行榜第二
2015年3月 .NET技术大版内专家分月排行榜第一2015年2月 .NET技术大版内专家分月排行榜第一2015年1月 .NET技术大版内专家分月排行榜第一2014年12月 .NET技术大版内专家分月排行榜第一2014年11月 .NET技术大版内专家分月排行榜第一
2015年3月 总版技术专家分月排行榜第二2014年12月 总版技术专家分月排行榜第二2014年9月 总版技术专家分月排行榜第二
2015年3月 .NET技术大版内专家分月排行榜第一2015年2月 .NET技术大版内专家分月排行榜第一2015年1月 .NET技术大版内专家分月排行榜第一2014年12月 .NET技术大版内专家分月排行榜第一2014年11月 .NET技术大版内专家分月排行榜第一
2015年3月 总版技术专家分月排行榜第二2014年12月 总版技术专家分月排行榜第二2014年9月 总版技术专家分月排行榜第二
2015年3月 .NET技术大版内专家分月排行榜第一2015年2月 .NET技术大版内专家分月排行榜第一2015年1月 .NET技术大版内专家分月排行榜第一2014年12月 .NET技术大版内专家分月排行榜第一2014年11月 .NET技术大版内专家分月排行榜第一
2015年3月 总版技术专家分月排行榜第二2014年12月 总版技术专家分月排行榜第二2014年9月 总版技术专家分月排行榜第二
2015年3月 .NET技术大版内专家分月排行榜第一2015年2月 .NET技术大版内专家分月排行榜第一2015年1月 .NET技术大版内专家分月排行榜第一2014年12月 .NET技术大版内专家分月排行榜第一2014年11月 .NET技术大版内专家分月排行榜第一
2017年2月 总版技术专家分月排行榜第三
2017年5月 .NET技术大版内专家分月排行榜第一2017年4月 .NET技术大版内专家分月排行榜第一2017年3月 .NET技术大版内专家分月排行榜第一2017年2月 .NET技术大版内专家分月排行榜第一2016年10月 .NET技术大版内专家分月排行榜第一2016年8月 .NET技术大版内专家分月排行榜第一2016年7月 .NET技术大版内专家分月排行榜第一
2017年2月 总版技术专家分月排行榜第三
2017年5月 .NET技术大版内专家分月排行榜第一2017年4月 .NET技术大版内专家分月排行榜第一2017年3月 .NET技术大版内专家分月排行榜第一2017年2月 .NET技术大版内专家分月排行榜第一2016年10月 .NET技术大版内专家分月排行榜第一2016年8月 .NET技术大版内专家分月排行榜第一2016年7月 .NET技术大版内专家分月排行榜第一
2017年2月 总版技术专家分月排行榜第三
2017年5月 .NET技术大版内专家分月排行榜第一2017年4月 .NET技术大版内专家分月排行榜第一2017年3月 .NET技术大版内专家分月排行榜第一2017年2月 .NET技术大版内专家分月排行榜第一2016年10月 .NET技术大版内专家分月排行榜第一2016年8月 .NET技术大版内专家分月排行榜第一2016年7月 .NET技术大版内专家分月排行榜第一
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 netty 客户端发送数据 的文章

 

随机推荐