对于C# socket通信的疑问,没有接收到远端数据

沧海1梦 2017-03-17 08:22:31
只有一个客户端代码,不知道服务器地址,在本地安装了Oracle 10g,然后可以连接(原来默认端口为2323,我的电脑没有,使用了1521),但是在“ int bytesRead = client.EndReceive(ar);//从远端设备读取数据,此处没有读到信息”bytesRead 值为0,希望有对socket这块熟悉的人帮忙看下,谢谢!
 /// <summary>
#region 私有成员变量
private static ILog log = LogManager.GetLogger(typeof(Frmain));
//private static int port = 2323;
private static int port = 1521;
private static ManualResetEvent receiveDone = new ManualResetEvent(false);
private static Thread ReviceThread;
private static Thread KeepAliveThread;
private static object obj = new object();
private static string MessageSN = "0";
private static IPAddress ipAddress;
string str = "192.168.96.1";
string str_ip;
#endregion
#region 公有成员变量
public static DateTime tempDate = DateTime.Now;
public static Socket client;
public static bool isNeedAlive = true;
StateObject state = new StateObject();
#endregion
public Frmain()
{
InitializeComponent();
StartClient();
}
/// <summary>
/// 启动客户端
/// </summary>
private void StartClient()
{
try
{
ipAddress = IPAddress.Parse(str);
ConnnectServer();
StartSendServer();
RunReceive();
// RunKeepAlive();

}
catch (Exception e)
{

MessageBox.Show(e.Message );
log.Error(e.Message.ToString());
str_ip = string.Empty;

}
}
/// <summary>0
/// 连接服务器
/// </summary>
public void ConnnectServer()
{
try
{
IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);//定义主机对象
client = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
client.BeginConnect(remoteEP,new AsyncCallback(ConnectCallback), client);

}
catch (Exception e)
{
log.Error(e.Message.ToString());
}
}

……
/// 接受服务回调
/// </summary>
private void ReceiveCallback(IAsyncResult ar)
{
StateObject state = (StateObject)ar.AsyncState;//从输入参数异步state对象中获取state和socket对象
Socket handler = state.workSocket;
try
{

int bytesRead = client.EndReceive(ar);//从远端设备读取数据,此处没有读到信息
if (bytesRead > 0)
{
AnalysisData(Encoding.Default.GetString(state.buffer, 0, bytesRead), handler);
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
}

}
catch (Exception e)
{
// Console.WriteLine(e.ToString());
// MessageBox.Show(e.Message);
if (handler.Connected)
{
handler.Shutdown(SocketShutdown.Both);
handler.BeginDisconnect(false, new AsyncCallback(BeginDisconnectCallback), state);
}
log.Error(e.Message.ToString());
}
}
/// <summary>
/// 接受断开回调
/// </summary>
private static void BeginDisconnectCallback(IAsyncResult ar)//接收来自服务端的返回确认信息
{
try
{
StateObject state = (StateObject)ar.AsyncState;
state.workSocket.EndDisconnect(ar);
}
catch
{
Socket socket = (Socket)ar.AsyncState;
socket.EndDisconnect(ar);
}

}

private void AnalysisData(string recv, Socket handler)
{
try
{
//Control.CheckForIllegalCrossThreadCalls = false;
// AlertCustom alert = new AlertCustom(recv);
// alert.Show();
// Thread secondThread = new Thread(alert.Show);
// secondThread.Start();
this.Invoke(new ThreadStart(delegate()
{
AlertCustom alert = new AlertCustom(recv);
alert.CaptionText = "即时信息平台";
alert.Show(this);

}));


// MessageBox.Show(recv);
}
catch (Exception e)
{
log.Error(e.Message.ToString());
}
finally
{
// Dispose();
}

}
...全文
198 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
amlove 2017-03-17
  • 打赏
  • 举报
回复
找个 socket 工具, 链接服务器, 测试 是否有数据。
  • 打赏
  • 举报
回复
你写的这个socket通信比我之前写的复杂
shoppo0505 2017-03-17
  • 打赏
  • 举报
回复
对方服务器根本就没有发送给你数据吧.
小左南京 2017-03-17
  • 打赏
  • 举报
回复
不用服务器,你总得有一个能够收发的小软件吧。。。不然你这不就是盲人摸象嘛
沧海1梦 2017-03-17
  • 打赏
  • 举报
回复
引用 9 楼 zuoshengting 的回复:
我还是比较奇怪,为什么不直接用TCP——client,然后异步接受,放入blockingcollection再读取呢?
你是说直接用TCPClient类来实现么,这个不知道,可能当时候做的时候因为某些原因吧。我想问的就是,我只有客户端程序,没有服务端的程序,该怎么收发信息呢?
小左南京 2017-03-17
  • 打赏
  • 举报
回复
我还是比较奇怪,为什么不直接用TCP——client,然后异步接受,放入blockingcollection再读取呢?
沧海1梦 2017-03-17
  • 打赏
  • 举报
回复
引用 6 楼 xian_wwq 的回复:
如果没有设计文档, 确切的说,只有客户端代码是调试不了socket通讯的
只有一个client端代码,以及打包的安装程序,加部署文档,部署文档里说“1、在app.config中找到如下,把host修改为服务器的IP地址, <!--无需安装Oracle客户端连接方式100.182.7;172.16.5.3--> <add key="OracleConnectionString" value="Data Source=(DESCRIPTION =(ADDRESS_LIST= (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.100.155)(PORT = 1521))) (CONNECT_DATA=(SID=ORCL)));User Id=CETC58BAOMI;Password=CETC58BAOMI"/>" 我安装了oracle,后按照这个也是没有成功,而在程序中也没有看到这段代码,我自己手动添加。 2、"输入服务器的IP地址,端口号为2323,点击更改即可。”不论是127.0.0.1还是IP地址,都是没有收到信息。郁闷死了
沧海1梦 2017-03-17
  • 打赏
  • 举报
回复
引用 6 楼 xian_wwq 的回复:
如果没有设计文档,
确切的说,只有客户端代码是调试不了socket通讯的


引用 6 楼 xian_wwq 的回复:
如果没有设计文档,
确切的说,只有客户端代码是调试不了socket通讯的
自己做了一个小例子,发现这个可以收发信息。
xian_wwq 2017-03-17
  • 打赏
  • 举报
回复
如果没有设计文档, 确切的说,只有客户端代码是调试不了socket通讯的
沧海1梦 2017-03-17
  • 打赏
  • 举报
回复
引用 2 楼 qq_36545099 的回复:
你写的这个socket通信比我之前写的复杂
第一次接触,不是我写的,别人说客户端和服务端通信有问题,让我调试,但是只有一个客户端的程序
沧海1梦 2017-03-17
  • 打赏
  • 举报
回复
引用 1 楼 shoppo0505 的回复:
对方服务器根本就没有发送给你数据吧.
引用 1 楼 shoppo0505 的回复:
对方服务器根本就没有发送给你数据吧.
恩,我只有客户端的代码,我是想着把自己的电脑弄成服务器,看能不能收发信息

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧