我快被SOCKET折磨死了,大家帮我看一下C#代码吧(简洁易懂)

润雨腊八 2013-10-03 09:41:26
服务器:

//不解释,跳过
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.IO;
using System.Threading;



namespace Socket_Programing_Test
{

public partial class Form1 : Form
{
//声明变量,tcpclient,端口和委托
TcpListener tcplistener;
int port;
delegate void AppendStringDelegate(string str);
AppendStringDelegate appendstringdelegate;


public Form1()
{
InitializeComponent();
appendstringdelegate = new AppendStringDelegate(AppendString);
}

private void button建立连接_Click(object sender, EventArgs e)
{
//从textbox1中获取端口
port = Convert.ToInt32(textBox1.Text);
try
{
tcplistener = new TcpListener(IPAddress.Any,port);
tcplistener.Start();
}
catch(Exception ex)
{
listBox1.Items.Add("失败");
listBox1.Items.Add(ex.Message);
return;
}
//建立新的线程用于获取客户端请求信息
ThreadStart ts = new ThreadStart(Listenclientconnect);
Thread mythread = new Thread(ts);
mythread.Start();

listBox1.Items.Add("成功");

}

private void Listenclientconnect()
{

while (true)
{
TcpClient newclient;
try
{
newclient = tcplistener.AcceptTcpClient();
}
catch
{
break;
}

ParameterizedThreadStart pts = new ParameterizedThreadStart(ReceiveData);
Thread receivethread = new Thread(pts);
receivethread.Start(newclient);
}
}

private void ReceiveData(object obj)
{

TcpClient client= (TcpClient)obj;
NetworkStream networkstream =client.GetStream();
StreamReader sr=new StreamReader(networkstream);
bool exit=false;
while(exit==false)
{
string receivestring = null;
try
{
receivestring = sr.ReadLine();
}
catch
{
return;
}

switch(receivestring)
{

case "Login" :
listBox1.Invoke(appendstringdelegate,"一位用户已进入");
break;
case "Logout" :
listBox1.Invoke(appendstringdelegate,"一位用户离开");
break;
default:
break;
}
client.Close();
}
}

private void button2_Click_1(object sender, EventArgs e)//关闭tcplistener
{

tcplistener.Stop();

listBox1.Items.Add("成功关闭");
}

private void AppendString(string str)
{
listBox1.Items.Add(str);

}

}
}

服务器运行正常,可以建立并且监听,问题出在客户端无法通过广域网连接服务器(但输入局域网IP却可以)!!!

客户端代码:

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.IO;
using System.Threading;



namespace Socket_Programing_Test__client_
{
public partial class Form1 : Form
{
TcpClient tcpclient;
IPAddress Serverip;
int port;

public Form1()
{
InitializeComponent();

}
private void Form1_Load(object sender, EventArgs e)
{
listBox1.Items.Clear();
}

private void button1_Click(object sender, EventArgs e)
{
port = Convert.ToInt32(textBox2.Text);

IPAddress[] ip1 = Dns.GetHostAddresses( textBox1.Text);
Serverip = ip1[0];
IPEndPoint ipep=new IPEndPoint(serverip,port);

try
{
tcpclient = new TcpClient();
tcpclient.Connect(ipep);
}
catch(Exception ex)//如果输入广域网IP,抛出异常:“由于目标计算机积极拒绝,无法连接”
{
listBox1.Items.Add("连接服务器失败");
listBox1.Items.Add(ex.Message);
return;
}
listBox1.Items.Add("连接成功");
}
}
}

如果客户端输入服务器的局域网IP,连接成功,但输入广域网IP,抛出异常:“由于目标计算机积极拒绝,无法连接”,我代码有问题么?
...全文
232 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
润雨腊八 2013-10-03
  • 打赏
  • 举报
回复
引用 2 楼 wzn721721 的回复:
是不是防火墙设置问题? 看看你的服务器的局域网和广域网都是怎么连接上的 单网卡还是双网卡 使用ping命令测试看看广域网ip可否ping通 至于端口占用估计不太可能
恩,你说了我还真想起来了,我家有两个路由器,一个是黑的,电信装的,一个是白的,自己家的!猫先进入黑的,然后再进入白的。我可以进入白的设置,但是无法进入黑的,因为里面有密码,这个密码由电信的人掌管。我是不是一定要设置黑的才可以成功连接广域网? 那我现在访问internet时怎么实现的?怎么就是socket不可以访问我自己的电脑?
mnxm 2013-10-03
  • 打赏
  • 举报
回复
是不是防火墙设置问题? 看看你的服务器的局域网和广域网都是怎么连接上的 单网卡还是双网卡 使用ping命令测试看看广域网ip可否ping通 至于端口占用估计不太可能
jt9079 2013-10-03
  • 打赏
  • 举报
回复
恭喜楼主解决问题了。。。。
mnxm 2013-10-03
  • 打赏
  • 举报
回复
恭喜了。。。
润雨腊八 2013-10-03
  • 打赏
  • 举报
回复
哈哈,我终于成功啦!!!!!!!!!!!!!!!!!!!!!!!! 无法用言语来表达我目前的心情,爽!!!!!! 也给广大同胞分享一下经验:是双路由器问题,我把一个路由器拔了,然后在连接上的路由器设置虚拟服务器,然后就OK了,很简单很简单,我却连续兜了四天的圈子,哎!!!!!!
weboscar 2013-10-03
  • 打赏
  • 举报
回复
是不是跟这有关系呢! Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); http://msdn.microsoft.com/zh-tw/library/system.net.sockets.protocoltype.aspx

110,536

社区成员

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

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

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